devise-twilio-verify 0.1.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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.github/workflows/build.yml +32 -0
  4. data/.gitignore +45 -0
  5. data/.rspec +2 -0
  6. data/Appraisals +22 -0
  7. data/CHANGELOG.md +15 -0
  8. data/Gemfile +3 -0
  9. data/LICENSE.txt +20 -0
  10. data/README.md +266 -0
  11. data/Rakefile +29 -0
  12. data/app/assets/javascripts/devise_twilio_verify.js +12 -0
  13. data/app/assets/stylesheets/devise_twilio_verify.css +26 -0
  14. data/app/assets/stylesheets/devise_twilio_verify.sass +24 -0
  15. data/app/controllers/devise/devise_twilio_verify_controller.rb +183 -0
  16. data/app/controllers/devise_twilio_verify/passwords_controller.rb +30 -0
  17. data/app/services/twilio_verify_service.rb +66 -0
  18. data/app/views/devise/enable_twilio_verify.html.erb +7 -0
  19. data/app/views/devise/enable_twilio_verify.html.haml +5 -0
  20. data/app/views/devise/verify_twilio_verify.html.erb +16 -0
  21. data/app/views/devise/verify_twilio_verify.html.haml +13 -0
  22. data/app/views/devise/verify_twilio_verify_installation.html.erb +18 -0
  23. data/app/views/devise/verify_twilio_verify_installation.html.haml +16 -0
  24. data/config/locales/en.yml +27 -0
  25. data/config.ru +9 -0
  26. data/devise-twilio-verify.gemspec +49 -0
  27. data/gemfiles/.bundle/config +2 -0
  28. data/gemfiles/rails_5_2.gemfile +14 -0
  29. data/gemfiles/rails_6.gemfile +15 -0
  30. data/lib/devise-twilio-verify/controllers/helpers.rb +87 -0
  31. data/lib/devise-twilio-verify/controllers/view_helpers.rb +50 -0
  32. data/lib/devise-twilio-verify/hooks/twilio_verify_authenticatable.rb +7 -0
  33. data/lib/devise-twilio-verify/mapping.rb +16 -0
  34. data/lib/devise-twilio-verify/models/twilio_verify_authenticatable.rb +21 -0
  35. data/lib/devise-twilio-verify/models/twilio_verify_lockable.rb +43 -0
  36. data/lib/devise-twilio-verify/rails.rb +16 -0
  37. data/lib/devise-twilio-verify/routes.rb +21 -0
  38. data/lib/devise-twilio-verify/version.rb +5 -0
  39. data/lib/devise-twilio-verify.rb +32 -0
  40. data/lib/generators/active_record/devise_twilio_verify_generator.rb +23 -0
  41. data/lib/generators/active_record/templates/migration.rb +18 -0
  42. data/lib/generators/devise_twilio_verify/devise_twilio_verify_generator.rb +30 -0
  43. data/lib/generators/devise_twilio_verify/install_generator.rb +80 -0
  44. metadata +343 -0
@@ -0,0 +1,21 @@
1
+ require 'devise-twilio-verify/hooks/twilio_verify_authenticatable'
2
+ module Devise
3
+ module Models
4
+ module TwilioVerifyAuthenticatable
5
+ extend ActiveSupport::Concern
6
+
7
+ def with_twilio_verify_authentication?(request)
8
+ self.twilio_verify_enabled?
9
+ end
10
+
11
+ module ClassMethods
12
+ def find_by_mobile_phone(mobile_phone)
13
+ where(mobile_phone: mobile_phone).first
14
+ end
15
+
16
+ Devise::Models.config(self, :twilio_verify_remember_device, :twilio_verify_enable_qr_code)
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,43 @@
1
+ module Devise
2
+
3
+ module Models
4
+
5
+ # Handles blocking a user access after a certain number of attempts.
6
+ # Requires proper configuration of the Devise::Models::Lockable module.
7
+ #
8
+ module TwilioVerifyLockable
9
+
10
+ extend ActiveSupport::Concern
11
+
12
+ # Public: Determine if this is a lockable resource, via Devise::Models::Lockable.
13
+ # Returns true
14
+ # Raises an error if the Devise::Models::Lockable module is not configured.
15
+ def lockable?
16
+ raise 'Devise lockable extension required' unless respond_to? :lock_access!
17
+ Devise.lock_strategy == :failed_attempts
18
+ end
19
+
20
+ # Public: Handle a failed 2FA attempt. If the resource is lockable via
21
+ # Devise::Models::Lockable module then enforce that setting.
22
+ #
23
+ # Returns true if the user is locked out.
24
+ def invalid_twilio_verify_attempt!
25
+ return false unless lockable?
26
+
27
+ self.failed_attempts ||= 0
28
+ self.failed_attempts += 1
29
+
30
+ if attempts_exceeded?
31
+ lock_access! unless access_locked?
32
+ true
33
+ else
34
+ save validate: false
35
+ false
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,16 @@
1
+ module DeviseTwilioVerify
2
+ class Engine < ::Rails::Engine
3
+ ActiveSupport.on_load(:action_controller) do
4
+ include DeviseTwilioVerify::Controllers::Helpers
5
+ end
6
+ ActiveSupport.on_load(:action_view) do
7
+ include DeviseTwilioVerify::Views::Helpers
8
+ end
9
+
10
+ # extend mapping with after_initialize because it's not reloaded
11
+ config.after_initialize do
12
+ Devise::Mapping.send :prepend, DeviseTwilioVerify::Mapping
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,21 @@
1
+ module ActionDispatch::Routing
2
+ class Mapper
3
+ protected
4
+
5
+ def devise_twilio_verify(mapping, controllers)
6
+ match "/#{mapping.path_names[:verify_twilio_verify]}", :controller => controllers[:devise_twilio_verify], :action => :GET_verify_twilio_verify, :as => :verify_twilio_verify, :via => :get
7
+ match "/#{mapping.path_names[:verify_twilio_verify]}", :controller => controllers[:devise_twilio_verify], :action => :POST_verify_twilio_verify, :as => nil, :via => :post
8
+
9
+ match "/#{mapping.path_names[:enable_twilio_verify]}", :controller => controllers[:devise_twilio_verify], :action => :GET_enable_twilio_verify, :as => :enable_twilio_verify, :via => :get
10
+ match "/#{mapping.path_names[:enable_twilio_verify]}", :controller => controllers[:devise_twilio_verify], :action => :POST_enable_twilio_verify, :as => nil, :via => :post
11
+
12
+ match "/#{mapping.path_names[:disable_twilio_verify]}", :controller => controllers[:devise_twilio_verify], :action => :POST_disable_twilio_verify, :as => :disable_twilio_verify, :via => :post
13
+
14
+ match "/#{mapping.path_names[:verify_twilio_verify_installation]}", :controller => controllers[:devise_twilio_verify], :action => :GET_verify_twilio_verify_installation, :as => :verify_twilio_verify_installation, :via => :get
15
+ match "/#{mapping.path_names[:verify_twilio_verify_installation]}", :controller => controllers[:devise_twilio_verify], :action => :POST_verify_twilio_verify_installation, :as => nil, :via => :post
16
+
17
+ match "/#{mapping.path_names[:request_sms]}", :controller => controllers[:devise_twilio_verify], :action => :request_sms, :as => :request_sms, :via => :post
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeviseTwilioVerify
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,32 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/core_ext/integer/time'
3
+ require 'devise'
4
+ require 'twilio-ruby'
5
+
6
+ module Devise
7
+ mattr_accessor :twilio_verify_remember_device, :twilio_verify_enable_qr_code
8
+ @@twilio_verify_remember_device = 1.month
9
+ @@twilio_verify_enable_qr_code = false
10
+ end
11
+
12
+ module DeviseTwilioVerify
13
+ autoload :Mapping, 'devise-twilio-verify/mapping'
14
+
15
+ module Controllers
16
+ autoload :Passwords, 'devise-twilio-verify/controllers/passwords'
17
+ autoload :Helpers, 'devise-twilio-verify/controllers/helpers'
18
+ end
19
+
20
+ module Views
21
+ autoload :Helpers, 'devise-twilio-verify/controllers/view_helpers'
22
+ end
23
+ end
24
+
25
+ require 'devise-twilio-verify/routes'
26
+ require 'devise-twilio-verify/rails'
27
+ require 'devise-twilio-verify/models/twilio_verify_authenticatable'
28
+ require 'devise-twilio-verify/models/twilio_verify_lockable'
29
+ require 'devise-twilio-verify/version'
30
+
31
+ Devise.add_module :twilio_verify_authenticatable, :model => 'devise-twilio-verify/models/twilio_verify_authenticatable', :controller => :devise_twilio_verify, :route => :twilio_verify
32
+ Devise.add_module :twilio_verify_lockable, :model => 'devise-twilio-verify/models/twilio_verify_lockable'
@@ -0,0 +1,23 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module ActiveRecord
4
+ module Generators
5
+ class DeviseTwilioVerifyGenerator < ActiveRecord::Generators::Base
6
+ source_root File.expand_path("../templates", __FILE__)
7
+
8
+ def copy_devise_migration
9
+ migration_template "migration.rb", "db/migrate/devise_twilio_verify_add_to_#{table_name}.rb", migration_version: migration_version
10
+ end
11
+
12
+ private
13
+
14
+ def versioned_migrations?
15
+ Rails::VERSION::MAJOR >= 5
16
+ end
17
+
18
+ def migration_version
19
+ "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]" if versioned_migrations?
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ class DeviseTwilioVerifyAddTo<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
2
+ def self.up
3
+ change_table :<%= table_name %> do |t|
4
+ t.string :authy_id
5
+ t.datetime :last_sign_in_with_twilio_verify
6
+ t.boolean :twilio_verify_enabled, :default => false
7
+ end
8
+
9
+ add_index :<%= table_name %>, :authy_id
10
+ end
11
+
12
+ def self.down
13
+ change_table :<%= table_name %> do |t|
14
+ t.remove :authy_id, :last_sign_in_with_twilio_verify, :twilio_verify_enabled
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeviseTwilioVerify
4
+ module Generators
5
+ class DeviseTwilioVerifyGenerator < Rails::Generators::NamedBase
6
+ namespace "devise_twilio_verify"
7
+
8
+ desc "Add :twilio_verify_authenticatable directive in the given model, plus accessors. Also generate migration for ActiveRecord"
9
+
10
+ def inject_devise_twilio_verify_content
11
+ path = File.join(destination_root, "app", "models", "#{file_path}.rb")
12
+ if File.exist?(path) &&
13
+ !File.read(path).include?("twilio_verify_authenticatable")
14
+ inject_into_file(path,
15
+ "twilio_verify_authenticatable, :",
16
+ :after => "devise :")
17
+ end
18
+
19
+ if File.exist?(path) &&
20
+ !File.read(path).include?(":authy_id")
21
+ inject_into_file(path,
22
+ ":authy_id, :last_sign_in_with_twilio_verify, ",
23
+ :after => "attr_accessible ")
24
+ end
25
+ end
26
+
27
+ hook_for :orm
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,80 @@
1
+ require "rails/generators"
2
+
3
+ module DeviseTwilioVerify
4
+ module Generators
5
+ # Install Generator
6
+ class InstallGenerator < ::Rails::Generators::Base
7
+ source_root File.expand_path("../../templates", __FILE__)
8
+
9
+ class_option :haml, :type => :boolean, :required => false, :default => false, :desc => "Generate views in Haml"
10
+ class_option :sass, :type => :boolean, :required => false, :default => false, :desc => "Generate stylesheet in Sass"
11
+
12
+ desc "Install the devise twilio verify extension"
13
+
14
+ def add_configs
15
+ inject_into_file "config/initializers/devise.rb", "\n" +
16
+ " # ==> Devise Twilio Verify Authentication Extension\n" +
17
+ " # How long should the user's device be remembered for.\n" +
18
+ " # config.twilio_verify_remember_device = 1.month\n\n" +
19
+ " # Should generating QR codes for other authenticator apps be enabled?\n" +
20
+ " # Note: you need to enable this in your Twilio console.\n" +
21
+ " # config.twilio_verify_enable_qr_code = false\n\n", :after => "Devise.setup do |config|\n"
22
+ end
23
+
24
+ def add_initializer
25
+ initializer("twilio_verify.rb") do
26
+ "# TODO"
27
+ end
28
+ end
29
+
30
+ def copy_locale
31
+ copy_file "../../../config/locales/en.yml", "config/locales/devise.twilio_verify.en.yml"
32
+ end
33
+
34
+ def copy_views
35
+ if options.haml?
36
+ copy_file '../../../app/views/devise/enable_twilio_verify.html.haml', 'app/views/devise/devise_twilio_verify/enable_twilio_verify.html.haml'
37
+ copy_file '../../../app/views/devise/verify_twilio_verify.html.haml', 'app/views/devise/devise_twilio_verify/verify_twilio_verify.html.haml'
38
+ copy_file '../../../app/views/devise/verify_twilio_verify_installation.html.haml', 'app/views/devise/devise_twilio_verify/verify_twilio_verify_installation.html.haml'
39
+ else
40
+ copy_file '../../../app/views/devise/enable_twilio_verify.html.erb', 'app/views/devise/devise_twilio_verify/enable_twilio_verify.html.erb'
41
+ copy_file '../../../app/views/devise/verify_twilio_verify.html.erb', 'app/views/devise/devise_twilio_verify/verify_twilio_verify.html.erb'
42
+ copy_file '../../../app/views/devise/verify_twilio_verify_installation.html.erb', 'app/views/devise/devise_twilio_verify/verify_twilio_verify_installation.html.erb'
43
+ end
44
+ end
45
+
46
+ def copy_assets
47
+ if options.sass?
48
+ copy_file '../../../app/assets/stylesheets/devise_twilio_verify.sass', 'app/assets/stylesheets/devise_twilio_verify.sass'
49
+ else
50
+ copy_file '../../../app/assets/stylesheets/devise_twilio_verify.css', 'app/assets/stylesheets/devise_twilio_verify.css'
51
+ end
52
+ copy_file '../../../app/assets/javascripts/devise_twilio_verify.js', 'app/assets/javascripts/devise_twilio_verify.js'
53
+ end
54
+
55
+ def inject_assets_in_layout
56
+ {
57
+ :haml => {
58
+ :before => %r{%body\s*$},
59
+ :content => %@
60
+ =javascript_include_tag "https://www.authy.com/form.authy.min.js"
61
+ =stylesheet_link_tag "https://www.authy.com/form.authy.min.css"
62
+ @
63
+ },
64
+ :erb => {
65
+ :before => %r{\s*<\/\s*head\s*>\s*},
66
+ :content => %@
67
+ <%=javascript_include_tag "https://www.authy.com/form.authy.min.js" %>
68
+ <%=stylesheet_link_tag "https://www.authy.com/form.authy.min.css" %>
69
+ @
70
+ }
71
+ }.each do |extension, opts|
72
+ file_path = File.join(destination_root, "app", "views", "layouts", "application.html.#{extension}")
73
+ if File.exist?(file_path) && !File.read(file_path).include?("form.twilio_verify.min.js")
74
+ inject_into_file(file_path, opts.delete(:content), opts)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
metadata ADDED
@@ -0,0 +1,343 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise-twilio-verify
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jay Wolff
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-03-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: devise
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: twilio-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.74'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.74'
41
+ - !ruby/object:Gem::Dependency
42
+ name: appraisal
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: combustion
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rails-controller-testing
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.11
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.11
153
+ - !ruby/object:Gem::Dependency
154
+ name: rdoc
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 4.3.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 4.3.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: simplecov
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 0.17.1
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 0.17.1
181
+ - !ruby/object:Gem::Dependency
182
+ name: webmock
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 3.11.0
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 3.11.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: rails
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '5'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '5'
209
+ - !ruby/object:Gem::Dependency
210
+ name: sqlite3
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: generator_spec
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: database_cleaner
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '1.7'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '1.7'
251
+ - !ruby/object:Gem::Dependency
252
+ name: factory_bot_rails
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: 5.1.1
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: 5.1.1
265
+ description: Twilio Verify plugin to add two factor authentication to Devise. This
266
+ gem is meant to make migrating from authy to twilio verify as simple as possible,
267
+ please see the README for details.
268
+ email:
269
+ executables: []
270
+ extensions: []
271
+ extra_rdoc_files: []
272
+ files:
273
+ - ".document"
274
+ - ".github/workflows/build.yml"
275
+ - ".gitignore"
276
+ - ".rspec"
277
+ - Appraisals
278
+ - CHANGELOG.md
279
+ - Gemfile
280
+ - LICENSE.txt
281
+ - README.md
282
+ - Rakefile
283
+ - app/assets/javascripts/devise_twilio_verify.js
284
+ - app/assets/stylesheets/devise_twilio_verify.css
285
+ - app/assets/stylesheets/devise_twilio_verify.sass
286
+ - app/controllers/devise/devise_twilio_verify_controller.rb
287
+ - app/controllers/devise_twilio_verify/passwords_controller.rb
288
+ - app/services/twilio_verify_service.rb
289
+ - app/views/devise/enable_twilio_verify.html.erb
290
+ - app/views/devise/enable_twilio_verify.html.haml
291
+ - app/views/devise/verify_twilio_verify.html.erb
292
+ - app/views/devise/verify_twilio_verify.html.haml
293
+ - app/views/devise/verify_twilio_verify_installation.html.erb
294
+ - app/views/devise/verify_twilio_verify_installation.html.haml
295
+ - config.ru
296
+ - config/locales/en.yml
297
+ - devise-twilio-verify.gemspec
298
+ - gemfiles/.bundle/config
299
+ - gemfiles/rails_5_2.gemfile
300
+ - gemfiles/rails_6.gemfile
301
+ - lib/devise-twilio-verify.rb
302
+ - lib/devise-twilio-verify/controllers/helpers.rb
303
+ - lib/devise-twilio-verify/controllers/view_helpers.rb
304
+ - lib/devise-twilio-verify/hooks/twilio_verify_authenticatable.rb
305
+ - lib/devise-twilio-verify/mapping.rb
306
+ - lib/devise-twilio-verify/models/twilio_verify_authenticatable.rb
307
+ - lib/devise-twilio-verify/models/twilio_verify_lockable.rb
308
+ - lib/devise-twilio-verify/rails.rb
309
+ - lib/devise-twilio-verify/routes.rb
310
+ - lib/devise-twilio-verify/version.rb
311
+ - lib/generators/active_record/devise_twilio_verify_generator.rb
312
+ - lib/generators/active_record/templates/migration.rb
313
+ - lib/generators/devise_twilio_verify/devise_twilio_verify_generator.rb
314
+ - lib/generators/devise_twilio_verify/install_generator.rb
315
+ homepage: https://github.com/jayywolff/twilio-verify-devise
316
+ licenses:
317
+ - MIT
318
+ metadata:
319
+ bug_tracker_uri: https://github.com/jayywolff/twilio-verify-devise/issues
320
+ change_log_uri: https://github.com/jayywolff/twilio-verify-devise/blob/master/CHANGELOG.md
321
+ documentation_uri: https://github.com/jayywolff/twilio-verify-devise
322
+ homepage_uri: https://github.com/jayywolff/twilio-verify-devise
323
+ source_code_uri: https://github.com/jayywolff/twilio-verify-devise
324
+ post_install_message:
325
+ rdoc_options: []
326
+ require_paths:
327
+ - lib
328
+ required_ruby_version: !ruby/object:Gem::Requirement
329
+ requirements:
330
+ - - ">="
331
+ - !ruby/object:Gem::Version
332
+ version: '0'
333
+ required_rubygems_version: !ruby/object:Gem::Requirement
334
+ requirements:
335
+ - - ">="
336
+ - !ruby/object:Gem::Version
337
+ version: '0'
338
+ requirements: []
339
+ rubygems_version: 3.1.6
340
+ signing_key:
341
+ specification_version: 4
342
+ summary: Twilio Verify plugin to add two factor authentication to Devise.
343
+ test_files: []