rails_base 0.75.6 → 0.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/rails_base/rails_base_query_checker.js +36 -0
- data/app/controllers/rails_base/admin_controller.rb +54 -9
- data/app/controllers/rails_base/mfa/evaluation_controller.rb +59 -0
- data/app/controllers/rails_base/mfa/register/sms_controller.rb +45 -0
- data/app/controllers/rails_base/mfa/register/totp_controller.rb +42 -0
- data/app/controllers/rails_base/mfa/validate/sms_controller.rb +83 -0
- data/app/controllers/rails_base/mfa/validate/totp_controller.rb +35 -0
- data/app/controllers/rails_base/secondary_authentication_controller.rb +40 -96
- data/app/controllers/rails_base/user_settings_controller.rb +11 -1
- data/app/controllers/rails_base/users/registrations_controller.rb +1 -1
- data/app/controllers/rails_base/users/sessions_controller.rb +17 -11
- data/app/controllers/rails_base_application_controller.rb +96 -1
- data/app/jobs/twilio_job.rb +1 -1
- data/app/mailers/rails_base/email_verification_mailer.rb +6 -4
- data/app/mailers/rails_base/event_mailer.rb +4 -2
- data/app/mailers/rails_base/mailer_kwarg_inject.rb +31 -0
- data/app/models/rails_base/user_constants.rb +6 -3
- data/app/models/rails_base/user_helper/totp/backup_method_options.rb +33 -0
- data/app/models/rails_base/user_helper/totp/class_options.rb +35 -0
- data/app/models/rails_base/user_helper/totp/consume_method_options.rb +60 -0
- data/app/models/rails_base/user_helper/totp.rb +41 -0
- data/app/models/user.rb +28 -13
- data/app/services/rails_base/authentication/constants.rb +1 -1
- data/app/services/rails_base/authentication/decision_twofa_type.rb +63 -30
- data/app/services/rails_base/authentication/send_forgot_password.rb +0 -1
- data/app/services/rails_base/authentication/single_sign_on_send.rb +1 -1
- data/app/services/rails_base/authentication/sso_verify_email.rb +3 -1
- data/app/services/rails_base/authentication/update_phone_send_verification.rb +2 -2
- data/app/services/rails_base/authentication/verify_forgot_password.rb +8 -11
- data/app/services/rails_base/mfa/decision.rb +70 -0
- data/app/services/rails_base/mfa/encrypt_token.rb +34 -0
- data/app/services/rails_base/mfa/sms/remove.rb +35 -0
- data/app/services/rails_base/{authentication/send_login_mfa_to_user.rb → mfa/sms/send.rb} +19 -13
- data/app/services/rails_base/mfa/sms/validate.rb +105 -0
- data/app/services/rails_base/mfa/strategy/base.rb +44 -0
- data/app/services/rails_base/mfa/strategy/every_request.rb +14 -0
- data/app/services/rails_base/mfa/strategy/skip_every_request.rb +14 -0
- data/app/services/rails_base/mfa/strategy/time_based.rb +24 -0
- data/app/services/rails_base/mfa/totp/helper.rb +21 -0
- data/app/services/rails_base/mfa/totp/otp_metadata.rb +19 -0
- data/app/services/rails_base/mfa/totp/remove.rb +40 -0
- data/app/services/rails_base/mfa/totp/validate_code.rb +52 -0
- data/app/services/rails_base/mfa/totp/validate_temporary_code.rb +37 -0
- data/app/services/rails_base/mfa.rb +18 -0
- data/app/services/rails_base/name_change.rb +3 -3
- data/app/views/layouts/rails_base/application.html.erb +10 -6
- data/app/views/rails_base/devise/passwords/new.html.erb +1 -1
- data/app/views/rails_base/mfa/_switch_mfa_type.html.erb +17 -0
- data/app/views/rails_base/mfa/validate/sms/sms_event_input.html.erb +2 -0
- data/app/views/rails_base/mfa/validate/totp/totp_event_input.html.erb +1 -0
- data/app/views/rails_base/secondary_authentication/reset_password_input.html.erb +4 -0
- data/app/views/rails_base/shared/_enable_mfa_auth_modal.html.erb +1 -1
- data/app/views/rails_base/shared/_logged_in_header.html.erb +1 -25
- data/app/views/rails_base/shared/_modify_mfa_auth_modal.html.erb +102 -3
- data/app/views/rails_base/shared/_request_link_alert.html.erb +48 -0
- data/app/views/rails_base/shared/mfa/sms/_login_input.html.erb +13 -0
- data/app/views/rails_base/shared/mfa/totp/_login_input.html.erb +22 -0
- data/app/views/rails_base/shared/totp/_add_authenticator.html.erb +76 -0
- data/app/views/rails_base/shared/totp/_add_authenticator_modal.html.erb +25 -0
- data/app/views/rails_base/shared/totp/_confirm_code.html.erb +31 -0
- data/app/views/rails_base/shared/totp/_confirm_code_ajax.html.erb +3 -0
- data/app/views/rails_base/shared/totp/_confirm_code_rest.html.erb +5 -0
- data/app/views/rails_base/shared/totp/_remove_authenticator_modal.html.erb +50 -0
- data/app/views/rails_base/user_settings/index.html.erb +102 -3
- data/config/initializers/admin_action_helper.rb +44 -8
- data/config/routes.rb +42 -7
- data/db/migrate/20240808013706_add_totp_to_users.rb +9 -0
- data/db/migrate/20240825012724_reconfigure_mfa_variable_names.rb +10 -0
- data/lib/rails_base/admin/action_helper.rb +0 -1
- data/lib/rails_base/admin/default_index_tile.rb +3 -3
- data/lib/rails_base/config.rb +26 -22
- data/lib/rails_base/configuration/admin.rb +5 -5
- data/lib/rails_base/configuration/base.rb +1 -0
- data/lib/rails_base/configuration/mfa.rb +27 -60
- data/lib/rails_base/configuration/totp.rb +82 -0
- data/lib/rails_base/configuration/twilio.rb +85 -0
- data/lib/rails_base/mfa_event.rb +186 -0
- data/lib/rails_base/request_link.rb +27 -0
- data/lib/rails_base/version.rb +3 -3
- data/lib/rails_base.rb +2 -0
- data/lib/twilio_helper.rb +3 -3
- metadata +131 -64
- data/app/controllers/rails_base/mfa_auth_controller.rb +0 -50
- data/app/services/rails_base/authentication/mfa_set_encrypt_token.rb +0 -32
- data/app/services/rails_base/authentication/mfa_validator.rb +0 -88
- data/app/views/rails_base/mfa_auth/mfa_code.html.erb +0 -11
- data/app/views/rails_base/secondary_authentication/forgot_password.html.erb +0 -9
metadata
CHANGED
@@ -1,45 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.81.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Taylor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: allow_numeric
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bootstrap
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 4.6.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 4.6.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: browser
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: coffee-rails
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: devise
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: dotiw
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: interactor
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -129,63 +129,91 @@ dependencies:
|
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: 4.3.3
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
|
-
name:
|
132
|
+
name: jquery_mask_rails
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
|
-
- - "
|
135
|
+
- - ">="
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: 0
|
137
|
+
version: '0'
|
138
138
|
type: :runtime
|
139
139
|
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
|
-
- - "
|
142
|
+
- - ">="
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: 0
|
144
|
+
version: '0'
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
|
-
name:
|
146
|
+
name: mysql2
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
type: :runtime
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: rails
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '6'
|
166
|
+
type: :runtime
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '6'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: rails-ujs
|
147
175
|
requirement: !ruby/object:Gem::Requirement
|
148
176
|
requirements:
|
149
177
|
- - "~>"
|
150
178
|
- !ruby/object:Gem::Version
|
151
|
-
version:
|
179
|
+
version: 0.1.0
|
152
180
|
type: :runtime
|
153
181
|
prerelease: false
|
154
182
|
version_requirements: !ruby/object:Gem::Requirement
|
155
183
|
requirements:
|
156
184
|
- - "~>"
|
157
185
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
186
|
+
version: 0.1.0
|
159
187
|
- !ruby/object:Gem::Dependency
|
160
|
-
name:
|
188
|
+
name: redis
|
161
189
|
requirement: !ruby/object:Gem::Requirement
|
162
190
|
requirements:
|
163
191
|
- - ">="
|
164
192
|
- !ruby/object:Gem::Version
|
165
|
-
version:
|
193
|
+
version: 4.2.5
|
166
194
|
type: :runtime
|
167
195
|
prerelease: false
|
168
196
|
version_requirements: !ruby/object:Gem::Requirement
|
169
197
|
requirements:
|
170
198
|
- - ">="
|
171
199
|
- !ruby/object:Gem::Version
|
172
|
-
version:
|
200
|
+
version: 4.2.5
|
173
201
|
- !ruby/object:Gem::Dependency
|
174
|
-
name:
|
202
|
+
name: redis-namespace
|
175
203
|
requirement: !ruby/object:Gem::Requirement
|
176
204
|
requirements:
|
177
205
|
- - ">="
|
178
206
|
- !ruby/object:Gem::Version
|
179
|
-
version:
|
207
|
+
version: 1.8.1
|
180
208
|
type: :runtime
|
181
209
|
prerelease: false
|
182
210
|
version_requirements: !ruby/object:Gem::Requirement
|
183
211
|
requirements:
|
184
212
|
- - ">="
|
185
213
|
- !ruby/object:Gem::Version
|
186
|
-
version:
|
214
|
+
version: 1.8.1
|
187
215
|
- !ruby/object:Gem::Dependency
|
188
|
-
name:
|
216
|
+
name: rotp
|
189
217
|
requirement: !ruby/object:Gem::Requirement
|
190
218
|
requirements:
|
191
219
|
- - ">="
|
@@ -199,7 +227,7 @@ dependencies:
|
|
199
227
|
- !ruby/object:Gem::Version
|
200
228
|
version: '0'
|
201
229
|
- !ruby/object:Gem::Dependency
|
202
|
-
name:
|
230
|
+
name: rqrcode
|
203
231
|
requirement: !ruby/object:Gem::Requirement
|
204
232
|
requirements:
|
205
233
|
- - ">="
|
@@ -213,7 +241,7 @@ dependencies:
|
|
213
241
|
- !ruby/object:Gem::Version
|
214
242
|
version: '0'
|
215
243
|
- !ruby/object:Gem::Dependency
|
216
|
-
name:
|
244
|
+
name: sass-rails
|
217
245
|
requirement: !ruby/object:Gem::Requirement
|
218
246
|
requirements:
|
219
247
|
- - ">="
|
@@ -227,7 +255,7 @@ dependencies:
|
|
227
255
|
- !ruby/object:Gem::Version
|
228
256
|
version: '0'
|
229
257
|
- !ruby/object:Gem::Dependency
|
230
|
-
name:
|
258
|
+
name: switch_user
|
231
259
|
requirement: !ruby/object:Gem::Requirement
|
232
260
|
requirements:
|
233
261
|
- - ">="
|
@@ -241,7 +269,7 @@ dependencies:
|
|
241
269
|
- !ruby/object:Gem::Version
|
242
270
|
version: '0'
|
243
271
|
- !ruby/object:Gem::Dependency
|
244
|
-
name:
|
272
|
+
name: turbolinks
|
245
273
|
requirement: !ruby/object:Gem::Requirement
|
246
274
|
requirements:
|
247
275
|
- - ">="
|
@@ -255,47 +283,47 @@ dependencies:
|
|
255
283
|
- !ruby/object:Gem::Version
|
256
284
|
version: '0'
|
257
285
|
- !ruby/object:Gem::Dependency
|
258
|
-
name:
|
286
|
+
name: twilio-ruby
|
259
287
|
requirement: !ruby/object:Gem::Requirement
|
260
288
|
requirements:
|
261
289
|
- - ">="
|
262
290
|
- !ruby/object:Gem::Version
|
263
|
-
version:
|
291
|
+
version: '0'
|
264
292
|
type: :runtime
|
265
293
|
prerelease: false
|
266
294
|
version_requirements: !ruby/object:Gem::Requirement
|
267
295
|
requirements:
|
268
296
|
- - ">="
|
269
297
|
- !ruby/object:Gem::Version
|
270
|
-
version:
|
298
|
+
version: '0'
|
271
299
|
- !ruby/object:Gem::Dependency
|
272
|
-
name:
|
300
|
+
name: uglifier
|
273
301
|
requirement: !ruby/object:Gem::Requirement
|
274
302
|
requirements:
|
275
303
|
- - ">="
|
276
304
|
- !ruby/object:Gem::Version
|
277
|
-
version:
|
305
|
+
version: '0'
|
278
306
|
type: :runtime
|
279
307
|
prerelease: false
|
280
308
|
version_requirements: !ruby/object:Gem::Requirement
|
281
309
|
requirements:
|
282
310
|
- - ">="
|
283
311
|
- !ruby/object:Gem::Version
|
284
|
-
version:
|
312
|
+
version: '0'
|
285
313
|
- !ruby/object:Gem::Dependency
|
286
|
-
name:
|
314
|
+
name: zeitwerk
|
287
315
|
requirement: !ruby/object:Gem::Requirement
|
288
316
|
requirements:
|
289
317
|
- - ">="
|
290
318
|
- !ruby/object:Gem::Version
|
291
|
-
version:
|
319
|
+
version: 2.6.5
|
292
320
|
type: :runtime
|
293
321
|
prerelease: false
|
294
322
|
version_requirements: !ruby/object:Gem::Requirement
|
295
323
|
requirements:
|
296
324
|
- - ">="
|
297
325
|
- !ruby/object:Gem::Version
|
298
|
-
version:
|
326
|
+
version: 2.6.5
|
299
327
|
- !ruby/object:Gem::Dependency
|
300
328
|
name: annotate
|
301
329
|
requirement: !ruby/object:Gem::Requirement
|
@@ -311,21 +339,21 @@ dependencies:
|
|
311
339
|
- !ruby/object:Gem::Version
|
312
340
|
version: '0'
|
313
341
|
- !ruby/object:Gem::Dependency
|
314
|
-
name:
|
342
|
+
name: capybara
|
315
343
|
requirement: !ruby/object:Gem::Requirement
|
316
344
|
requirements:
|
317
345
|
- - ">="
|
318
346
|
- !ruby/object:Gem::Version
|
319
|
-
version: '
|
347
|
+
version: '2.15'
|
320
348
|
type: :development
|
321
349
|
prerelease: false
|
322
350
|
version_requirements: !ruby/object:Gem::Requirement
|
323
351
|
requirements:
|
324
352
|
- - ">="
|
325
353
|
- !ruby/object:Gem::Version
|
326
|
-
version: '
|
354
|
+
version: '2.15'
|
327
355
|
- !ruby/object:Gem::Dependency
|
328
|
-
name:
|
356
|
+
name: listen
|
329
357
|
requirement: !ruby/object:Gem::Requirement
|
330
358
|
requirements:
|
331
359
|
- - ">="
|
@@ -339,7 +367,7 @@ dependencies:
|
|
339
367
|
- !ruby/object:Gem::Version
|
340
368
|
version: '0'
|
341
369
|
- !ruby/object:Gem::Dependency
|
342
|
-
name:
|
370
|
+
name: pry
|
343
371
|
requirement: !ruby/object:Gem::Requirement
|
344
372
|
requirements:
|
345
373
|
- - ">="
|
@@ -353,7 +381,7 @@ dependencies:
|
|
353
381
|
- !ruby/object:Gem::Version
|
354
382
|
version: '0'
|
355
383
|
- !ruby/object:Gem::Dependency
|
356
|
-
name:
|
384
|
+
name: pry-nav
|
357
385
|
requirement: !ruby/object:Gem::Requirement
|
358
386
|
requirements:
|
359
387
|
- - ">="
|
@@ -367,7 +395,7 @@ dependencies:
|
|
367
395
|
- !ruby/object:Gem::Version
|
368
396
|
version: '0'
|
369
397
|
- !ruby/object:Gem::Dependency
|
370
|
-
name: pry
|
398
|
+
name: pry-stack_explorer
|
371
399
|
requirement: !ruby/object:Gem::Requirement
|
372
400
|
requirements:
|
373
401
|
- - ">="
|
@@ -381,7 +409,7 @@ dependencies:
|
|
381
409
|
- !ruby/object:Gem::Version
|
382
410
|
version: '0'
|
383
411
|
- !ruby/object:Gem::Dependency
|
384
|
-
name:
|
412
|
+
name: spring
|
385
413
|
requirement: !ruby/object:Gem::Requirement
|
386
414
|
requirements:
|
387
415
|
- - ">="
|
@@ -395,7 +423,7 @@ dependencies:
|
|
395
423
|
- !ruby/object:Gem::Version
|
396
424
|
version: '0'
|
397
425
|
- !ruby/object:Gem::Dependency
|
398
|
-
name:
|
426
|
+
name: spring-watcher-listen
|
399
427
|
requirement: !ruby/object:Gem::Requirement
|
400
428
|
requirements:
|
401
429
|
- - ">="
|
@@ -409,19 +437,19 @@ dependencies:
|
|
409
437
|
- !ruby/object:Gem::Version
|
410
438
|
version: '0'
|
411
439
|
- !ruby/object:Gem::Dependency
|
412
|
-
name:
|
440
|
+
name: web-console
|
413
441
|
requirement: !ruby/object:Gem::Requirement
|
414
442
|
requirements:
|
415
443
|
- - ">="
|
416
444
|
- !ruby/object:Gem::Version
|
417
|
-
version: '
|
445
|
+
version: '0'
|
418
446
|
type: :development
|
419
447
|
prerelease: false
|
420
448
|
version_requirements: !ruby/object:Gem::Requirement
|
421
449
|
requirements:
|
422
450
|
- - ">="
|
423
451
|
- !ruby/object:Gem::Version
|
424
|
-
version: '
|
452
|
+
version: '0'
|
425
453
|
description: Rails Engine that handles authentication, admin, 2fa, audit tracking,
|
426
454
|
with insane configuration abilites
|
427
455
|
email:
|
@@ -438,6 +466,7 @@ files:
|
|
438
466
|
- app/assets/javascripts/rails_base/admin.js
|
439
467
|
- app/assets/javascripts/rails_base/application.js
|
440
468
|
- app/assets/javascripts/rails_base/mfa_auth.coffee
|
469
|
+
- app/assets/javascripts/rails_base/rails_base_query_checker.js
|
441
470
|
- app/assets/javascripts/rails_base/secondary_authentication.coffee
|
442
471
|
- app/assets/javascripts/rails_base/sessions.js
|
443
472
|
- app/assets/javascripts/rails_base/user_settings.coffee
|
@@ -449,7 +478,11 @@ files:
|
|
449
478
|
- app/assets/stylesheets/rails_base/user_settings.scss
|
450
479
|
- app/controllers/rails_base/admin_controller.rb
|
451
480
|
- app/controllers/rails_base/errors_controller.rb
|
452
|
-
- app/controllers/rails_base/
|
481
|
+
- app/controllers/rails_base/mfa/evaluation_controller.rb
|
482
|
+
- app/controllers/rails_base/mfa/register/sms_controller.rb
|
483
|
+
- app/controllers/rails_base/mfa/register/totp_controller.rb
|
484
|
+
- app/controllers/rails_base/mfa/validate/sms_controller.rb
|
485
|
+
- app/controllers/rails_base/mfa/validate/totp_controller.rb
|
453
486
|
- app/controllers/rails_base/secondary_authentication_controller.rb
|
454
487
|
- app/controllers/rails_base/switch_user_controller.rb
|
455
488
|
- app/controllers/rails_base/user_settings_controller.rb
|
@@ -470,9 +503,14 @@ files:
|
|
470
503
|
- app/mailers/rails_base/application_mailer.rb
|
471
504
|
- app/mailers/rails_base/email_verification_mailer.rb
|
472
505
|
- app/mailers/rails_base/event_mailer.rb
|
506
|
+
- app/mailers/rails_base/mailer_kwarg_inject.rb
|
473
507
|
- app/models/admin_action.rb
|
474
508
|
- app/models/rails_base/application_record.rb
|
475
509
|
- app/models/rails_base/user_constants.rb
|
510
|
+
- app/models/rails_base/user_helper/totp.rb
|
511
|
+
- app/models/rails_base/user_helper/totp/backup_method_options.rb
|
512
|
+
- app/models/rails_base/user_helper/totp/class_options.rb
|
513
|
+
- app/models/rails_base/user_helper/totp/consume_method_options.rb
|
476
514
|
- app/models/secret.rb
|
477
515
|
- app/models/short_lived_data.rb
|
478
516
|
- app/models/user.rb
|
@@ -482,11 +520,8 @@ files:
|
|
482
520
|
- app/services/rails_base/authentication/constants.rb
|
483
521
|
- app/services/rails_base/authentication/decision_twofa_type.rb
|
484
522
|
- app/services/rails_base/authentication/destroy_user.rb
|
485
|
-
- app/services/rails_base/authentication/mfa_set_encrypt_token.rb
|
486
|
-
- app/services/rails_base/authentication/mfa_validator.rb
|
487
523
|
- app/services/rails_base/authentication/modify_password.rb
|
488
524
|
- app/services/rails_base/authentication/send_forgot_password.rb
|
489
|
-
- app/services/rails_base/authentication/send_login_mfa_to_user.rb
|
490
525
|
- app/services/rails_base/authentication/send_verification_email.rb
|
491
526
|
- app/services/rails_base/authentication/session_token_verifier.rb
|
492
527
|
- app/services/rails_base/authentication/single_sign_on_create.rb
|
@@ -497,6 +532,21 @@ files:
|
|
497
532
|
- app/services/rails_base/authentication/verify_forgot_password.rb
|
498
533
|
- app/services/rails_base/email_change.rb
|
499
534
|
- app/services/rails_base/encryption.rb
|
535
|
+
- app/services/rails_base/mfa.rb
|
536
|
+
- app/services/rails_base/mfa/decision.rb
|
537
|
+
- app/services/rails_base/mfa/encrypt_token.rb
|
538
|
+
- app/services/rails_base/mfa/sms/remove.rb
|
539
|
+
- app/services/rails_base/mfa/sms/send.rb
|
540
|
+
- app/services/rails_base/mfa/sms/validate.rb
|
541
|
+
- app/services/rails_base/mfa/strategy/base.rb
|
542
|
+
- app/services/rails_base/mfa/strategy/every_request.rb
|
543
|
+
- app/services/rails_base/mfa/strategy/skip_every_request.rb
|
544
|
+
- app/services/rails_base/mfa/strategy/time_based.rb
|
545
|
+
- app/services/rails_base/mfa/totp/helper.rb
|
546
|
+
- app/services/rails_base/mfa/totp/otp_metadata.rb
|
547
|
+
- app/services/rails_base/mfa/totp/remove.rb
|
548
|
+
- app/services/rails_base/mfa/totp/validate_code.rb
|
549
|
+
- app/services/rails_base/mfa/totp/validate_temporary_code.rb
|
500
550
|
- app/services/rails_base/name_change.rb
|
501
551
|
- app/services/rails_base/service_base.rb
|
502
552
|
- app/services/rails_base/service_logging.rb
|
@@ -528,10 +578,12 @@ files:
|
|
528
578
|
- app/views/rails_base/errors/not_found.html.erb
|
529
579
|
- app/views/rails_base/errors/unacceptable.html.erb
|
530
580
|
- app/views/rails_base/event_mailer/event.html.erb
|
531
|
-
- app/views/rails_base/
|
581
|
+
- app/views/rails_base/mfa/_switch_mfa_type.html.erb
|
582
|
+
- app/views/rails_base/mfa/validate/sms/sms_event_input.html.erb
|
583
|
+
- app/views/rails_base/mfa/validate/totp/totp_event_input.html.erb
|
532
584
|
- app/views/rails_base/secondary_authentication/after_email_login_session_new.html.erb
|
533
|
-
- app/views/rails_base/secondary_authentication/forgot_password.html.erb
|
534
585
|
- app/views/rails_base/secondary_authentication/remove_me.html.erb
|
586
|
+
- app/views/rails_base/secondary_authentication/reset_password_input.html.erb
|
535
587
|
- app/views/rails_base/secondary_authentication/static.html.erb
|
536
588
|
- app/views/rails_base/shared/_admin_actions_modal.html.erb
|
537
589
|
- app/views/rails_base/shared/_admin_config_class.html.erb
|
@@ -556,10 +608,19 @@ files:
|
|
556
608
|
- app/views/rails_base/shared/_mfa_input_layout_fallback.html.erb
|
557
609
|
- app/views/rails_base/shared/_modify_mfa_auth_modal.html.erb
|
558
610
|
- app/views/rails_base/shared/_password_confirm_javascript.html.erb
|
611
|
+
- app/views/rails_base/shared/_request_link_alert.html.erb
|
559
612
|
- app/views/rails_base/shared/_reset_password_form.html.erb
|
560
613
|
- app/views/rails_base/shared/_session_create_form.html.erb
|
561
614
|
- app/views/rails_base/shared/_session_timeout_modal.html.erb
|
562
615
|
- app/views/rails_base/shared/_standardized_collapse.html.erb
|
616
|
+
- app/views/rails_base/shared/mfa/sms/_login_input.html.erb
|
617
|
+
- app/views/rails_base/shared/mfa/totp/_login_input.html.erb
|
618
|
+
- app/views/rails_base/shared/totp/_add_authenticator.html.erb
|
619
|
+
- app/views/rails_base/shared/totp/_add_authenticator_modal.html.erb
|
620
|
+
- app/views/rails_base/shared/totp/_confirm_code.html.erb
|
621
|
+
- app/views/rails_base/shared/totp/_confirm_code_ajax.html.erb
|
622
|
+
- app/views/rails_base/shared/totp/_confirm_code_rest.html.erb
|
623
|
+
- app/views/rails_base/shared/totp/_remove_authenticator_modal.html.erb
|
563
624
|
- app/views/rails_base/switch_user/_widget.html.erb
|
564
625
|
- app/views/rails_base/user_settings/_confirm_destroy_user.html.erb
|
565
626
|
- app/views/rails_base/user_settings/_destroy_user.html.erb
|
@@ -581,6 +642,8 @@ files:
|
|
581
642
|
- db/migrate/20210212190537_create_rails_base_short_lived_data.rb
|
582
643
|
- db/migrate/20210212192645_create_rails_base_secrets.rb
|
583
644
|
- db/migrate/20210406015744_create_rails_base_admin_actions.rb
|
645
|
+
- db/migrate/20240808013706_add_totp_to_users.rb
|
646
|
+
- db/migrate/20240825012724_reconfigure_mfa_variable_names.rb
|
584
647
|
- db/seeds.rb
|
585
648
|
- lib/link_decision_helper.rb
|
586
649
|
- lib/rails_base.rb
|
@@ -620,8 +683,12 @@ files:
|
|
620
683
|
- lib/rails_base/configuration/owner.rb
|
621
684
|
- lib/rails_base/configuration/redis.rb
|
622
685
|
- lib/rails_base/configuration/templates.rb
|
686
|
+
- lib/rails_base/configuration/totp.rb
|
687
|
+
- lib/rails_base/configuration/twilio.rb
|
623
688
|
- lib/rails_base/configuration/user.rb
|
624
689
|
- lib/rails_base/engine.rb
|
690
|
+
- lib/rails_base/mfa_event.rb
|
691
|
+
- lib/rails_base/request_link.rb
|
625
692
|
- lib/rails_base/switch_user_helper.rb
|
626
693
|
- lib/rails_base/version.rb
|
627
694
|
- lib/tasks/rails_base_tasks.rake
|
@@ -637,16 +704,16 @@ require_paths:
|
|
637
704
|
- lib
|
638
705
|
required_ruby_version: !ruby/object:Gem::Requirement
|
639
706
|
requirements:
|
640
|
-
- - "
|
707
|
+
- - "~>"
|
641
708
|
- !ruby/object:Gem::Version
|
642
|
-
version: '
|
709
|
+
version: '3.2'
|
643
710
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
644
711
|
requirements:
|
645
712
|
- - ">="
|
646
713
|
- !ruby/object:Gem::Version
|
647
714
|
version: '0'
|
648
715
|
requirements: []
|
649
|
-
rubygems_version: 3.
|
716
|
+
rubygems_version: 3.5.9
|
650
717
|
signing_key:
|
651
718
|
specification_version: 4
|
652
719
|
summary: Rails engine that takes care of the stuff you dont want to!
|
@@ -1,50 +0,0 @@
|
|
1
|
-
module RailsBase
|
2
|
-
class MfaAuthController < RailsBaseApplicationController
|
3
|
-
before_action :validate_token, only: [:mfa_code, :mfa_code_verify, :resend_mfa]
|
4
|
-
|
5
|
-
# GET /mfa_verify
|
6
|
-
def mfa_code
|
7
|
-
@masked_phone = User.find(@token_verifier.user_id).masked_phone
|
8
|
-
end
|
9
|
-
|
10
|
-
# POST /mfa_verify
|
11
|
-
def mfa_code_verify
|
12
|
-
mfa_validity = RailsBase::Authentication::MfaValidator.call(params: params, session_mfa_user_id: @token_verifier.user_id)
|
13
|
-
if mfa_validity.failure?
|
14
|
-
redirect_to(mfa_validity.redirect_url, alert: mfa_validity.message)
|
15
|
-
return
|
16
|
-
end
|
17
|
-
|
18
|
-
mfa_validity.user.set_last_mfa_login!
|
19
|
-
|
20
|
-
sign_in(mfa_validity.user)
|
21
|
-
redirect_to RailsBase.url_routes.authenticated_root_path, notice: "Welcome #{mfa_validity.user.full_name}"
|
22
|
-
end
|
23
|
-
|
24
|
-
# POST /mfa_verify
|
25
|
-
def resend_mfa
|
26
|
-
user = User.find(@token_verifier.user_id)
|
27
|
-
mfa_token = RailsBase::Authentication::SendLoginMfaToUser.call(user: user)
|
28
|
-
if mfa_token.failure?
|
29
|
-
flash[:error] = mfa_token.message
|
30
|
-
session[:mfa_randomized_token] = nil
|
31
|
-
redirect_to RailsBase.url_routes.new_user_session_path, email: params.dig(:user,:email), alert: mfa_token.message
|
32
|
-
return
|
33
|
-
end
|
34
|
-
expired_at = Time.zone.parse(@token_verifier.expires_at)
|
35
|
-
session[:mfa_randomized_token] =
|
36
|
-
RailsBase::Authentication::MfaSetEncryptToken.call(user: user, expires_at: expired_at).encrypted_val
|
37
|
-
|
38
|
-
redirect_to RailsBase.url_routes.mfa_code_path, notice: "MFA has been sent via SMS to number on file"
|
39
|
-
end
|
40
|
-
|
41
|
-
def validate_token
|
42
|
-
@token_verifier =
|
43
|
-
RailsBase::Authentication::SessionTokenVerifier.call(mfa_randomized_token: session[:mfa_randomized_token])
|
44
|
-
return if @token_verifier.success?
|
45
|
-
|
46
|
-
redirect_to RailsBase.url_routes.new_user_session_path, alert: @token_verifier.message
|
47
|
-
return false
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module RailsBase::Authentication
|
2
|
-
class MfaSetEncryptToken < RailsBase::ServiceBase
|
3
|
-
delegate :user, to: :context
|
4
|
-
delegate :expires_at, to: :context
|
5
|
-
delegate :purpose, to: :context
|
6
|
-
|
7
|
-
def call
|
8
|
-
params = {
|
9
|
-
value: value,
|
10
|
-
purpose: purpose || Constants::MSET_PURPOSE,
|
11
|
-
expires_at: expires_at
|
12
|
-
}
|
13
|
-
|
14
|
-
context.encrypted_val = RailsBase::Encryption.encode(**params)
|
15
|
-
end
|
16
|
-
|
17
|
-
def value
|
18
|
-
# user_id with the same expires_at will return the same Encryption token
|
19
|
-
# to overcome this, do 2 things
|
20
|
-
# 1: Rotate the secret on every boot (ensures tplem changes on semi regular basis)
|
21
|
-
# 2: Add rand strings to the hash -- Ensures the token is different every time
|
22
|
-
{ user_id: user.id, rand: rand.to_s, expires_at: expires_at }.to_json
|
23
|
-
end
|
24
|
-
|
25
|
-
def validate!
|
26
|
-
raise "Expected user to be a User. Received #{user.class}" unless user.is_a? User
|
27
|
-
|
28
|
-
time_class = ActiveSupport::TimeWithZone
|
29
|
-
raise "Expected expires_at to be a Received #{time_class}. Received #{expires_at.class}" unless expires_at.is_a? time_class
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|