devise-otp 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +17 -18
  3. data/app/controllers/devise_otp/devise/otp_credentials_controller.rb +15 -19
  4. data/app/controllers/devise_otp/devise/otp_tokens_controller.rb +7 -11
  5. data/app/views/devise/otp_credentials/show.html.erb +1 -1
  6. data/app/views/devise/otp_tokens/_token_secret.html.erb +4 -4
  7. data/app/views/devise/otp_tokens/recovery.html.erb +4 -4
  8. data/app/views/devise/otp_tokens/show.html.erb +5 -5
  9. data/config/locales/en.yml +4 -12
  10. data/devise-otp.gemspec +13 -13
  11. data/lib/devise-otp/version.rb +1 -1
  12. data/lib/devise-otp.rb +15 -29
  13. data/lib/devise_otp_authenticatable/controllers/helpers.rb +21 -23
  14. data/lib/devise_otp_authenticatable/controllers/url_helpers.rb +0 -2
  15. data/lib/devise_otp_authenticatable/engine.rb +6 -4
  16. data/lib/devise_otp_authenticatable/hooks/sessions.rb +4 -5
  17. data/lib/devise_otp_authenticatable/hooks.rb +1 -3
  18. data/lib/devise_otp_authenticatable/models/otp_authenticatable.rb +19 -25
  19. data/lib/devise_otp_authenticatable/routes.rb +11 -14
  20. data/lib/generators/active_record/devise_otp_generator.rb +1 -1
  21. data/lib/generators/devise_otp/devise_otp_generator.rb +12 -13
  22. data/lib/generators/devise_otp/install_generator.rb +3 -4
  23. data/lib/generators/devise_otp/views_generator.rb +5 -5
  24. data/test/dummy/Rakefile +1 -1
  25. data/test/dummy/app/controllers/posts_controller.rb +2 -2
  26. data/test/dummy/app/models/user.rb +8 -8
  27. data/test/dummy/config/application.rb +4 -4
  28. data/test/dummy/config/boot.rb +5 -5
  29. data/test/dummy/config/environment.rb +1 -1
  30. data/test/dummy/config/environments/development.rb +1 -1
  31. data/test/dummy/config/environments/production.rb +1 -1
  32. data/test/dummy/config/environments/test.rb +2 -2
  33. data/test/dummy/config/initializers/devise.rb +6 -8
  34. data/test/dummy/config/initializers/secret_token.rb +2 -2
  35. data/test/dummy/config/initializers/session_store.rb +1 -1
  36. data/test/dummy/config/initializers/wrap_parameters.rb +1 -1
  37. data/test/dummy/config/routes.rb +1 -1
  38. data/test/dummy/config.ru +1 -1
  39. data/test/dummy/db/migrate/20130131092406_add_devise_to_users.rb +12 -13
  40. data/test/dummy/db/migrate/20130131160351_devise_otp_add_to_users.rb +13 -13
  41. data/test/dummy/script/rails +3 -3
  42. data/test/integration/persistence_test.rb +11 -12
  43. data/test/integration/refresh_test.rb +13 -14
  44. data/test/integration/sign_in_test.rb +24 -26
  45. data/test/integration/token_test.rb +5 -6
  46. data/test/integration_tests_helper.rb +16 -17
  47. data/test/model_tests_helper.rb +5 -7
  48. data/test/models/otp_authenticatable_test.rb +18 -19
  49. data/test/test_helper.rb +10 -10
  50. metadata +22 -62
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6fda2423bde851bf5adc44a3d702c2c61ddabf128f2e39cd3bca9098efc582f0
4
- data.tar.gz: 4086a98d52455eaad597ad2afed8dd3bdbae1e07415865a64409cd58c27304e8
3
+ metadata.gz: 40f03e3fee5939da23d1f583390f794a2e4e456a08fd311d53a605e94ba77075
4
+ data.tar.gz: cc3e95dcebf0186cbb7a5f3552184093dc6e2209e421b359c6384f788f8ccaed
5
5
  SHA512:
6
- metadata.gz: aced8c7eba137c8f2851f665c45277044e2b5c7f46fdfec080b506a72f87643ae91b950876c25608d884c63cb6add1fe49df1e19d635656f8e350e13627542f9
7
- data.tar.gz: 7796a7911e786070f7c3bf1f061443448034308ef6203bad52907e9b5faf413f901d446440c2ac632612420fa1fde5d6431f5bc0db5050e1b25938ea1ff5e944
6
+ metadata.gz: a62beac8100a3f98a60b6b19f279d795d1f942dc0b44b5d7ad345527b315363185439630b3df7e34dce8d0c0bb154329b882965f45cabbb50ff1a93c7c7cdb09
7
+ data.tar.gz: 651d1dc15b3444db54eb8e2d14d6273858d2ec66ac7feee0ce314085175d5d3722f7062e914979b2b05a647ba8470a873179d962aadcb0657bcf8bd9bd814c66
data/Rakefile CHANGED
@@ -1,42 +1,41 @@
1
1
  #!/usr/bin/env rake
2
2
  begin
3
- require 'bundler/setup'
3
+ require "bundler/setup"
4
4
  rescue LoadError
5
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ puts "You must `gem install bundler` and `bundle install` to run rake tasks"
6
6
  end
7
7
  begin
8
- require 'rdoc/task'
8
+ require "rdoc/task"
9
9
  rescue LoadError
10
- require 'rdoc/rdoc'
11
- require 'rake/rdoctask'
10
+ require "rdoc/rdoc"
11
+ require "rake/rdoctask"
12
12
  RDoc::Task = Rake::RDocTask
13
13
  end
14
14
 
15
15
  RDoc::Task.new(:rdoc) do |rdoc|
16
- rdoc.rdoc_dir = 'rdoc'
17
- rdoc.title = 'Foobar'
18
- rdoc.options << '--line-numbers'
19
- rdoc.rdoc_files.include('README.rdoc')
20
- rdoc.rdoc_files.include('lib/**/*.rb')
16
+ rdoc.rdoc_dir = "rdoc"
17
+ rdoc.title = "Foobar"
18
+ rdoc.options << "--line-numbers"
19
+ rdoc.rdoc_files.include("README.rdoc")
20
+ rdoc.rdoc_files.include("lib/**/*.rb")
21
21
  end
22
22
 
23
-
24
23
  Bundler::GemHelper.install_tasks
25
24
 
26
- require 'rake/testtask'
25
+ require "rake/testtask"
27
26
  Rake::TestTask.new(:test) do |test|
28
- test.libs << 'lib' << 'test'
29
- test.pattern = 'test/**/*_test.rb'
27
+ test.libs << "lib" << "test"
28
+ test.pattern = "test/**/*_test.rb"
30
29
  test.verbose = true
31
30
  end
32
31
 
33
- desc 'Run Devise tests for all ORMs.'
32
+ desc "Run Devise tests for all ORMs."
34
33
  task :tests do
35
- Dir[File.join(File.dirname(__FILE__), 'test', 'orm', '*.rb')].each do |file|
34
+ Dir[File.join(File.dirname(__FILE__), "test", "orm", "*.rb")].each do |file|
36
35
  orm = File.basename(file).split(".").first
37
36
  system "rake test DEVISE_ORM=#{orm}"
38
37
  end
39
38
  end
40
39
 
41
- desc 'Default: run tests for all ORMs.'
42
- task :default => :tests
40
+ desc "Default: run tests for all ORMs."
41
+ task default: :tests
@@ -3,15 +3,15 @@ module DeviseOtp
3
3
  class OtpCredentialsController < DeviseController
4
4
  helper_method :new_session_path
5
5
 
6
- prepend_before_action :authenticate_scope!, :only => [:get_refresh, :set_refresh]
7
- prepend_before_action :require_no_authentication, :only => [ :show, :update ]
6
+ prepend_before_action :authenticate_scope!, only: [:get_refresh, :set_refresh]
7
+ prepend_before_action :require_no_authentication, only: [:show, :update]
8
8
 
9
9
  #
10
10
  # show a request for the OTP token
11
11
  #
12
12
  def show
13
13
  @challenge = params[:challenge]
14
- @recovery = (params[:recovery] == 'true') && recovery_enabled?
14
+ @recovery = (params[:recovery] == "true") && recovery_enabled?
15
15
 
16
16
  if @challenge.nil?
17
17
  redirect_to :root
@@ -33,28 +33,25 @@ module DeviseOtp
33
33
  #
34
34
  def update
35
35
  resource = resource_class.find_valid_otp_challenge(params[resource_name][:challenge])
36
- recovery = (params[resource_name][:recovery] == 'true') && recovery_enabled?
36
+ recovery = (params[resource_name][:recovery] == "true") && recovery_enabled?
37
37
  token = params[resource_name][:token]
38
38
 
39
39
  if token.blank?
40
40
  otp_set_flash_message(:alert, :token_blank)
41
- redirect_to otp_credential_path_for(resource_name, :challenge => params[resource_name][:challenge],
42
- :recovery => recovery)
41
+ redirect_to otp_credential_path_for(resource_name, challenge: params[resource_name][:challenge],
42
+ recovery: recovery)
43
43
  elsif resource.nil?
44
44
  otp_set_flash_message(:alert, :otp_session_invalid)
45
45
  redirect_to new_session_path(resource_name)
46
- else
47
- if resource.otp_challenge_valid? && resource.validate_otp_token(params[resource_name][:token], recovery)
48
- set_flash_message(:success, :signed_in) if is_navigational_format?
49
- sign_in(resource_name, resource)
46
+ elsif resource.otp_challenge_valid? && resource.validate_otp_token(params[resource_name][:token], recovery)
47
+ sign_in(resource_name, resource)
50
48
 
51
- otp_set_trusted_device_for(resource) if params[:enable_persistence] == "true"
52
- otp_refresh_credentials_for(resource)
53
- respond_with resource, :location => after_sign_in_path_for(resource)
54
- else
55
- otp_set_flash_message :alert, :token_invalid
56
- redirect_to new_session_path(resource_name)
57
- end
49
+ otp_set_trusted_device_for(resource) if params[:enable_persistence] == "true"
50
+ otp_refresh_credentials_for(resource)
51
+ respond_with resource, location: after_sign_in_path_for(resource)
52
+ else
53
+ otp_set_flash_message :alert, :token_invalid
54
+ redirect_to new_session_path(resource_name)
58
55
  end
59
56
  end
60
57
 
@@ -85,7 +82,7 @@ module DeviseOtp
85
82
  otp_refresh_credentials_for(resource)
86
83
  otp_set_flash_message :success, :valid_refresh if is_navigational_format?
87
84
 
88
- respond_with resource, :location => otp_fetch_refresh_return_url
85
+ respond_with resource, location: otp_fetch_refresh_return_url
89
86
  end
90
87
 
91
88
  def failed_refresh
@@ -96,7 +93,6 @@ module DeviseOtp
96
93
  def self.controller_path
97
94
  "#{::Devise.otp_controller_path}/otp_credentials"
98
95
  end
99
-
100
96
  end
101
97
  end
102
98
  end
@@ -6,7 +6,7 @@ module DeviseOtp
6
6
  prepend_before_action :ensure_credentials_refresh
7
7
  prepend_before_action :authenticate_scope!
8
8
 
9
- protect_from_forgery :except => [:clear_persistence, :delete_persistence]
9
+ protect_from_forgery except: [:clear_persistence, :delete_persistence]
10
10
 
11
11
  #
12
12
  # Displays the status of OTP authentication
@@ -23,8 +23,8 @@ module DeviseOtp
23
23
  # Updates the status of OTP authentication
24
24
  #
25
25
  def update
26
- enabled = params[resource_name][:otp_enabled] == '1'
27
- if (enabled ? resource.enable_otp! : resource.disable_otp!)
26
+ enabled = params[resource_name][:otp_enabled] == "1"
27
+ if enabled ? resource.enable_otp! : resource.disable_otp!
28
28
  otp_set_flash_message :success, :successfully_updated
29
29
  end
30
30
 
@@ -39,7 +39,7 @@ module DeviseOtp
39
39
  otp_set_flash_message :success, :successfully_reset_creds
40
40
  end
41
41
 
42
- redirect_to :action => :show
42
+ redirect_to action: :show
43
43
  end
44
44
 
45
45
  #
@@ -50,7 +50,7 @@ module DeviseOtp
50
50
  otp_set_flash_message :success, :successfully_set_persistence
51
51
  end
52
52
 
53
- redirect_to :action => :show
53
+ redirect_to action: :show
54
54
  end
55
55
 
56
56
  #
@@ -61,7 +61,7 @@ module DeviseOtp
61
61
  otp_set_flash_message :success, :successfully_cleared_persistence
62
62
  end
63
63
 
64
- redirect_to :action => :show
64
+ redirect_to action: :show
65
65
  end
66
66
 
67
67
  #
@@ -72,12 +72,9 @@ module DeviseOtp
72
72
  otp_set_flash_message :notice, :successfully_reset_persistence
73
73
  end
74
74
 
75
- redirect_to :action => :show
75
+ redirect_to action: :show
76
76
  end
77
77
 
78
- #
79
- #
80
- #
81
78
  def recovery
82
79
  respond_to do |format|
83
80
  format.html
@@ -106,7 +103,6 @@ module DeviseOtp
106
103
  def self.controller_path
107
104
  "#{::Devise.otp_controller_path}/otp_tokens"
108
105
  end
109
-
110
106
  end
111
107
  end
112
108
  end
@@ -20,7 +20,7 @@
20
20
  <%= f.text_field :token, :autocomplete => :off, :autofocus => true, :size => 6, :value => '' %><br>
21
21
 
22
22
  <%= label_tag :enable_persistence do %>
23
- <%= check_box_tag :enable_persistence, true, false %> Remember this browser
23
+ <%= check_box_tag :enable_persistence, true, false %> <%= I18n.t('remember', :scope => 'devise.otp.general') %>
24
24
  <% end %>
25
25
 
26
26
  <p><%= f.submit I18n.t('submit', :scope => 'devise.otp.submit_token') %></p>
@@ -16,8 +16,8 @@
16
16
  </p>
17
17
 
18
18
  <%- if recovery_enabled? %>
19
- <h3><%= I18n.t('title', :scope => 'devise.otp.tokens.recovery') %></h3>
20
- <p><%= I18n.t('explain', :scope => 'devise.otp.tokens.recovery') %></p>
21
- <p><%= link_to I18n.t('codes_list', :scope => 'devise.otp.tokens.recovery'), recovery_otp_token_for(resource_name) %></p>
22
- <p><%= link_to I18n.t('download_codes', :scope => 'devise.otp.tokens.recovery'), recovery_otp_token_for(resource_name, format: :text) %></p>
19
+ <h3><%= I18n.t('title', :scope => 'devise.otp.otp_tokens.recovery') %></h3>
20
+ <p><%= I18n.t('explain', :scope => 'devise.otp.otp_tokens.recovery') %></p>
21
+ <p><%= link_to I18n.t('codes_list', :scope => 'devise.otp.otp_tokens.recovery'), recovery_otp_token_for(resource_name) %></p>
22
+ <p><%= link_to I18n.t('download_codes', :scope => 'devise.otp.otp_tokens.recovery'), recovery_otp_token_for(resource_name, format: :text) %></p>
23
23
  <% end %>
@@ -1,12 +1,12 @@
1
- <h2><%= I18n.t('title', :scope => 'devise.otp.tokens.recovery') %></h2>
2
- <p><%= I18n.t('explain', :scope => 'devise.otp.tokens.recovery') %></p>
1
+ <h2><%= I18n.t('title', :scope => 'devise.otp.otp_tokens.recovery') %></h2>
2
+ <p><%= I18n.t('explain', :scope => 'devise.otp.otp_tokens.recovery') %></p>
3
3
 
4
4
  <table>
5
5
  <caption>
6
6
  <thead>
7
7
  <tr>
8
- <th><%= I18n.t('sequence', :scope => 'devise.otp.tokens.recovery') %></th>
9
- <th><%= I18n.t('code', :scope => 'devise.otp.tokens.recovery') %></th>
8
+ <th><%= I18n.t('sequence', :scope => 'devise.otp.otp_tokens.recovery') %></th>
9
+ <th><%= I18n.t('code', :scope => 'devise.otp.otp_tokens.recovery') %></th>
10
10
  </tr>
11
11
  </thead>
12
12
  <tbody>
@@ -1,18 +1,18 @@
1
- <h2><%= I18n.t('title', :scope => 'devise.otp.tokens') %></h2>
2
- <p><%= I18n.t('explain', :scope => 'devise.otp.tokens') %></p>
1
+ <h2><%= I18n.t('title', :scope => 'devise.otp.otp_tokens') %></h2>
2
+ <p><%= I18n.t('explain', :scope => 'devise.otp.otp_tokens') %></p>
3
3
 
4
4
  <%= form_for(resource, :as => resource_name, :url => [resource_name, :otp_token], :html => { :method => :put, "data-turbo" => false }) do |f| %>
5
5
 
6
6
  <%= render "devise/shared/error_messages", resource: resource %>
7
7
 
8
- <h3><%= I18n.t('enable_request', :scope => 'devise.otp.tokens') %></h3>
8
+ <h3><%= I18n.t('enable_request', :scope => 'devise.otp.otp_tokens') %></h3>
9
9
 
10
10
  <p>
11
- <%= f.label :otp_enabled, I18n.t('status', :scope => 'devise.otp.tokens') %><br />
11
+ <%= f.label :otp_enabled, I18n.t('status', :scope => 'devise.otp.otp_tokens') %><br />
12
12
  <%= f.check_box :otp_enabled %>
13
13
  </p>
14
14
 
15
- <p><%= f.submit I18n.t('submit', :scope => 'devise.otp.tokens') %></p>
15
+ <p><%= f.submit I18n.t('submit', :scope => 'devise.otp.otp_tokens') %></p>
16
16
  <% end %>
17
17
 
18
18
  <%- if resource.otp_enabled? %>
@@ -1,7 +1,8 @@
1
1
  en:
2
2
  devise:
3
-
4
3
  otp:
4
+ general:
5
+ remember: Remember me
5
6
  submit_token:
6
7
  title: 'Check Token'
7
8
  explain: "You're getting this because you enabled two-factors authentication on your account"
@@ -9,21 +10,18 @@ en:
9
10
  recovery_prompt: 'Please enter your recovery code:'
10
11
  submit: 'Submit Token'
11
12
  recovery_link: "I don't have my device, I want to use a recovery code"
12
-
13
- credentials:
13
+ otp_credentials:
14
14
  token_invalid: 'The token you provided was invalid.'
15
15
  token_blank: 'You need to type in the token you generated with your device.'
16
16
  need_to_refresh_credentials: 'We need to check your credentials before you can change these settings.'
17
17
  valid_refresh: 'Thank you, your credentials were accepted.'
18
18
  invalid_refresh: 'Sorry, you provided the wrong credentials.'
19
-
20
19
  credentials_refresh:
21
20
  title: 'Please enter your password again.'
22
21
  explain: 'In order to ensure this is safe, please enter your password again.'
23
22
  go_on: 'Continue...'
24
23
  identity: 'Identity:'
25
24
  token: 'Your two-factors authentication token'
26
-
27
25
  token_secret:
28
26
  title: 'Your token secret'
29
27
  explain: 'Take a photo of this QR code with your mobile'
@@ -31,23 +29,18 @@ en:
31
29
  reset_otp: 'Reset your Two Factors Authentication status'
32
30
  reset_explain: 'This will reset your credentials, and disable two-factors authentication.'
33
31
  reset_explain_warn: 'You will need to enroll your mobile device again.'
34
-
35
- tokens:
32
+ otp_tokens:
36
33
  title: 'Two-factors Authentication:'
37
34
  explain: 'Two factors authentication adds an additional layer of security to your account. When logging in you will be asked for a code that you can generate on a physical device, like your phone.'
38
35
  enable_request: 'Would you like to enable Two Factors Authenticator?'
39
-
40
36
  status: 'Enable Two-Factors Authentication.'
41
37
  submit: 'Continue...'
42
-
43
38
  successfully_updated: 'Your two-factors authentication settings have been updated.'
44
39
  successfully_reset_creds: 'Your two-factors credentials has been reset.'
45
40
  successfully_set_persistence: 'Your device is now trusted.'
46
41
  successfully_cleared_persistence: 'Your device has been removed from the list of trusted devices.'
47
42
  successfully_reset_persistence: 'Your list of trusted devices has been cleared.'
48
-
49
43
  need_to_refresh_credentials: 'We need to check your credentials before you can change these settings.'
50
-
51
44
  recovery:
52
45
  title: 'Your Emergency Recovery Codes'
53
46
  explain: 'Take note or print these recovery codes. The will allow you to log back in in case your token device is lost, stolen, or unavailable.'
@@ -55,7 +48,6 @@ en:
55
48
  code: 'Recovery Code'
56
49
  codes_list: 'Here is the list of your recovery codes'
57
50
  download_codes: 'Download recovery codes'
58
-
59
51
  trusted_browsers:
60
52
  title: 'Trusted Browsers'
61
53
  explain: 'If you set your browser as trusted, you will not be asked to provide a Two-factor authentication token when logging in from that browser.'
data/devise-otp.gemspec CHANGED
@@ -1,23 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/devise-otp/version'
3
+ require_relative "lib/devise-otp/version"
4
4
 
5
5
  Gem::Specification.new do |gem|
6
- gem.name = "devise-otp"
7
- gem.version = Devise::OTP::VERSION
8
- gem.authors = ["Lele Forzani", "Josef Strzibny"]
9
- gem.email = ["lele@windmill.it", "strzibny@strzibny.name"]
10
- gem.description = %q{Time Based OTP/rfc6238 compatible authentication for Devise}
11
- gem.summary = %q{Time Based OTP/rfc6238 compatible authentication for Devise}
12
- gem.homepage = "http://git.windmill.it/wm/devise-otp"
6
+ gem.name = "devise-otp"
7
+ gem.version = Devise::OTP::VERSION
8
+ gem.authors = ["Lele Forzani", "Josef Strzibny"]
9
+ gem.email = ["lele@windmill.it", "strzibny@strzibny.name"]
10
+ gem.description = "Time Based OTP/rfc6238 compatible authentication for Devise"
11
+ gem.summary = "Time Based OTP/rfc6238 compatible authentication for Devise"
12
+ gem.homepage = "http://git.windmill.it/wm/devise-otp"
13
13
 
14
- gem.files = `git ls-files`.split($/)
15
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.files = `git ls-files`.split($/)
16
15
  gem.require_paths = ["lib"]
17
16
 
18
- gem.add_runtime_dependency 'rails', '>= 7.0', '< 7.1'
19
- gem.add_runtime_dependency 'devise', '>= 4.8.0', '< 4.9.0'
20
- gem.add_runtime_dependency 'rotp', '>= 2.0.0'
17
+ gem.add_runtime_dependency "rails", ">= 7.0", "< 7.2"
18
+ gem.add_runtime_dependency "devise", ">= 4.8.0", "< 5.0"
19
+ gem.add_runtime_dependency "rotp", ">= 2.0.0"
21
20
 
22
21
  gem.add_development_dependency "capybara"
23
22
  gem.add_development_dependency "cuprite"
@@ -27,4 +26,5 @@ Gem::Specification.new do |gem|
27
26
  gem.add_development_dependency "shoulda"
28
27
  gem.add_development_dependency "sprockets-rails"
29
28
  gem.add_development_dependency "sqlite3"
29
+ gem.add_development_dependency "standardrb"
30
30
  end
@@ -1,5 +1,5 @@
1
1
  module Devise
2
2
  module OTP
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
data/lib/devise-otp.rb CHANGED
@@ -1,31 +1,21 @@
1
1
  require "devise-otp/version"
2
2
 
3
3
  # cherry pick active-support extensions
4
- #require 'active_record/connection_adapters/abstract/schema_definitions'
5
- require 'active_support/core_ext/integer'
6
- require 'active_support/core_ext/string'
7
- require 'active_support/ordered_hash'
8
- require 'active_support/concern'
4
+ # require 'active_record/connection_adapters/abstract/schema_definitions'
5
+ require "active_support/core_ext/integer"
6
+ require "active_support/core_ext/string"
7
+ require "active_support/ordered_hash"
8
+ require "active_support/concern"
9
9
 
10
- require 'devise'
10
+ require "devise"
11
11
 
12
12
  module Devise
13
-
14
- #
15
- #
16
- #
17
13
  mattr_accessor :otp_mandatory
18
14
  @@otp_mandatory = false
19
15
 
20
- #
21
- #
22
- #
23
16
  mattr_accessor :otp_authentication_timeout
24
17
  @@otp_authentication_timeout = 3.minutes
25
18
 
26
- #
27
- #
28
- #
29
19
  mattr_accessor :otp_recovery_tokens
30
20
  @@otp_recovery_tokens = 10 ## false to disable
31
21
 
@@ -36,11 +26,8 @@ module Devise
36
26
  mattr_accessor :otp_trust_persistence
37
27
  @@otp_trust_persistence = 30.days
38
28
 
39
- #
40
- #
41
- #
42
- mattr_accessor :otp_drift_window
43
- @@otp_drift_window = 3 # in minutes
29
+ mattr_accessor :otp_drift_window
30
+ @@otp_drift_window = 3 # in minutes
44
31
 
45
32
  #
46
33
  # if the user wants to change Otp settings,
@@ -56,7 +43,6 @@ module Devise
56
43
  mattr_accessor :otp_issuer
57
44
  @@otp_issuer = Rails.application.class.module_parent_name
58
45
 
59
-
60
46
  #
61
47
  # custom view path
62
48
  #
@@ -68,17 +54,17 @@ module Devise
68
54
  end
69
55
 
70
56
  module DeviseOtpAuthenticatable
71
- autoload :Hooks, 'devise_otp_authenticatable/hooks'
57
+ autoload :Hooks, "devise_otp_authenticatable/hooks"
72
58
 
73
59
  module Controllers
74
- autoload :Helpers, 'devise_otp_authenticatable/controllers/helpers'
75
- autoload :UrlHelpers, 'devise_otp_authenticatable/controllers/url_helpers'
60
+ autoload :Helpers, "devise_otp_authenticatable/controllers/helpers"
61
+ autoload :UrlHelpers, "devise_otp_authenticatable/controllers/url_helpers"
76
62
  end
77
63
  end
78
64
 
79
- require 'devise_otp_authenticatable/routes'
80
- require 'devise_otp_authenticatable/engine'
65
+ require "devise_otp_authenticatable/routes"
66
+ require "devise_otp_authenticatable/engine"
81
67
 
82
68
  Devise.add_module :otp_authenticatable,
83
- :controller => :tokens,
84
- :model => 'devise_otp_authenticatable/models/otp_authenticatable', :route => :otp
69
+ controller: :tokens,
70
+ model: "devise_otp_authenticatable/models/otp_authenticatable", route: :otp
@@ -1,9 +1,8 @@
1
1
  module DeviseOtpAuthenticatable
2
2
  module Controllers
3
3
  module Helpers
4
-
5
4
  def authenticate_scope!
6
- send(:"authenticate_#{resource_name}!", :force => true)
5
+ send(:"authenticate_#{resource_name}!", force: true)
7
6
  self.resource = send("current_#{resource_name}")
8
7
  end
9
8
 
@@ -11,7 +10,7 @@ module DeviseOtpAuthenticatable
11
10
  # similar to DeviseController#set_flash_message, but sets the scope inside
12
11
  # the otp controller
13
12
  #
14
- def otp_set_flash_message(key, kind, options={})
13
+ def otp_set_flash_message(key, kind, options = {})
15
14
  options[:scope] ||= "devise.otp.#{controller_name}"
16
15
  options[:default] = Array(options[:default]).unshift(kind.to_sym)
17
16
  options[:resource_name] = resource_name
@@ -20,7 +19,7 @@ module DeviseOtpAuthenticatable
20
19
  flash[key] = message if message.present?
21
20
  end
22
21
 
23
- def otp_t()
22
+ def otp_t
24
23
  end
25
24
 
26
25
  def trusted_devices_enabled?
@@ -67,7 +66,7 @@ module DeviseOtpAuthenticatable
67
66
  return false unless resource.class.otp_trust_persistence
68
67
  if cookies[otp_scoped_persistence_cookie].present?
69
68
  cookies.signed[otp_scoped_persistence_cookie] ==
70
- [resource.to_key, resource.authenticatable_salt, resource.otp_persistence_seed]
69
+ [resource.to_key, resource.authenticatable_salt, resource.otp_persistence_seed]
71
70
  else
72
71
  false
73
72
  end
@@ -79,9 +78,9 @@ module DeviseOtpAuthenticatable
79
78
  def otp_set_trusted_device_for(resource)
80
79
  return unless resource.class.otp_trust_persistence
81
80
  cookies.signed[otp_scoped_persistence_cookie] = {
82
- :httponly => true,
83
- :expires => Time.now + resource.class.otp_trust_persistence,
84
- :value => [resource.to_key, resource.authenticatable_salt, resource.otp_persistence_seed]
81
+ httponly: true,
82
+ expires: Time.now + resource.class.otp_trust_persistence,
83
+ value: [resource.to_key, resource.authenticatable_salt, resource.otp_persistence_seed]
85
84
  }
86
85
  end
87
86
 
@@ -91,7 +90,6 @@ module DeviseOtpAuthenticatable
91
90
 
92
91
  def otp_fetch_refresh_return_url
93
92
  session.delete(otp_scoped_refresh_return_url_property) { :root }
94
-
95
93
  end
96
94
 
97
95
  def otp_scoped_refresh_return_url_property
@@ -131,27 +129,27 @@ module DeviseOtpAuthenticatable
131
129
  private
132
130
 
133
131
  def otp_authenticator_token_image_js(otp_url)
134
- content_tag(:div, :class => 'qrcode-container') do
135
- tag(:div, :id => 'qrcode', :class => 'qrcode') +
136
- javascript_tag(%Q[
137
- new QRCode("qrcode", {
138
- text: "#{otp_url}",
139
- width: 256,
140
- height: 256,
141
- colorDark : "#000000",
142
- colorLight : "#ffffff",
143
- correctLevel : QRCode.CorrectLevel.H
144
- });
145
- ]) + tag("/div")
132
+ content_tag(:div, class: "qrcode-container") do
133
+ content_tag(:div, id: "qrcode", class: "qrcode") do
134
+ javascript_tag(%[
135
+ new QRCode("qrcode", {
136
+ text: "#{otp_url}",
137
+ width: 256,
138
+ height: 256,
139
+ colorDark : "#000000",
140
+ colorLight : "#ffffff",
141
+ correctLevel : QRCode.CorrectLevel.H
142
+ });
143
+ ])
144
+ end
146
145
  end
147
146
  end
148
147
 
149
148
  def otp_authenticator_token_image_google(otp_url)
150
149
  otp_url = Rack::Utils.escape(otp_url)
151
150
  url = "https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=#{otp_url}"
152
- image_tag(url, :alt => 'OTP Url QRCode')
151
+ image_tag(url, alt: "OTP Url QRCode")
153
152
  end
154
-
155
153
  end
156
154
  end
157
155
  end
@@ -1,7 +1,6 @@
1
1
  module DeviseOtpAuthenticatable
2
2
  module Controllers
3
3
  module UrlHelpers
4
-
5
4
  def recovery_otp_token_for(resource_or_scope, opts = {})
6
5
  scope = ::Devise::Mapping.find_scope!(resource_or_scope)
7
6
  send("recovery_#{scope}_otp_token_path", opts)
@@ -26,7 +25,6 @@ module DeviseOtpAuthenticatable
26
25
  scope = ::Devise::Mapping.find_scope!(resource_or_scope)
27
26
  send("#{scope}_otp_credential_path", opts)
28
27
  end
29
-
30
28
  end
31
29
  end
32
30
  end
@@ -1,5 +1,7 @@
1
1
  module DeviseOtpAuthenticatable
2
2
  class Engine < ::Rails::Engine
3
+ config.devise_otp = ActiveSupport::OrderedOptions.new
4
+ config.devise_otp.precompile_assets = true
3
5
 
4
6
  # We use to_prepare instead of after_initialize here because Devise is a Rails engine;
5
7
  config.to_prepare do
@@ -19,12 +21,12 @@ module DeviseOtpAuthenticatable
19
21
 
20
22
  # See: https://guides.rubyonrails.org/engines.html#separate-assets-and-precompiling
21
23
  # check if Rails api mode
22
- if app.config.respond_to?(:assets)
23
- if defined?(Sprockets) && Sprockets::VERSION >= "4"
24
- app.config.assets.precompile << "devise-otp.js"
24
+ if app.config.respond_to?(:assets) && app.config.devise_otp.precompile_assets
25
+ app.config.assets.precompile << if defined?(Sprockets) && Sprockets::VERSION >= "4"
26
+ "devise-otp.js"
25
27
  else
26
28
  # use a proc instead of a string
27
- app.config.assets.precompile << proc { |path| path == "devise-otp.js" }
29
+ proc { |path| path == "devise-otp.js" }
28
30
  end
29
31
  end
30
32
  end
@@ -4,7 +4,7 @@ module DeviseOtpAuthenticatable::Hooks
4
4
  include DeviseOtpAuthenticatable::Controllers::UrlHelpers
5
5
 
6
6
  included do
7
- alias_method :create, :create_with_otp
7
+ alias_method :create, :create_with_otp
8
8
  end
9
9
 
10
10
  #
@@ -22,15 +22,14 @@ module DeviseOtpAuthenticatable::Hooks
22
22
  challenge = resource.generate_otp_challenge!
23
23
  warden.logout
24
24
  store_location_for(resource, devise_stored_location) # restore the stored location
25
- respond_with resource, :location => otp_credential_path_for(resource, {:challenge => challenge})
25
+ respond_with resource, location: otp_credential_path_for(resource, {challenge: challenge})
26
26
  elsif otp_mandatory_on?(resource) # if mandatory, log in user but send him to the must activate otp
27
27
  set_flash_message(:notice, :signed_in_but_otp) if is_navigational_format?
28
28
  sign_in(resource_name, resource)
29
- respond_with resource, :location => otp_token_path_for(resource)
29
+ respond_with resource, location: otp_token_path_for(resource)
30
30
  else
31
- set_flash_message(:notice, :signed_in) if is_navigational_format?
32
31
  sign_in(resource_name, resource)
33
- respond_with resource, :location => after_sign_in_path_for(resource)
32
+ respond_with resource, location: after_sign_in_path_for(resource)
34
33
  end
35
34
  end
36
35