devise 4.7.3 → 4.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +3 -4
- data/app/views/devise/shared/_links.html.erb +1 -1
- data/config/locales/en.yml +1 -1
- data/lib/devise/controllers/sign_in_out.rb +2 -0
- data/lib/devise/hooks/lockable.rb +2 -5
- data/lib/devise/models/authenticatable.rb +6 -2
- data/lib/devise/models/lockable.rb +9 -1
- data/lib/devise/omniauth.rb +2 -5
- data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
- data/lib/devise/version.rb +1 -1
- data/lib/generators/active_record/devise_generator.rb +17 -2
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 197ce185bf22b8dc45c17a615895b60e6b788360113c37d99a116db868197309
|
4
|
+
data.tar.gz: 8e3fa67c5bcd6c05ac3011e0b35f0cda57596ae74c2affceab84cab1da3aeb58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d3f76d9e898d36dc6eb4db5d5b098b76d339aeadac014c772b7097dc6a730a7577049bd00ea7a073beead47454edb91d24fe73b50e90af3555cc5e83886902f
|
7
|
+
data.tar.gz: 84cbafa77c70de3c204dfdf19e4ce53ac05796eaf959bba4d4909d0c91686baa6da61f732e13bce0892d8932af375d2b81340f6bd1047384f15325f8a24011e0
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
### unreleased
|
2
|
+
|
3
|
+
### 4.8.0 - 2021-04-29
|
4
|
+
|
5
|
+
* enhancements
|
6
|
+
* Devise now enables the upgrade of OmniAuth 2+. Previously Devise would raise an error if you'd try to upgrade. Please note that OmniAuth 2 is considered a security upgrade and recommended to everyone. You can read more about the details (and possible necessary changes to your app as part of the upgrade) in [their release notes](https://github.com/omniauth/omniauth/releases/tag/v2.0.0). [Devise's OmniAuth Overview wiki](https://github.com/heartcombo/devise/wiki/OmniAuth:-Overview) was also updated to cover OmniAuth 2.0 requirements.
|
7
|
+
- Note that the upgrade required Devise shared links that initiate the OmniAuth flow to be changed to `method: :post`, which is now a requirement for OmniAuth, part of the security improvement. If you have copied and customized the Devise shared links partial to your app, or if you have other links in your app that initiate the OmniAuth flow, they will have to be updated to use `method: :post`, or changed to use buttons (e.g. `button_to`) to work with OmniAuth 2. (if you're using links with `method: :post`, make sure your app has `rails-ujs` or `jquery-ujs` included in order for these links to work properly.)
|
8
|
+
- As part of the OmniAuth 2.0 upgrade you might also need to add the [`omniauth-rails_csrf_protection`](https://github.com/cookpad/omniauth-rails_csrf_protection) gem to your app if you don't have it already. (and you don't want to roll your own code to verify requests.) Check the OmniAuth v2 release notes for more info.
|
9
|
+
* Introduce `Lockable#reset_failed_attempts!` model method to reset failed attempts counter to 0 after the user signs in.
|
10
|
+
- This logic existed inside the lockable warden hook and is triggered automatically after the user signs in. The new model method is an extraction to allow you to override it in the application to implement things like switching to a write database if you're using the new multi-DB infrastructure from Rails for example, similar to how it's already possible with `Trackable#update_tracked_fields!`.
|
11
|
+
* Add support for Ruby 3.
|
12
|
+
* Add support for Rails 6.1.
|
13
|
+
* Move CI to GitHub Actions.
|
14
|
+
|
15
|
+
* deprecations
|
16
|
+
* `Devise::Models::Authenticatable::BLACKLIST_FOR_SERIALIZATION` is deprecated in favor of `Devise::Models::Authenticatable::UNSAFE_ATTRIBUTES_FOR_SERIALIZATION` (@hanachin)
|
17
|
+
|
1
18
|
### 4.7.3 - 2020-09-20
|
2
19
|
|
3
20
|
* bug fixes
|
data/README.md
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
![Devise Logo](https://raw.github.com/heartcombo/devise/master/devise.png)
|
2
2
|
|
3
|
-
[![Build Status](https://api.travis-ci.org/heartcombo/devise.svg?branch=master)](http://travis-ci.org/heartcombo/devise)
|
4
3
|
[![Code Climate](https://codeclimate.com/github/heartcombo/devise.svg)](https://codeclimate.com/github/heartcombo/devise)
|
5
4
|
|
6
5
|
Devise is a flexible authentication solution for Rails based on Warden. It:
|
@@ -118,7 +117,7 @@ You will usually want to write tests for your changes. To run the test suite, g
|
|
118
117
|
Devise works with multiple Ruby and Rails versions, and ActiveRecord and Mongoid ORMs, which means you can run the test suite with some modifiers: `DEVISE_ORM` and `BUNDLE_GEMFILE`.
|
119
118
|
|
120
119
|
### DEVISE_ORM
|
121
|
-
Since Devise
|
120
|
+
Since Devise supports both Mongoid and ActiveRecord, we rely on this variable to run specific code for each ORM.
|
122
121
|
The default value of `DEVISE_ORM` is `active_record`. To run the tests for Mongoid, you can pass `mongoid`:
|
123
122
|
```
|
124
123
|
DEVISE_ORM=mongoid bin/test
|
@@ -131,7 +130,7 @@ Please note that the command output will show the variable value being used.
|
|
131
130
|
|
132
131
|
### BUNDLE_GEMFILE
|
133
132
|
We can use this variable to tell bundler what Gemfile it should use (instead of the one in the current directory).
|
134
|
-
Inside the [gemfiles](https://github.com/heartcombo/devise/tree/master/gemfiles) directory, we have one for each version of Rails we support. When you send us a pull request, it may happen that the test suite breaks
|
133
|
+
Inside the [gemfiles](https://github.com/heartcombo/devise/tree/master/gemfiles) directory, we have one for each version of Rails we support. When you send us a pull request, it may happen that the test suite breaks using some of them. If that's the case, you can simulate the same environment using the `BUNDLE_GEMFILE` variable.
|
135
134
|
For example, if the tests broke using Ruby 2.4.2 and Rails 4.1, you can do the following:
|
136
135
|
```bash
|
137
136
|
rbenv shell 2.4.2 # or rvm use 2.4.2
|
@@ -685,7 +684,7 @@ If you enable the [Recoverable](http://rubydoc.info/github/heartcombo/devise/mas
|
|
685
684
|
1. Action Mailer logs the entire contents of all outgoing emails to the DEBUG level. Password reset tokens delivered to users in email will be leaked.
|
686
685
|
2. Active Job logs all arguments to every enqueued job at the INFO level. If you configure Devise to use `deliver_later` to send password reset emails, password reset tokens will be leaked.
|
687
686
|
|
688
|
-
Rails sets the production logger level to
|
687
|
+
Rails sets the production logger level to INFO by default. Consider changing your production logger level to WARN if you wish to prevent tokens from being leaked into your logs. In `config/environments/production.rb`:
|
689
688
|
|
690
689
|
```ruby
|
691
690
|
config.log_level = :warn
|
@@ -20,6 +20,6 @@
|
|
20
20
|
|
21
21
|
<%- if devise_mapping.omniauthable? %>
|
22
22
|
<%- resource_class.omniauth_providers.each do |provider| %>
|
23
|
-
<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %><br />
|
23
|
+
<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), method: :post %><br />
|
24
24
|
<% end %>
|
25
25
|
<% end %>
|
data/config/locales/en.yml
CHANGED
@@ -44,7 +44,7 @@ en:
|
|
44
44
|
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
45
45
|
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address."
|
46
46
|
updated: "Your account has been updated successfully."
|
47
|
-
updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again"
|
47
|
+
updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again."
|
48
48
|
sessions:
|
49
49
|
signed_in: "Signed in successfully."
|
50
50
|
signed_out: "Signed out successfully."
|
@@ -106,10 +106,12 @@ module Devise
|
|
106
106
|
private
|
107
107
|
|
108
108
|
def expire_data_after_sign_in!
|
109
|
+
# TODO: remove once Rails 5.2+ and forward are only supported.
|
109
110
|
# session.keys will return an empty array if the session is not yet loaded.
|
110
111
|
# This is a bug in both Rack and Rails.
|
111
112
|
# A call to #empty? forces the session to be loaded.
|
112
113
|
session.empty?
|
114
|
+
|
113
115
|
session.keys.grep(/^devise\./).each { |k| session.delete(k) }
|
114
116
|
end
|
115
117
|
|
@@ -3,10 +3,7 @@
|
|
3
3
|
# After each sign in, if resource responds to failed_attempts, sets it to 0
|
4
4
|
# This is only triggered when the user is explicitly set (with set_user)
|
5
5
|
Warden::Manager.after_set_user except: :fetch do |record, warden, options|
|
6
|
-
if record.respond_to?(:
|
7
|
-
|
8
|
-
record.failed_attempts = 0
|
9
|
-
record.save(validate: false)
|
10
|
-
end
|
6
|
+
if record.respond_to?(:reset_failed_attempts!) && warden.authenticated?(options[:scope])
|
7
|
+
record.reset_failed_attempts!
|
11
8
|
end
|
12
9
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'devise/hooks/activatable'
|
4
4
|
require 'devise/hooks/csrf_cleaner'
|
5
|
+
require 'devise/rails/deprecated_constant_accessor'
|
5
6
|
|
6
7
|
module Devise
|
7
8
|
module Models
|
@@ -55,11 +56,14 @@ module Devise
|
|
55
56
|
module Authenticatable
|
56
57
|
extend ActiveSupport::Concern
|
57
58
|
|
58
|
-
|
59
|
+
UNSAFE_ATTRIBUTES_FOR_SERIALIZATION = [:encrypted_password, :reset_password_token, :reset_password_sent_at,
|
59
60
|
:remember_created_at, :sign_in_count, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip,
|
60
61
|
:last_sign_in_ip, :password_salt, :confirmation_token, :confirmed_at, :confirmation_sent_at,
|
61
62
|
:remember_token, :unconfirmed_email, :failed_attempts, :unlock_token, :locked_at]
|
62
63
|
|
64
|
+
include Devise::DeprecatedConstantAccessor
|
65
|
+
deprecate_constant "BLACKLIST_FOR_SERIALIZATION", "Devise::Models::Authenticatable::UNSAFE_ATTRIBUTES_FOR_SERIALIZATION"
|
66
|
+
|
63
67
|
included do
|
64
68
|
class_attribute :devise_modules, instance_writer: false
|
65
69
|
self.devise_modules ||= []
|
@@ -109,7 +113,7 @@ module Devise
|
|
109
113
|
if options[:force_except]
|
110
114
|
options[:except].concat Array(options[:force_except])
|
111
115
|
else
|
112
|
-
options[:except].concat
|
116
|
+
options[:except].concat UNSAFE_ATTRIBUTES_FOR_SERIALIZATION
|
113
117
|
end
|
114
118
|
|
115
119
|
super(options)
|
@@ -57,6 +57,14 @@ module Devise
|
|
57
57
|
save(validate: false)
|
58
58
|
end
|
59
59
|
|
60
|
+
# Resets failed attempts counter to 0.
|
61
|
+
def reset_failed_attempts!
|
62
|
+
if respond_to?(:failed_attempts) && !failed_attempts.to_i.zero?
|
63
|
+
self.failed_attempts = 0
|
64
|
+
save(validate: false)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
60
68
|
# Verifies whether a user is locked or not.
|
61
69
|
def access_locked?
|
62
70
|
!!locked_at && !lock_expired?
|
@@ -110,7 +118,7 @@ module Devise
|
|
110
118
|
false
|
111
119
|
end
|
112
120
|
end
|
113
|
-
|
121
|
+
|
114
122
|
def increment_failed_attempts
|
115
123
|
self.class.increment_counter(:failed_attempts, id)
|
116
124
|
reload
|
data/lib/devise/omniauth.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
begin
|
4
|
+
gem "omniauth", ">= 1.0.0"
|
5
|
+
|
4
6
|
require "omniauth"
|
5
|
-
require "omniauth/version"
|
6
7
|
rescue LoadError
|
7
8
|
warn "Could not load 'omniauth'. Please ensure you have the omniauth gem >= 1.0.0 installed and listed in your Gemfile."
|
8
9
|
raise
|
9
10
|
end
|
10
11
|
|
11
|
-
unless OmniAuth::VERSION =~ /^1\./
|
12
|
-
raise "You are using an old OmniAuth version, please ensure you have 1.0.0.pr2 version or later installed."
|
13
|
-
end
|
14
|
-
|
15
12
|
# Clean up the default path_prefix. It will be automatically set by Devise.
|
16
13
|
OmniAuth.config.path_prefix = nil
|
17
14
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'active_support/deprecation/constant_accessor'
|
5
|
+
|
6
|
+
module Devise
|
7
|
+
DeprecatedConstantAccessor = ActiveSupport::Deprecation::DeprecatedConstantAccessor #:nodoc:
|
8
|
+
end
|
9
|
+
rescue LoadError
|
10
|
+
|
11
|
+
# Copy of constant deprecation module from Rails / Active Support version 6, so we can use it
|
12
|
+
# with Rails <= 5.0 versions. This can be removed once we support only Rails 5.1 or greater.
|
13
|
+
module Devise
|
14
|
+
module DeprecatedConstantAccessor #:nodoc:
|
15
|
+
def self.included(base)
|
16
|
+
require "active_support/inflector/methods"
|
17
|
+
|
18
|
+
extension = Module.new do
|
19
|
+
def const_missing(missing_const_name)
|
20
|
+
if class_variable_defined?(:@@_deprecated_constants)
|
21
|
+
if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
|
22
|
+
replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", Rails::VERSION::MAJOR == 4 ? caller : caller_locations)
|
23
|
+
return ActiveSupport::Inflector.constantize(replacement[:new].to_s)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def deprecate_constant(const_name, new_constant, message: nil, deprecator: ActiveSupport::Deprecation.instance)
|
30
|
+
class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
|
31
|
+
class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
base.singleton_class.prepend extension
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/devise/version.rb
CHANGED
@@ -86,9 +86,24 @@ RUBY
|
|
86
86
|
Rails::VERSION::MAJOR >= 5
|
87
87
|
end
|
88
88
|
|
89
|
+
def rails61_and_up?
|
90
|
+
Rails::VERSION::MAJOR > 6 || (Rails::VERSION::MAJOR == 6 && Rails::VERSION::MINOR >= 1)
|
91
|
+
end
|
92
|
+
|
89
93
|
def postgresql?
|
90
|
-
|
91
|
-
|
94
|
+
ar_config && ar_config['adapter'] == 'postgresql'
|
95
|
+
end
|
96
|
+
|
97
|
+
def ar_config
|
98
|
+
if ActiveRecord::Base.configurations.respond_to?(:configs_for)
|
99
|
+
if rails61_and_up?
|
100
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: "primary").configuration_hash
|
101
|
+
else
|
102
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary").config
|
103
|
+
end
|
104
|
+
else
|
105
|
+
ActiveRecord::Base.configurations[Rails.env]
|
106
|
+
end
|
92
107
|
end
|
93
108
|
|
94
109
|
def migration_version
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- José Valim
|
8
8
|
- Carlos Antônio
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-04-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: warden
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- lib/devise/parameter_filter.rb
|
156
156
|
- lib/devise/parameter_sanitizer.rb
|
157
157
|
- lib/devise/rails.rb
|
158
|
+
- lib/devise/rails/deprecated_constant_accessor.rb
|
158
159
|
- lib/devise/rails/routes.rb
|
159
160
|
- lib/devise/rails/warden_compat.rb
|
160
161
|
- lib/devise/secret_key_finder.rb
|
@@ -202,7 +203,7 @@ homepage: https://github.com/heartcombo/devise
|
|
202
203
|
licenses:
|
203
204
|
- MIT
|
204
205
|
metadata: {}
|
205
|
-
post_install_message:
|
206
|
+
post_install_message:
|
206
207
|
rdoc_options: []
|
207
208
|
require_paths:
|
208
209
|
- lib
|
@@ -217,8 +218,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
217
218
|
- !ruby/object:Gem::Version
|
218
219
|
version: '0'
|
219
220
|
requirements: []
|
220
|
-
rubygems_version: 3.
|
221
|
-
signing_key:
|
221
|
+
rubygems_version: 3.2.6
|
222
|
+
signing_key:
|
222
223
|
specification_version: 4
|
223
224
|
summary: Flexible authentication solution for Rails with Warden
|
224
225
|
test_files: []
|