devise-secure_password 1.0.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/Changelog.md +43 -4
  3. data/Dockerfile +1 -1
  4. data/Dockerfile.prev +3 -3
  5. data/Gemfile +1 -0
  6. data/Gemfile.lock +215 -205
  7. data/README.md +33 -10
  8. data/app/controllers/devise/passwords_with_policy_controller.rb +55 -14
  9. data/app/views/devise/passwords_with_policy/edit.html.erb +5 -1
  10. data/config/locales/en.yml +50 -0
  11. data/devise-secure_password.gemspec +22 -23
  12. data/gemfiles/rails_6_0.gemfile +57 -0
  13. data/gemfiles/rails_6_0.gemfile.lock +347 -0
  14. data/gemfiles/rails_6_1.gemfile +57 -0
  15. data/gemfiles/rails_6_1.gemfile.lock +352 -0
  16. data/lib/devise/secure_password.rb +4 -9
  17. data/lib/devise/secure_password/controllers/devise_helpers.rb +4 -50
  18. data/lib/devise/secure_password/controllers/helpers.rb +58 -0
  19. data/lib/devise/secure_password/grammar.rb +13 -0
  20. data/lib/devise/secure_password/models/password_disallows_frequent_changes.rb +4 -2
  21. data/lib/devise/secure_password/models/password_disallows_frequent_reuse.rb +1 -0
  22. data/lib/devise/secure_password/models/password_has_required_content.rb +53 -15
  23. data/lib/devise/secure_password/models/password_requires_regular_updates.rb +1 -3
  24. data/lib/devise/secure_password/version.rb +1 -1
  25. data/lib/support/string/character_counter.rb +3 -1
  26. data/pkg/devise-secure_password-2.0.0.gem +0 -0
  27. metadata +66 -168
  28. data/coverage/assets/0.10.2/application.css +0 -799
  29. data/coverage/assets/0.10.2/application.js +0 -1707
  30. data/coverage/assets/0.10.2/colorbox/border.png +0 -0
  31. data/coverage/assets/0.10.2/colorbox/controls.png +0 -0
  32. data/coverage/assets/0.10.2/colorbox/loading.gif +0 -0
  33. data/coverage/assets/0.10.2/colorbox/loading_background.png +0 -0
  34. data/coverage/assets/0.10.2/favicon_green.png +0 -0
  35. data/coverage/assets/0.10.2/favicon_red.png +0 -0
  36. data/coverage/assets/0.10.2/favicon_yellow.png +0 -0
  37. data/coverage/assets/0.10.2/loading.gif +0 -0
  38. data/coverage/assets/0.10.2/magnify.png +0 -0
  39. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  40. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  41. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  42. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  43. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  44. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  45. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  46. data/coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  47. data/coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png +0 -0
  48. data/coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  49. data/coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png +0 -0
  50. data/coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png +0 -0
  51. data/coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  52. data/coverage/index.html +0 -4115
  53. data/devise-secure_password-1.0.0.gem +0 -0
  54. data/gemfiles/rails-5_0_6.gemfile +0 -17
  55. data/gemfiles/rails-5_0_6.gemfile.lock +0 -286
  56. data/gemfiles/rails-5_1_4.gemfile +0 -16
  57. data/gemfiles/rails-5_1_4.gemfile.lock +0 -282
  58. data/lib/devise/secure_password/controllers/active_helpers.rb +0 -45
  59. data/lib/devise/secure_password/hooks/password_requires_regular_updates.rb +0 -5
  60. data/pkg/devise-secure_password-1.0.3.gem +0 -0
  61. data/pkg/devise-secure_password-1.0.4.gem +0 -0
data/README.md CHANGED
@@ -9,7 +9,7 @@ as well.
9
9
 
10
10
  ## Build Status
11
11
 
12
- | Service | rails 5.1.4 |
12
+ | Service | rails 6.1 |
13
13
  |:-----------|:-----------:|
14
14
  | Circle CI | [![Circle CI](https://circleci.com/gh/ValiMail/devise-secure_password/tree/master.svg?style=shield&circle-token=cd173d5f9d2944a9b14737c2d4339b20b08565cf)]() |
15
15
 
@@ -32,16 +32,16 @@ The goal of this project is to provide compatibility for officially supported st
32
32
  and [Ruby on Rails](http://guides.rubyonrails.org/maintenance_policy.html). More specifically, the following releases
33
33
  are currently supported by the __Devise Secure Password Extension__:
34
34
 
35
- - Ruby on Rails: __5.1.Z__, __5.0.Z__ (current and previous stable release)
36
- - Ruby: __2.5.0__, __2.4.3__ (current and previous stable release)
35
+ - Ruby on Rails: __6.1.x__, __6.0.x__ (current and previous stable release)
36
+ - Ruby: __3.0.x__, __2.7.x__ (current and previous stable release)
37
37
 
38
38
  ## Installation
39
39
 
40
40
  Add this line to your application's Gemfile:
41
41
 
42
42
  ```ruby
43
- gem 'devise', '~> 4.2'
44
- gem 'devise-secure_password', '~> 1.0.5'
43
+ gem 'devise', '~> 4.7'
44
+ gem 'devise-secure_password', '~> 2.0'
45
45
  ```
46
46
 
47
47
  And then execute:
@@ -228,14 +228,14 @@ To determine the Ruby on Rails versions supported by this release, run the follo
228
228
  prompt> gem install flay ruby2ruby rubocop rspec
229
229
  prompt> rake test:spec:targets
230
230
 
231
- Available Rails targets: 5.0.6, 5.1.4
231
+ Available Rails targets: 5.1, 5.2
232
232
  ```
233
233
 
234
234
  Reconfigure the project by specifying the correct Gemfile when running bundler, followed by running tests:
235
235
 
236
236
  ```bash
237
- prompt> BUNDLE_GEMFILE=gemfiles/rails-5_0_6.gemfile bundle
238
- prompt> BUNDLE_GEMFILE=gemfiles/rails-5_0_6.gemfile bundle exec rake
237
+ prompt> BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle
238
+ prompt> BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle exec rake
239
239
  ```
240
240
 
241
241
  The only time you need to define the `BUNDLE_GEMFILE` environment variable is when testing a non-default target.
@@ -260,11 +260,23 @@ for testing.
260
260
  prompt> brew install chromedriver
261
261
  ```
262
262
 
263
- >NOTE: __ChromeDriver__ < 2.33 has a bug for testing clickable targets; therefore, install >= 2.3.4.
264
-
265
263
  You can always install [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/) by downloading and then
266
264
  unpacking into the `/usr/local/bin` directory.
267
265
 
266
+ #### Automated screenshots on failure
267
+
268
+ The [capybara-screenshot gem](https://github.com/mattheworiordan/capybara-screenshot) supports automated screenshot
269
+ captures on failing tests but this will only take place for tests that have JavaScript enabled. You can temporarily
270
+ modify an example by setting `js: true` as in the following example:
271
+
272
+ ```ruby
273
+ context 'when minimum age enforcement is enabled', js: true do
274
+ ...
275
+ end
276
+ ```
277
+
278
+ Do not submit pull requests with this setting enabled where it wasn't enabled previously.
279
+
268
280
  ### Testing inside the spec/rails-app-X_y_z
269
281
 
270
282
  To debug from inside of the dummy rails-app you will need to first install the rails bin stubs and then perform a db
@@ -325,6 +337,17 @@ initiating any development work including tests.
325
337
  prompt> gem update bundler
326
338
  ```
327
339
 
340
+ #### Updating test.sqlite3.db
341
+
342
+ To update or generate a `db/test/sqlite3.db` database file:
343
+
344
+ ```bash
345
+ prompt> cd spec/rails-app-X_y_z
346
+ prompt> bundle install
347
+ prompt> rake app:update:bin
348
+ prompt> RAILS_ENV=test bundle exec rake db:migrate
349
+ ```
350
+
328
351
  ## Contributing
329
352
 
330
353
  Bug reports and pull requests are welcome on GitHub at https://github.com/valimail/devise-secure_password. This project
@@ -1,26 +1,31 @@
1
1
  module Devise
2
- class PasswordsWithPolicyController < DeviseController
3
- before_action :authenticate_scope!
2
+ class PasswordsWithPolicyController < Devise::RegistrationsController
3
+ before_action :configure_permitted_parameters
4
4
 
5
5
  def edit
6
6
  self.resource = resource_class.new
7
- if warden.session(scope_name)['secure_password_expired']
8
- resource.errors.add(:base, "#{error_string_for_password_expired}.")
9
- end
7
+ resource.errors.add(:base, "#{error_string_for_password_expired}.")
10
8
  render :edit
11
9
  end
12
10
 
13
11
  def update
14
- if resource.update_with_password(password_params)
12
+ if update_resource(resource, account_update_params)
15
13
  prepare_for_redirect
16
14
  redirect_to stored_location_for(scope_name) || :root
17
15
  else
18
- clean_up_passwords(resource)
19
16
  render :edit
20
17
  end
21
18
  end
22
19
 
23
- private
20
+ def devise_parameter_sanitizer
21
+ @devise_parameter_sanitizer ||= Devise::ParameterSanitizer.new(resource_class, resource_name, params)
22
+ end
23
+
24
+ protected
25
+
26
+ def account_update_params
27
+ devise_parameter_sanitizer.sanitize(:account_update)
28
+ end
24
29
 
25
30
  def authenticate_scope!
26
31
  send(:"authenticate_#{scope_name}!")
@@ -31,22 +36,58 @@ module Devise
31
36
  I18n.t('secure_password.password_requires_regular_updates.alerts.messages.password_updated')
32
37
  end
33
38
 
39
+ def configure_permitted_parameters
40
+ devise_parameter_sanitizer.permit(:account_update, keys: [:update_action])
41
+ end
42
+
34
43
  def error_string_for_password_expired
35
44
  return 'password expired' unless warden.user.class.respond_to?(:password_maximum_age)
45
+
36
46
  I18n.t(
37
47
  'secure_password.password_requires_regular_updates.errors.messages.password_expired',
38
- timeframe: distance_of_time_in_words(warden.user.class.password_maximum_age)
48
+ timeframe: precise_distance_of_time_in_words(warden.user.class.password_maximum_age)
39
49
  )
40
50
  end
41
51
 
42
- def password_params
43
- params.require(scope_name).permit(:current_password, :password, :password_confirmation)
44
- end
45
-
46
52
  def prepare_for_redirect
47
- warden.session(scope_name)[:secure_password_expired] = false
53
+ unset_devise_secure_password_expired!
48
54
  flash[:notice] = alert_string_for_password_updated
49
55
  bypass_sign_in resource, scope: scope_name
50
56
  end
57
+
58
+ def update_resource(resource, params)
59
+ update_action = (params[:update_action] ? params.delete(:update_action) : nil)
60
+ return false unless update_action == 'change_password'
61
+
62
+ update_password(resource, params)
63
+
64
+ # do what devise would do under normal circumstances but also be aware of
65
+ # secure_password or other validators that would be ignored by devise.
66
+ result = if resource.errors.count.zero?
67
+ resource.update(params)
68
+ else
69
+ false
70
+ end
71
+
72
+ resource.clean_up_passwords
73
+ result
74
+ end
75
+
76
+ def update_password(resource, params)
77
+ #
78
+ # order of operations that follow is absolutely critical
79
+ #
80
+ current_password = params.delete(:current_password)
81
+ current_password_valid = resource.valid_password?(current_password)
82
+
83
+ # let our installed validator chain handle the validation work
84
+ resource.assign_attributes(params)
85
+ resource.valid?
86
+ unless current_password_valid
87
+ resource.errors.add(:current_password, current_password.blank? ? :blank : :invalid)
88
+ end
89
+
90
+ resource
91
+ end
51
92
  end
52
93
  end
@@ -1,7 +1,11 @@
1
1
  <h2><%= t('.titles.section_title') %></h2>
2
2
 
3
3
  <%= form_for(resource, as: resource_name, url: [resource_name, :password_with_policy], html: { method: :put }) do |f| %>
4
- <%= devise_error_messages! %>
4
+ <% if resource.errors.full_messages.count.positive? %>
5
+ <%= render 'devise/shared/error_messages', resource: resource %>
6
+ <% end %>
7
+
8
+ <%= f.hidden_field :update_action, value: :change_password %>
5
9
 
6
10
  <p><%= f.label :current_password, t('.labels.current_password') %><br />
7
11
  <%= f.password_field :current_password %></p>
@@ -1,11 +1,23 @@
1
1
  en:
2
2
  secure_password:
3
+ character:
4
+ one: "character"
5
+ other: "characters"
6
+
7
+ types:
8
+ uppercase: "uppercase"
9
+ downcase: "downcase"
10
+ number: "number"
11
+ special: "special"
12
+
3
13
  password_has_required_content:
4
14
  errors:
5
15
  messages:
6
16
  unknown_characters: "contains %{count} invalid %{subject}"
7
17
  minimum_characters: "must contain at least %{count} %{type} %{subject}"
8
18
  maximum_characters: "must contain less than %{count} %{type} %{subject}"
19
+ minimum_length: "must contain at least %{count} %{subject}"
20
+ maximum_length: "must contain less than %{count} %{subject}"
9
21
  password_disallows_frequent_reuse:
10
22
  errors:
11
23
  messages:
@@ -21,6 +33,44 @@ en:
21
33
  errors:
22
34
  messages:
23
35
  password_expired: "Your password has expired. Passwords must be changed every %{timeframe}"
36
+ datetime:
37
+ # update distance_in_words translations to remove the determiner words:
38
+ # about, almost, over, less than, etc.
39
+ precise_distance_in_words:
40
+ half_a_minute: "half a minute"
41
+ less_than_x_seconds:
42
+ one: "1 second" # default was: "less than 1 second"
43
+ other: "%{count} seconds" # default was: "less than %{count} seconds"
44
+ x_seconds:
45
+ one: "1 second"
46
+ other: "%{count} seconds"
47
+ less_than_x_minutes:
48
+ one: "a minute" # default was: "less than a minute"
49
+ other: "%{count} minutes" # default was: "less than %{count} minutes"
50
+ x_minutes:
51
+ one: "1 minute"
52
+ other: "%{count} minutes"
53
+ about_x_hours:
54
+ one: "1 hour" # default was: "about 1 hour"
55
+ other: "%{count} hours" # default was: "about %{count} hours"
56
+ x_days:
57
+ one: "1 day"
58
+ other: "%{count} days"
59
+ about_x_months:
60
+ one: "1 month" # default was: "about 1 month"
61
+ other: "%{count} months" # default was: "about %{count} months"
62
+ x_months:
63
+ one: "1 month"
64
+ other: "%{count} months"
65
+ about_x_years:
66
+ one: "1 year" # default was: "about 1 year"
67
+ other: "%{count} years" # default was: "about %{count} years"
68
+ over_x_years:
69
+ one: "1 year" # default was: "over 1 year"
70
+ other: "%{count} years" # default was: "over %{count} years"
71
+ almost_x_years:
72
+ one: "1 year" # default was: "almost 1 year"
73
+ other: "%{count} years" # default was: "almost %{count} years"
24
74
  devise:
25
75
  passwords_with_policy:
26
76
  edit:
@@ -29,29 +29,28 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ['lib']
30
30
 
31
31
  spec.add_runtime_dependency 'devise', '>= 4.0.0', '< 5.0.0'
32
- spec.add_runtime_dependency 'railties', '>= 5.0.0', '< 6.0.0'
32
+ spec.add_runtime_dependency 'railties', '>= 5.0.0', '< 7.0.0'
33
33
 
34
- spec.add_development_dependency 'bundler', '~> 1.16', '>= 1.16.1'
35
- spec.add_development_dependency 'capybara', '~> 2.16', '>= 2.16.1'
36
- spec.add_development_dependency 'capybara-screenshot', '~> 1.0', '>= 1.0.18'
37
- spec.add_development_dependency 'coffee-rails', '~> 4.2'
38
- spec.add_development_dependency 'database_cleaner', '~> 1.6', '>= 1.6.2'
34
+ spec.add_development_dependency 'bundler', '>= 2.2.14'
35
+ spec.add_development_dependency 'capybara', '>= 3.35.3'
36
+ spec.add_development_dependency 'capybara-screenshot', '>= 1.0.18'
37
+ spec.add_development_dependency 'database_cleaner', '>= 2.0.1'
39
38
  spec.add_development_dependency 'devise', '~> 4.0'
40
- spec.add_development_dependency 'flay', '~> 2.10', '>= 2.10.0'
41
- spec.add_development_dependency 'launchy', '~> 2.4', '>= 2.4.3'
42
- spec.add_development_dependency 'rails', '~> 5.1', '>= 5.1.4'
43
- spec.add_development_dependency 'rake', '~> 12.3'
44
- spec.add_development_dependency 'rspec', '~> 3.7'
45
- spec.add_development_dependency 'rspec-rails', '~> 3.7'
46
- spec.add_development_dependency 'rspec_junit_formatter', '~> 0.3'
47
- spec.add_development_dependency 'rubocop', '>= 0.49.0'
48
- spec.add_development_dependency 'ruby2ruby', '~> 2.4', '>= 2.4.0'
49
- spec.add_development_dependency 'sass-rails', '~> 5.0'
50
- spec.add_development_dependency 'selenium-webdriver', '~> 3.7', '>= 3.7.0'
51
- spec.add_development_dependency 'simplecov', '~> 0.15.1'
52
- spec.add_development_dependency 'simplecov-console', '~> 0.4.2'
53
- spec.add_development_dependency 'sqlite3', '~> 1.3', '>= 1.3.13'
54
- spec.add_development_dependency 'therubyracer', '~> 0.12.3'
55
-
56
- spec.required_ruby_version = '>= 2.4'
39
+ spec.add_development_dependency 'flay', '>= 2.10.0'
40
+ spec.add_development_dependency 'launchy', '>= 2.4.3'
41
+ spec.add_development_dependency 'rails', '>= 5.2.0'
42
+ spec.add_development_dependency 'rake', '>= 12.3'
43
+ spec.add_development_dependency 'rspec', '>= 3.7'
44
+ spec.add_development_dependency 'rspec_junit_formatter', '>= 0.3'
45
+ spec.add_development_dependency 'rspec-rails', '>= 3.7'
46
+ spec.add_development_dependency 'rubocop', '>= 1.0.0'
47
+ spec.add_development_dependency 'rubocop-rails', '>= 2.3.2'
48
+ spec.add_development_dependency 'rubocop-rspec', '>= 1.35.0'
49
+ spec.add_development_dependency 'ruby2ruby', '>= 2.4.0'
50
+ spec.add_development_dependency 'selenium-webdriver', '>= 3.7.0'
51
+ spec.add_development_dependency 'simplecov', '>= 0.18.2'
52
+ spec.add_development_dependency 'simplecov-console', '>= 0.4.2'
53
+ spec.add_development_dependency 'sqlite3', '>= 1.3.13'
54
+
55
+ spec.required_ruby_version = '>= 2.7'
57
56
  end
@@ -0,0 +1,57 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ ENV['RAILS_TARGET'] ||= '6.0'
5
+
6
+ gemspec path: '../'
7
+
8
+ # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
9
+ gem 'rails', '~> 6.0.3', '>= 6.0.3.6'
10
+ # Use sqlite3 as the database for Active Record
11
+ gem 'sqlite3', '~> 1.4'
12
+ # Use Puma as the app server
13
+ gem 'puma', '~> 4.1'
14
+ # Use SCSS for stylesheets
15
+ gem 'sass-rails', '>= 6'
16
+ # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
17
+ gem 'webpacker', '~> 4.0'
18
+ # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
19
+ gem 'turbolinks', '~> 5'
20
+ # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
21
+ gem 'jbuilder', '~> 2.7'
22
+ # Use Redis adapter to run Action Cable in production
23
+ # gem 'redis', '~> 4.0'
24
+ # Use Active Model has_secure_password
25
+ # gem 'bcrypt', '~> 3.1.7'
26
+
27
+ # Use Active Storage variant
28
+ # gem 'image_processing', '~> 1.2'
29
+
30
+ # Reduces boot times through caching; required in config/boot.rb
31
+ gem 'bootsnap', '>= 1.4.2', require: false
32
+
33
+ group :development, :test do
34
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
35
+ gem 'byebug', platforms: %i(mri mingw x64_mingw)
36
+ end
37
+
38
+ group :development do
39
+ # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
40
+ gem 'listen', '~> 3.2'
41
+ gem 'web-console', '>= 3.3.0'
42
+ end
43
+
44
+ group :test do
45
+ # Adds support for Capybara system testing and selenium driver
46
+ gem 'capybara', '>= 2.15'
47
+ gem 'codecov', require: false
48
+ gem 'selenium-webdriver'
49
+ gem 'shoulda-matchers'
50
+ # Easy installation and use of web drivers to run system tests with browsers
51
+ gem 'webdrivers'
52
+ end
53
+
54
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
55
+ gem 'tzinfo-data', platforms: %i(mingw mswin x64_mingw jruby)
56
+
57
+ gem 'webrick', '~> 1.7'
@@ -0,0 +1,347 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ devise-secure_password (1.1.0)
5
+ devise (>= 4.0.0, < 5.0.0)
6
+ railties (>= 5.0.0, < 7.0.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ actioncable (6.0.3.6)
12
+ actionpack (= 6.0.3.6)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (6.0.3.6)
16
+ actionpack (= 6.0.3.6)
17
+ activejob (= 6.0.3.6)
18
+ activerecord (= 6.0.3.6)
19
+ activestorage (= 6.0.3.6)
20
+ activesupport (= 6.0.3.6)
21
+ mail (>= 2.7.1)
22
+ actionmailer (6.0.3.6)
23
+ actionpack (= 6.0.3.6)
24
+ actionview (= 6.0.3.6)
25
+ activejob (= 6.0.3.6)
26
+ mail (~> 2.5, >= 2.5.4)
27
+ rails-dom-testing (~> 2.0)
28
+ actionpack (6.0.3.6)
29
+ actionview (= 6.0.3.6)
30
+ activesupport (= 6.0.3.6)
31
+ rack (~> 2.0, >= 2.0.8)
32
+ rack-test (>= 0.6.3)
33
+ rails-dom-testing (~> 2.0)
34
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
35
+ actiontext (6.0.3.6)
36
+ actionpack (= 6.0.3.6)
37
+ activerecord (= 6.0.3.6)
38
+ activestorage (= 6.0.3.6)
39
+ activesupport (= 6.0.3.6)
40
+ nokogiri (>= 1.8.5)
41
+ actionview (6.0.3.6)
42
+ activesupport (= 6.0.3.6)
43
+ builder (~> 3.1)
44
+ erubi (~> 1.4)
45
+ rails-dom-testing (~> 2.0)
46
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
47
+ activejob (6.0.3.6)
48
+ activesupport (= 6.0.3.6)
49
+ globalid (>= 0.3.6)
50
+ activemodel (6.0.3.6)
51
+ activesupport (= 6.0.3.6)
52
+ activerecord (6.0.3.6)
53
+ activemodel (= 6.0.3.6)
54
+ activesupport (= 6.0.3.6)
55
+ activestorage (6.0.3.6)
56
+ actionpack (= 6.0.3.6)
57
+ activejob (= 6.0.3.6)
58
+ activerecord (= 6.0.3.6)
59
+ marcel (~> 1.0.0)
60
+ activesupport (6.0.3.6)
61
+ concurrent-ruby (~> 1.0, >= 1.0.2)
62
+ i18n (>= 0.7, < 2)
63
+ minitest (~> 5.1)
64
+ tzinfo (~> 1.1)
65
+ zeitwerk (~> 2.2, >= 2.2.2)
66
+ addressable (2.7.0)
67
+ public_suffix (>= 2.0.2, < 5.0)
68
+ ansi (1.5.0)
69
+ ast (2.4.2)
70
+ bcrypt (3.1.16)
71
+ bindex (0.8.1)
72
+ bootsnap (1.7.4)
73
+ msgpack (~> 1.0)
74
+ builder (3.2.4)
75
+ byebug (11.1.3)
76
+ capybara (3.35.3)
77
+ addressable
78
+ mini_mime (>= 0.1.3)
79
+ nokogiri (~> 1.8)
80
+ rack (>= 1.6.0)
81
+ rack-test (>= 0.6.3)
82
+ regexp_parser (>= 1.5, < 3.0)
83
+ xpath (~> 3.2)
84
+ capybara-screenshot (1.0.25)
85
+ capybara (>= 1.0, < 4)
86
+ launchy
87
+ childprocess (3.0.0)
88
+ codecov (0.5.2)
89
+ simplecov (>= 0.15, < 0.22)
90
+ concurrent-ruby (1.1.8)
91
+ crass (1.0.6)
92
+ database_cleaner (2.0.1)
93
+ database_cleaner-active_record (~> 2.0.0)
94
+ database_cleaner-active_record (2.0.0)
95
+ activerecord (>= 5.a)
96
+ database_cleaner-core (~> 2.0.0)
97
+ database_cleaner-core (2.0.1)
98
+ devise (4.8.0)
99
+ bcrypt (~> 3.0)
100
+ orm_adapter (~> 0.1)
101
+ railties (>= 4.1.0)
102
+ responders
103
+ warden (~> 1.2.3)
104
+ diff-lcs (1.4.4)
105
+ docile (1.3.5)
106
+ erubi (1.10.0)
107
+ erubis (2.7.0)
108
+ ffi (1.15.0)
109
+ flay (2.12.1)
110
+ erubis (~> 2.7.0)
111
+ path_expander (~> 1.0)
112
+ ruby_parser (~> 3.0)
113
+ sexp_processor (~> 4.0)
114
+ globalid (0.4.2)
115
+ activesupport (>= 4.2.0)
116
+ i18n (1.8.10)
117
+ concurrent-ruby (~> 1.0)
118
+ jbuilder (2.11.2)
119
+ activesupport (>= 5.0.0)
120
+ launchy (2.5.0)
121
+ addressable (~> 2.7)
122
+ listen (3.5.1)
123
+ rb-fsevent (~> 0.10, >= 0.10.3)
124
+ rb-inotify (~> 0.9, >= 0.9.10)
125
+ loofah (2.9.1)
126
+ crass (~> 1.0.2)
127
+ nokogiri (>= 1.5.9)
128
+ mail (2.7.1)
129
+ mini_mime (>= 0.1.1)
130
+ marcel (1.0.1)
131
+ method_source (1.0.0)
132
+ mini_mime (1.1.0)
133
+ mini_portile2 (2.5.1)
134
+ minitest (5.14.4)
135
+ msgpack (1.4.2)
136
+ nio4r (2.5.7)
137
+ nokogiri (1.11.3)
138
+ mini_portile2 (~> 2.5.0)
139
+ racc (~> 1.4)
140
+ orm_adapter (0.5.0)
141
+ parallel (1.20.1)
142
+ parser (3.0.1.1)
143
+ ast (~> 2.4.1)
144
+ path_expander (1.1.0)
145
+ public_suffix (4.0.6)
146
+ puma (4.3.7)
147
+ nio4r (~> 2.0)
148
+ racc (1.5.2)
149
+ rack (2.2.3)
150
+ rack-proxy (0.6.5)
151
+ rack
152
+ rack-test (1.1.0)
153
+ rack (>= 1.0, < 3)
154
+ rails (6.0.3.6)
155
+ actioncable (= 6.0.3.6)
156
+ actionmailbox (= 6.0.3.6)
157
+ actionmailer (= 6.0.3.6)
158
+ actionpack (= 6.0.3.6)
159
+ actiontext (= 6.0.3.6)
160
+ actionview (= 6.0.3.6)
161
+ activejob (= 6.0.3.6)
162
+ activemodel (= 6.0.3.6)
163
+ activerecord (= 6.0.3.6)
164
+ activestorage (= 6.0.3.6)
165
+ activesupport (= 6.0.3.6)
166
+ bundler (>= 1.3.0)
167
+ railties (= 6.0.3.6)
168
+ sprockets-rails (>= 2.0.0)
169
+ rails-dom-testing (2.0.3)
170
+ activesupport (>= 4.2.0)
171
+ nokogiri (>= 1.6)
172
+ rails-html-sanitizer (1.3.0)
173
+ loofah (~> 2.3)
174
+ railties (6.0.3.6)
175
+ actionpack (= 6.0.3.6)
176
+ activesupport (= 6.0.3.6)
177
+ method_source
178
+ rake (>= 0.8.7)
179
+ thor (>= 0.20.3, < 2.0)
180
+ rainbow (3.0.0)
181
+ rake (13.0.3)
182
+ rb-fsevent (0.10.4)
183
+ rb-inotify (0.10.1)
184
+ ffi (~> 1.0)
185
+ regexp_parser (2.1.1)
186
+ responders (3.0.1)
187
+ actionpack (>= 5.0)
188
+ railties (>= 5.0)
189
+ rexml (3.2.5)
190
+ rspec (3.10.0)
191
+ rspec-core (~> 3.10.0)
192
+ rspec-expectations (~> 3.10.0)
193
+ rspec-mocks (~> 3.10.0)
194
+ rspec-core (3.10.1)
195
+ rspec-support (~> 3.10.0)
196
+ rspec-expectations (3.10.1)
197
+ diff-lcs (>= 1.2.0, < 2.0)
198
+ rspec-support (~> 3.10.0)
199
+ rspec-mocks (3.10.2)
200
+ diff-lcs (>= 1.2.0, < 2.0)
201
+ rspec-support (~> 3.10.0)
202
+ rspec-rails (5.0.1)
203
+ actionpack (>= 5.2)
204
+ activesupport (>= 5.2)
205
+ railties (>= 5.2)
206
+ rspec-core (~> 3.10)
207
+ rspec-expectations (~> 3.10)
208
+ rspec-mocks (~> 3.10)
209
+ rspec-support (~> 3.10)
210
+ rspec-support (3.10.2)
211
+ rspec_junit_formatter (0.4.1)
212
+ rspec-core (>= 2, < 4, != 2.12.0)
213
+ rubocop (1.13.0)
214
+ parallel (~> 1.10)
215
+ parser (>= 3.0.0.0)
216
+ rainbow (>= 2.2.2, < 4.0)
217
+ regexp_parser (>= 1.8, < 3.0)
218
+ rexml
219
+ rubocop-ast (>= 1.2.0, < 2.0)
220
+ ruby-progressbar (~> 1.7)
221
+ unicode-display_width (>= 1.4.0, < 3.0)
222
+ rubocop-ast (1.5.0)
223
+ parser (>= 3.0.1.1)
224
+ rubocop-rails (2.9.1)
225
+ activesupport (>= 4.2.0)
226
+ rack (>= 1.1)
227
+ rubocop (>= 0.90.0, < 2.0)
228
+ rubocop-rspec (2.3.0)
229
+ rubocop (~> 1.0)
230
+ rubocop-ast (>= 1.1.0)
231
+ ruby-progressbar (1.11.0)
232
+ ruby2ruby (2.4.4)
233
+ ruby_parser (~> 3.1)
234
+ sexp_processor (~> 4.6)
235
+ ruby_parser (3.15.1)
236
+ sexp_processor (~> 4.9)
237
+ rubyzip (2.3.0)
238
+ sass-rails (6.0.0)
239
+ sassc-rails (~> 2.1, >= 2.1.1)
240
+ sassc (2.4.0)
241
+ ffi (~> 1.9)
242
+ sassc-rails (2.1.2)
243
+ railties (>= 4.0.0)
244
+ sassc (>= 2.0)
245
+ sprockets (> 3.0)
246
+ sprockets-rails
247
+ tilt
248
+ selenium-webdriver (3.142.7)
249
+ childprocess (>= 0.5, < 4.0)
250
+ rubyzip (>= 1.2.2)
251
+ sexp_processor (4.15.2)
252
+ shoulda-matchers (4.5.1)
253
+ activesupport (>= 4.2.0)
254
+ simplecov (0.21.2)
255
+ docile (~> 1.1)
256
+ simplecov-html (~> 0.11)
257
+ simplecov_json_formatter (~> 0.1)
258
+ simplecov-console (0.9.1)
259
+ ansi
260
+ simplecov
261
+ terminal-table
262
+ simplecov-html (0.12.3)
263
+ simplecov_json_formatter (0.1.3)
264
+ sprockets (4.0.2)
265
+ concurrent-ruby (~> 1.0)
266
+ rack (> 1, < 3)
267
+ sprockets-rails (3.2.2)
268
+ actionpack (>= 4.0)
269
+ activesupport (>= 4.0)
270
+ sprockets (>= 3.0.0)
271
+ sqlite3 (1.4.2)
272
+ terminal-table (3.0.0)
273
+ unicode-display_width (~> 1.1, >= 1.1.1)
274
+ thor (1.1.0)
275
+ thread_safe (0.3.6)
276
+ tilt (2.0.10)
277
+ turbolinks (5.2.1)
278
+ turbolinks-source (~> 5.2)
279
+ turbolinks-source (5.2.0)
280
+ tzinfo (1.2.9)
281
+ thread_safe (~> 0.1)
282
+ unicode-display_width (1.7.0)
283
+ warden (1.2.9)
284
+ rack (>= 2.0.9)
285
+ web-console (4.1.0)
286
+ actionview (>= 6.0.0)
287
+ activemodel (>= 6.0.0)
288
+ bindex (>= 0.4.0)
289
+ railties (>= 6.0.0)
290
+ webdrivers (4.6.0)
291
+ nokogiri (~> 1.6)
292
+ rubyzip (>= 1.3.0)
293
+ selenium-webdriver (>= 3.0, < 4.0)
294
+ webpacker (4.3.0)
295
+ activesupport (>= 4.2)
296
+ rack-proxy (>= 0.6.1)
297
+ railties (>= 4.2)
298
+ webrick (1.7.0)
299
+ websocket-driver (0.7.3)
300
+ websocket-extensions (>= 0.1.0)
301
+ websocket-extensions (0.1.5)
302
+ xpath (3.2.0)
303
+ nokogiri (~> 1.8)
304
+ zeitwerk (2.4.2)
305
+
306
+ PLATFORMS
307
+ ruby
308
+
309
+ DEPENDENCIES
310
+ bootsnap (>= 1.4.2)
311
+ bundler (>= 2.2.16)
312
+ byebug
313
+ capybara (>= 2.15)
314
+ capybara-screenshot (>= 1.0.18)
315
+ codecov
316
+ database_cleaner (>= 2.0.1)
317
+ devise (~> 4.0)
318
+ devise-secure_password!
319
+ flay (>= 2.10.0)
320
+ jbuilder (~> 2.7)
321
+ launchy (>= 2.4.3)
322
+ listen (~> 3.2)
323
+ puma (~> 4.1)
324
+ rails (~> 6.0.3, >= 6.0.3.6)
325
+ rake (>= 12.3)
326
+ rspec (>= 3.7)
327
+ rspec-rails (>= 3.7)
328
+ rspec_junit_formatter (>= 0.3)
329
+ rubocop (>= 1.0.0)
330
+ rubocop-rails (>= 2.3.2)
331
+ rubocop-rspec (>= 1.35.0)
332
+ ruby2ruby (>= 2.4.0)
333
+ sass-rails (>= 6)
334
+ selenium-webdriver
335
+ shoulda-matchers
336
+ simplecov (>= 0.18.2)
337
+ simplecov-console (>= 0.4.2)
338
+ sqlite3 (~> 1.4)
339
+ turbolinks (~> 5)
340
+ tzinfo-data
341
+ web-console (>= 3.3.0)
342
+ webdrivers
343
+ webpacker (~> 4.0)
344
+ webrick (~> 1.7)
345
+
346
+ BUNDLED WITH
347
+ 2.2.16