devise-twilio-verify 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []