devise-otp 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +36 -0
  3. data/.gitignore +0 -0
  4. data/Gemfile +1 -22
  5. data/LICENSE.txt +0 -0
  6. data/README.md +43 -66
  7. data/Rakefile +0 -0
  8. data/app/assets/javascripts/devise-otp.js +1 -0
  9. data/app/assets/javascripts/qrcode.js +609 -0
  10. data/app/controllers/devise_otp/devise/credentials_controller.rb +102 -0
  11. data/app/controllers/devise_otp/devise/tokens_controller.rb +112 -0
  12. data/app/views/devise/credentials/refresh.html.erb +19 -0
  13. data/app/views/devise/credentials/show.html.erb +31 -0
  14. data/app/views/devise/tokens/_token_secret.html.erb +23 -0
  15. data/app/views/devise/tokens/_trusted_devices.html.erb +12 -0
  16. data/app/views/devise/tokens/recovery.html.erb +21 -0
  17. data/app/views/devise/tokens/recovery_codes.text.erb +3 -0
  18. data/app/views/devise/tokens/show.html.erb +21 -0
  19. data/config/locales/en.yml +10 -10
  20. data/devise-otp.gemspec +14 -9
  21. data/docs/QR_CODES.md +48 -0
  22. data/lib/devise-otp/version.rb +1 -1
  23. data/lib/devise-otp.rb +22 -14
  24. data/lib/devise_otp_authenticatable/controllers/helpers.rb +29 -16
  25. data/lib/devise_otp_authenticatable/controllers/url_helpers.rb +6 -9
  26. data/lib/devise_otp_authenticatable/engine.rb +22 -13
  27. data/lib/devise_otp_authenticatable/hooks/sessions.rb +8 -7
  28. data/lib/devise_otp_authenticatable/hooks.rb +1 -1
  29. data/lib/devise_otp_authenticatable/models/otp_authenticatable.rb +28 -28
  30. data/lib/devise_otp_authenticatable/routes.rb +9 -10
  31. data/lib/generators/active_record/devise_otp_generator.rb +1 -1
  32. data/lib/generators/active_record/templates/migration.rb +1 -2
  33. data/lib/generators/devise_otp/devise_otp_generator.rb +0 -0
  34. data/lib/generators/devise_otp/install_generator.rb +30 -5
  35. data/lib/generators/devise_otp/views_generator.rb +2 -3
  36. data/test/dummy/README.rdoc +0 -0
  37. data/test/dummy/Rakefile +0 -0
  38. data/test/dummy/app/assets/config/manifest.js +2 -0
  39. data/test/dummy/app/assets/javascripts/application.js +1 -0
  40. data/test/dummy/app/assets/stylesheets/application.css +0 -0
  41. data/test/dummy/app/controllers/application_controller.rb +1 -1
  42. data/test/dummy/app/controllers/posts_controller.rb +2 -0
  43. data/test/dummy/app/helpers/application_helper.rb +0 -0
  44. data/test/dummy/app/helpers/posts_helper.rb +0 -0
  45. data/test/dummy/app/mailers/.gitkeep +0 -0
  46. data/test/dummy/app/models/post.rb +0 -0
  47. data/test/dummy/app/models/user.rb +1 -1
  48. data/test/dummy/app/views/layouts/application.html.erb +0 -0
  49. data/test/dummy/app/views/posts/_form.html.erb +0 -0
  50. data/test/dummy/app/views/posts/edit.html.erb +0 -0
  51. data/test/dummy/app/views/posts/index.html.erb +0 -0
  52. data/test/dummy/app/views/posts/new.html.erb +0 -0
  53. data/test/dummy/app/views/posts/show.html.erb +0 -0
  54. data/test/dummy/config/application.rb +2 -1
  55. data/test/dummy/config/boot.rb +0 -0
  56. data/test/dummy/config/database.yml +1 -1
  57. data/test/dummy/config/environment.rb +0 -0
  58. data/test/dummy/config/environments/development.rb +0 -7
  59. data/test/dummy/config/environments/production.rb +0 -4
  60. data/test/dummy/config/environments/test.rb +0 -0
  61. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -0
  62. data/test/dummy/config/initializers/devise.rb +0 -0
  63. data/test/dummy/config/initializers/inflections.rb +0 -0
  64. data/test/dummy/config/initializers/mime_types.rb +0 -0
  65. data/test/dummy/config/initializers/secret_token.rb +0 -0
  66. data/test/dummy/config/initializers/session_store.rb +0 -0
  67. data/test/dummy/config/initializers/wrap_parameters.rb +0 -0
  68. data/test/dummy/config/locales/en.yml +0 -0
  69. data/test/dummy/config/routes.rb +0 -0
  70. data/test/dummy/config.ru +0 -0
  71. data/test/dummy/db/migrate/20130125101430_create_users.rb +1 -1
  72. data/test/dummy/db/migrate/20130131092406_add_devise_to_users.rb +1 -1
  73. data/test/dummy/db/migrate/20130131142320_create_posts.rb +1 -1
  74. data/test/dummy/db/migrate/20130131160351_devise_otp_add_to_users.rb +2 -2
  75. data/test/dummy/db/test.sqlite3-journal +0 -0
  76. data/test/dummy/lib/assets/.gitkeep +0 -0
  77. data/test/dummy/public/404.html +0 -0
  78. data/test/dummy/public/422.html +0 -0
  79. data/test/dummy/public/500.html +0 -0
  80. data/test/dummy/public/favicon.ico +0 -0
  81. data/test/integration/persistence_test.rb +81 -0
  82. data/test/integration/refresh_test.rb +2 -18
  83. data/test/integration/sign_in_test.rb +14 -4
  84. data/test/integration/token_test.rb +31 -0
  85. data/test/integration_tests_helper.rb +19 -2
  86. data/test/model_tests_helper.rb +0 -0
  87. data/test/models/otp_authenticatable_test.rb +14 -9
  88. data/test/orm/active_record.rb +3 -1
  89. data/test/test_helper.rb +71 -2
  90. metadata +135 -24
  91. data/.travis.yml +0 -11
  92. data/app/controllers/devise_otp/credentials_controller.rb +0 -106
  93. data/app/controllers/devise_otp/tokens_controller.rb +0 -105
  94. data/app/views/devise_otp/credentials/refresh.html.erb +0 -20
  95. data/app/views/devise_otp/credentials/show.html.erb +0 -23
  96. data/app/views/devise_otp/tokens/_token_secret.html.erb +0 -17
  97. data/app/views/devise_otp/tokens/recovery.html.erb +0 -21
  98. data/app/views/devise_otp/tokens/show.html.erb +0 -31
  99. data/lib/devise_otp_authenticatable/mapping.rb +0 -19
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise-otp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lele Forzani
8
- autorequire:
8
+ - Josef Strzibny
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-08-12 00:00:00.000000000 Z
12
+ date: 2022-03-19 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rails
@@ -16,40 +17,40 @@ dependencies:
16
17
  requirements:
17
18
  - - ">="
18
19
  - !ruby/object:Gem::Version
19
- version: 3.2.6
20
+ version: '7.0'
20
21
  - - "<"
21
22
  - !ruby/object:Gem::Version
22
- version: '5'
23
+ version: '7.1'
23
24
  type: :runtime
24
25
  prerelease: false
25
26
  version_requirements: !ruby/object:Gem::Requirement
26
27
  requirements:
27
28
  - - ">="
28
29
  - !ruby/object:Gem::Version
29
- version: 3.2.6
30
+ version: '7.0'
30
31
  - - "<"
31
32
  - !ruby/object:Gem::Version
32
- version: '5'
33
+ version: '7.1'
33
34
  - !ruby/object:Gem::Dependency
34
35
  name: devise
35
36
  requirement: !ruby/object:Gem::Requirement
36
37
  requirements:
37
38
  - - ">="
38
39
  - !ruby/object:Gem::Version
39
- version: 3.1.0
40
+ version: 4.8.0
40
41
  - - "<"
41
42
  - !ruby/object:Gem::Version
42
- version: 4.0.0
43
+ version: 4.9.0
43
44
  type: :runtime
44
45
  prerelease: false
45
46
  version_requirements: !ruby/object:Gem::Requirement
46
47
  requirements:
47
48
  - - ">="
48
49
  - !ruby/object:Gem::Version
49
- version: 3.1.0
50
+ version: 4.8.0
50
51
  - - "<"
51
52
  - !ruby/object:Gem::Version
52
- version: 4.0.0
53
+ version: 4.9.0
53
54
  - !ruby/object:Gem::Dependency
54
55
  name: rotp
55
56
  requirement: !ruby/object:Gem::Requirement
@@ -64,6 +65,104 @@ dependencies:
64
65
  - - ">="
65
66
  - !ruby/object:Gem::Version
66
67
  version: 2.0.0
68
+ - !ruby/object:Gem::Dependency
69
+ name: capybara
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: cuprite
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: minitest-reporters
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 0.5.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 0.5.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: puma
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rdoc
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: shoulda
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ - !ruby/object:Gem::Dependency
153
+ name: sprockets-rails
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
67
166
  - !ruby/object:Gem::Dependency
68
167
  name: sqlite3
69
168
  requirement: !ruby/object:Gem::Requirement
@@ -81,25 +180,31 @@ dependencies:
81
180
  description: Time Based OTP/rfc6238 compatible authentication for Devise
82
181
  email:
83
182
  - lele@windmill.it
183
+ - strzibny@strzibny.name
84
184
  executables: []
85
185
  extensions: []
86
186
  extra_rdoc_files: []
87
187
  files:
188
+ - ".github/workflows/ci.yml"
88
189
  - ".gitignore"
89
- - ".travis.yml"
90
190
  - Gemfile
91
191
  - LICENSE.txt
92
192
  - README.md
93
193
  - Rakefile
94
- - app/controllers/devise_otp/credentials_controller.rb
95
- - app/controllers/devise_otp/tokens_controller.rb
96
- - app/views/devise_otp/credentials/refresh.html.erb
97
- - app/views/devise_otp/credentials/show.html.erb
98
- - app/views/devise_otp/tokens/_token_secret.html.erb
99
- - app/views/devise_otp/tokens/recovery.html.erb
100
- - app/views/devise_otp/tokens/show.html.erb
194
+ - app/assets/javascripts/devise-otp.js
195
+ - app/assets/javascripts/qrcode.js
196
+ - app/controllers/devise_otp/devise/credentials_controller.rb
197
+ - app/controllers/devise_otp/devise/tokens_controller.rb
198
+ - app/views/devise/credentials/refresh.html.erb
199
+ - app/views/devise/credentials/show.html.erb
200
+ - app/views/devise/tokens/_token_secret.html.erb
201
+ - app/views/devise/tokens/_trusted_devices.html.erb
202
+ - app/views/devise/tokens/recovery.html.erb
203
+ - app/views/devise/tokens/recovery_codes.text.erb
204
+ - app/views/devise/tokens/show.html.erb
101
205
  - config/locales/en.yml
102
206
  - devise-otp.gemspec
207
+ - docs/QR_CODES.md
103
208
  - lib/devise-otp.rb
104
209
  - lib/devise-otp/version.rb
105
210
  - lib/devise_otp_authenticatable/controllers/helpers.rb
@@ -107,7 +212,6 @@ files:
107
212
  - lib/devise_otp_authenticatable/engine.rb
108
213
  - lib/devise_otp_authenticatable/hooks.rb
109
214
  - lib/devise_otp_authenticatable/hooks/sessions.rb
110
- - lib/devise_otp_authenticatable/mapping.rb
111
215
  - lib/devise_otp_authenticatable/models/otp_authenticatable.rb
112
216
  - lib/devise_otp_authenticatable/routes.rb
113
217
  - lib/generators/active_record/devise_otp_generator.rb
@@ -117,6 +221,7 @@ files:
117
221
  - lib/generators/devise_otp/views_generator.rb
118
222
  - test/dummy/README.rdoc
119
223
  - test/dummy/Rakefile
224
+ - test/dummy/app/assets/config/manifest.js
120
225
  - test/dummy/app/assets/javascripts/application.js
121
226
  - test/dummy/app/assets/stylesheets/application.css
122
227
  - test/dummy/app/controllers/application_controller.rb
@@ -153,14 +258,17 @@ files:
153
258
  - test/dummy/db/migrate/20130131092406_add_devise_to_users.rb
154
259
  - test/dummy/db/migrate/20130131142320_create_posts.rb
155
260
  - test/dummy/db/migrate/20130131160351_devise_otp_add_to_users.rb
261
+ - test/dummy/db/test.sqlite3-journal
156
262
  - test/dummy/lib/assets/.gitkeep
157
263
  - test/dummy/public/404.html
158
264
  - test/dummy/public/422.html
159
265
  - test/dummy/public/500.html
160
266
  - test/dummy/public/favicon.ico
161
267
  - test/dummy/script/rails
268
+ - test/integration/persistence_test.rb
162
269
  - test/integration/refresh_test.rb
163
270
  - test/integration/sign_in_test.rb
271
+ - test/integration/token_test.rb
164
272
  - test/integration_tests_helper.rb
165
273
  - test/model_tests_helper.rb
166
274
  - test/models/otp_authenticatable_test.rb
@@ -169,7 +277,7 @@ files:
169
277
  homepage: http://git.windmill.it/wm/devise-otp
170
278
  licenses: []
171
279
  metadata: {}
172
- post_install_message:
280
+ post_install_message:
173
281
  rdoc_options: []
174
282
  require_paths:
175
283
  - lib
@@ -184,14 +292,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
292
  - !ruby/object:Gem::Version
185
293
  version: '0'
186
294
  requirements: []
187
- rubyforge_project:
188
- rubygems_version: 2.2.2
189
- signing_key:
295
+ rubygems_version: 3.2.32
296
+ signing_key:
190
297
  specification_version: 4
191
298
  summary: Time Based OTP/rfc6238 compatible authentication for Devise
192
299
  test_files:
193
300
  - test/dummy/README.rdoc
194
301
  - test/dummy/Rakefile
302
+ - test/dummy/app/assets/config/manifest.js
195
303
  - test/dummy/app/assets/javascripts/application.js
196
304
  - test/dummy/app/assets/stylesheets/application.css
197
305
  - test/dummy/app/controllers/application_controller.rb
@@ -228,14 +336,17 @@ test_files:
228
336
  - test/dummy/db/migrate/20130131092406_add_devise_to_users.rb
229
337
  - test/dummy/db/migrate/20130131142320_create_posts.rb
230
338
  - test/dummy/db/migrate/20130131160351_devise_otp_add_to_users.rb
339
+ - test/dummy/db/test.sqlite3-journal
231
340
  - test/dummy/lib/assets/.gitkeep
232
341
  - test/dummy/public/404.html
233
342
  - test/dummy/public/422.html
234
343
  - test/dummy/public/500.html
235
344
  - test/dummy/public/favicon.ico
236
345
  - test/dummy/script/rails
346
+ - test/integration/persistence_test.rb
237
347
  - test/integration/refresh_test.rb
238
348
  - test/integration/sign_in_test.rb
349
+ - test/integration/token_test.rb
239
350
  - test/integration_tests_helper.rb
240
351
  - test/model_tests_helper.rb
241
352
  - test/models/otp_authenticatable_test.rb
data/.travis.yml DELETED
@@ -1,11 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.9.3
4
- - 2.0.0
5
- - rbx-19mode
6
- - rbx-20mode
7
- script: rake test
8
- env:
9
- - DEVISE_ORM=active_record
10
- matrix:
11
- allow_failures:
@@ -1,106 +0,0 @@
1
- class DeviseOtp::CredentialsController < DeviseController
2
- helper_method :new_session_path
3
-
4
- prepend_before_filter :authenticate_scope!, :only => [:get_refresh, :set_refresh]
5
- prepend_before_filter :require_no_authentication, :only => [ :show, :update ]
6
-
7
- #
8
- # show a request for the OTP token
9
- #
10
- def show
11
- @challenge = params[:challenge]
12
- @recovery = (params[:recovery] == 'true') && recovery_enabled?
13
-
14
- if @challenge.nil?
15
- redirect_to :root
16
-
17
- else
18
- self.resource = resource_class.find_valid_otp_challenge(@challenge)
19
- if resource.nil?
20
- redirect_to :root
21
- elsif @recovery
22
- @recovery_count = resource.otp_recovery_counter
23
- render :show
24
- else
25
- render :show
26
- end
27
- end
28
- end
29
-
30
- #
31
- # signs the resource in, if the OTP token is valid and the user has a valid challenge
32
- #
33
- def update
34
-
35
- resource = resource_class.find_valid_otp_challenge(params[resource_name][:challenge])
36
- recovery = (params[resource_name][:recovery] == 'true') && recovery_enabled?
37
- token = params[resource_name][:token]
38
-
39
- if token.blank?
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)
43
- elsif resource.nil?
44
- otp_set_flash_message(:alert, :otp_session_invalid)
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)
50
-
51
- otp_refresh_credentials_for(resource)
52
- respond_with resource, :location => after_sign_in_path_for(resource)
53
- else
54
- otp_set_flash_message :alert, :token_invalid
55
- redirect_to new_session_path(resource_name)
56
- end
57
- end
58
- end
59
-
60
-
61
- #
62
- # displays the request for a credentials refresh
63
- #
64
- def get_refresh
65
- ensure_resource!
66
- render :refresh
67
- end
68
-
69
- #
70
- # lets the user through is the refresh is valid
71
- #
72
- def set_refresh
73
-
74
- ensure_resource!
75
- # I am sure there's a much better way
76
- if resource.valid_password?(params[resource_name][:refresh_password])
77
- if resource.otp_enabled?
78
- if resource.validate_otp_token(params[resource_name][:token])
79
- done_valid_refresh
80
- else
81
- failed_refresh
82
- end
83
- else
84
- done_valid_refresh
85
- end
86
- else
87
- failed_refresh
88
- end
89
- end
90
-
91
-
92
- private
93
-
94
- def done_valid_refresh
95
- otp_refresh_credentials_for(resource)
96
- otp_set_flash_message :success, :valid_refresh if is_navigational_format?
97
-
98
- respond_with resource, :location => otp_fetch_refresh_return_url
99
- end
100
-
101
- def failed_refresh
102
- otp_set_flash_message :alert, :invalid_refresh
103
- render :refresh
104
- end
105
-
106
- end
@@ -1,105 +0,0 @@
1
- class DeviseOtp::TokensController < DeviseController
2
- include Devise::Controllers::Helpers
3
-
4
- prepend_before_filter :ensure_credentials_refresh
5
- prepend_before_filter :authenticate_scope!
6
-
7
- #protect_from_forgery :except => [:clear_persistence, :delete_persistence]
8
-
9
- #
10
- # Displays the status of OTP authentication
11
- #
12
- def show
13
- if resource.nil?
14
- redirect_to stored_location_for(scope) || :root
15
- else
16
- render :show
17
- end
18
- end
19
-
20
- #
21
- # Updates the status of OTP authentication
22
- #
23
- def update
24
- #if resource.update_without_password(params[resource_name])
25
- if resource.update_attribute(:otp_enabled, params[resource_name][:otp_enabled])
26
-
27
- otp_set_flash_message :success, :successfully_updated
28
- render :show
29
- else
30
- render :show
31
- end
32
- end
33
-
34
- #
35
- # Resets OTP authentication, generates new credentials, sets it to off
36
- #
37
- def destroy
38
-
39
- if resource.reset_otp_credentials!
40
- otp_set_flash_message :success, :successfully_reset_creds
41
- end
42
- render :show
43
- end
44
-
45
-
46
- #
47
- # makes the current browser persistent
48
- #
49
- def get_persistence
50
-
51
-
52
- if otp_set_trusted_device_for(resource)
53
- otp_set_flash_message :success, :successfully_set_persistence
54
- end
55
- redirect_to :action => :show
56
- end
57
-
58
-
59
- #
60
- # clears persistence for the current browser
61
- #
62
- def clear_persistence
63
- if otp_clear_trusted_device_for(resource)
64
- otp_set_flash_message :success, :successfully_cleared_persistence
65
- end
66
-
67
- redirect_to :action => :show
68
- end
69
-
70
-
71
- #
72
- # rehash the persistence secret, thus, making all the persistence cookies invalid
73
- #
74
- def delete_persistence
75
- if otp_reset_persistence_for(resource)
76
- otp_set_flash_message :notice, :successfully_reset_persistence
77
- end
78
-
79
- redirect_to :action => :show
80
- end
81
-
82
- #
83
- #
84
- #
85
- def recovery
86
- render :recovery
87
- end
88
-
89
- private
90
-
91
- def ensure_credentials_refresh
92
-
93
- ensure_resource!
94
- if needs_credentials_refresh?(resource)
95
- otp_set_flash_message :notice, :need_to_refresh_credentials
96
- redirect_to refresh_otp_credential_path_for(resource)
97
- end
98
- end
99
-
100
- def scope
101
- resource_name.to_sym
102
- end
103
-
104
-
105
- end
@@ -1,20 +0,0 @@
1
- <h2><%= I18n.t('title', {:scope => 'devise.otp.credentials_refresh'}) %></h2>
2
- <p><%= I18n.t('explain', {:scope => 'devise.otp.credentials_refresh'}) %></p>
3
-
4
- <%= form_for(resource, :as => resource_name, :url => [:refresh, resource_name, :otp_credential], :html => { :method => :put }) do |f| %>
5
-
6
- <%= devise_error_messages! %>
7
-
8
- <div><%= f.label :email %><br />
9
- <%= f.text_field :email, :disabled => :true%></div>
10
-
11
- <div><%= f.label :password %><br />
12
- <%= f.password_field :refresh_password, :autocomplete => :off, :autofocus => true %></div>
13
-
14
- <%- if resource.otp_enabled? %>
15
- <div><%= f.label :token, I18n.t(:token, {:scope => 'devise.otp.credentials_refresh'}) %></p><br />
16
- <%= f.password_field :token, :autocomplete => :off%></div>
17
- <% end %>
18
-
19
- <div><%= f.submit I18n.t(:go_on, {:scope => 'devise.otp.credentials_refresh'}) %></div>
20
- <% end %>
@@ -1,23 +0,0 @@
1
- <h2><%= I18n.t('title', {:scope => 'devise.otp.submit_token'}) %></h2>
2
- <p><%= I18n.t('explain', {:scope => 'devise.otp.submit_token'}) %></p>
3
-
4
- <%= form_for(resource, :as => resource_name, :url => [resource_name, :otp_credential], :html => { :method => :put }) do |f| %>
5
-
6
- <%= f.hidden_field :challenge, {:value => @challenge} %>
7
- <%= f.hidden_field :recovery, {:value => @recovery} %>
8
-
9
- <%- if @recovery %>
10
- <p><%= f.label :token, I18n.t('recovery_prompt', {:scope => 'devise.otp.submit_token'}) %><br />
11
- <%= f.text_field :otp_recovery_counter, :autocomplete => :off, :disabled => true, :size => 4 %>
12
- <% else %>
13
- <p><%= f.label :token, I18n.t('prompt', {:scope => 'devise.otp.submit_token'}) %><br />
14
- <% end %>
15
-
16
- <%= f.text_field :token, :autocomplete => :off, :autofocus => true, :size => 6, :value => '' %>
17
- </p>
18
-
19
- <p><%= f.submit I18n.t('submit', {:scope => 'devise.otp.submit_token'}) %></p>
20
- <%- if !@recovery && resource_class.recovery_tokens %>
21
- <p><%= link_to I18n.t('recovery_link', {:scope => 'devise.otp.submit_token'}), otp_credential_path_for(resource_name, :challenge => @challenge, :recovery => true) %></p>
22
- <% end %>
23
- <% end %>
@@ -1,17 +0,0 @@
1
- <h3><%= I18n.t('title', {:scope => 'devise.otp.token_secret'}) %></h3>
2
- <p><%= I18n.t('explain', {:scope => 'devise.otp.token_secret'}) %></p>
3
-
4
- <%= otp_authenticator_token_image(resource) %>
5
-
6
- <p><strong><%= I18n.t('manual_provisioning', {:scope => 'devise.otp.token_secret'}) %>:</strong>
7
- <code><%= resource.otp_auth_secret %></code></p>
8
-
9
- <p><%= link_to I18n.t('reset_otp', {:scope => 'devise.otp.token_secret'}), @resource, :method => :delete %></p>
10
- <p><%= I18n.t('reset_explain', {:scope => 'devise.otp.token_secret'}) %>
11
- <strong><%= I18n.t('reset_explain_warn', {:scope => 'devise.otp.token_secret'}) %></strong></p>
12
-
13
- <%- if recovery_enabled? %>
14
- <h3><%= I18n.t('title', {:scope => 'devise.otp.tokens.recovery'}) %></h3>
15
- <p><%= I18n.t('explain', {:scope => 'devise.otp.tokens.recovery'}) %></p>
16
- <p><%= link_to I18n.t('codes_list', {:scope => 'devise.otp.tokens.recovery'}), recovery_otp_token_for(resource_name) %></p>
17
- <% end %>
@@ -1,21 +0,0 @@
1
- <h2><%= I18n.t('title', {:scope => 'devise.otp.tokens.recovery'}) %></h2>
2
- <p><%= I18n.t('explain', {:scope => 'devise.otp.tokens.recovery'}) %></p>
3
-
4
- <table>
5
- <caption>
6
- <thead>
7
- <tr>
8
- <th><%= I18n.t('sequence', {:scope => 'devise.otp.tokens.recovery'}) %></th>
9
- <th><%= I18n.t('code', {:scope => 'devise.otp.tokens.recovery'}) %></th>
10
- </tr>
11
- </thead>
12
- <tbody>
13
- <%- resource.next_otp_recovery_tokens.each do |seq, code| %>
14
- <tr>
15
- <td><%= seq %></td>
16
- <td><%= code %></td>
17
- </tr>
18
- <% end %>
19
- </tbody>
20
- </caption>
21
- </table>
@@ -1,31 +0,0 @@
1
- <h2><%= I18n.t('title', {:scope => 'devise.otp.tokens'}) %></h2>
2
- <p><%= I18n.t('caption', {:scope => 'devise.otp.tokens'}) %></p>
3
-
4
- <p><%= I18n.t('explain', {:scope => 'devise.otp.tokens'}) %></p>
5
-
6
- <%= form_for(resource, :as => resource_name, :url => [resource_name, :otp_token], :html => { :method => :put }) do |f| %>
7
-
8
- <%= devise_error_messages! %>
9
-
10
- <h3><%= I18n.t('enable_request', {:scope => 'devise.otp.tokens'}) %></h3>
11
-
12
- <p><%= f.label :otp_enabled, I18n.t('status', {:scope => 'devise.otp.tokens'}) %><br />
13
- <%= f.check_box :otp_enabled %></p>
14
-
15
- <p><%= f.submit I18n.t('submit', {:scope => 'devise.otp.tokens'}) %></p>
16
- <% end %>
17
-
18
- <%- if resource.otp_enabled? %>
19
- <%= render :partial => 'token_secret' if resource.otp_enabled? %>
20
-
21
- <h3><%= I18n.t('title', {:scope => 'devise.otp.trusted_devices'}) %></h3>
22
- <p><%= I18n.t('explain', {:scope => 'devise.otp.trusted_devices'}) %></p>
23
- <%- if is_otp_trusted_device_for? resource %>
24
- <p><em><%= I18n.t('device_trusted', {:scope => 'devise.otp.trusted_devices'}) %></em></p>
25
- <p><%= link_to I18n.t('trust_remove', {:scope => 'devise.otp.trusted_devices'}), persistence_otp_token_path_for(resource_name), :method => :post %></p>
26
- <% else %>
27
- <p><%= I18n.t('device_not_trusted', {:scope => 'devise.otp.trusted_devices'}) %></p>
28
- <p><%= link_to I18n.t('trust_add', {:scope => 'devise.otp.trusted_devices'}), persistence_otp_token_path_for(resource_name) %></p>
29
- <% end %>
30
- <p><%= link_to I18n.t('trust_clear', {:scope => 'devise.otp.trusted_devices'}), persistence_otp_token_path_for(resource_name), :method => :delete %></p>
31
- <% end %>
@@ -1,19 +0,0 @@
1
- module DeviseOtpAuthenticatable
2
-
3
- module Mapping
4
-
5
- def self.included(base)
6
- base.alias_method_chain :default_controllers, :otp
7
- end
8
-
9
- private
10
- def default_controllers_with_otp(options)
11
- options[:controllers] ||= {}
12
-
13
- options[:controllers][:otp_tokens] ||= "tokens"
14
- options[:controllers][:otp_credentials] ||= "credentials"
15
-
16
- default_controllers_without_otp(options)
17
- end
18
- end
19
- end