mirror of
https://github.com/heartcombo/devise.git
synced 2026-01-09 23:58:06 -05:00
Compare commits
120 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
245b1f9de0 | ||
|
|
e05523f767 | ||
|
|
2c8727ad42 | ||
|
|
b1508e93e1 | ||
|
|
5b57aa0b85 | ||
|
|
768656deb9 | ||
|
|
fe10a5b17a | ||
|
|
22784cb55a | ||
|
|
656720583f | ||
|
|
a20cca6873 | ||
|
|
8d78dc072f | ||
|
|
b2a2e85412 | ||
|
|
c2c74b0a39 | ||
|
|
92bb772d36 | ||
|
|
783234c72a | ||
|
|
2671f19cb1 | ||
|
|
72ea8392a8 | ||
|
|
bb44d422d6 | ||
|
|
5d304ae63a | ||
|
|
0c991af985 | ||
|
|
ac702843dd | ||
|
|
4015488b90 | ||
|
|
cccc137714 | ||
|
|
3fa0afad67 | ||
|
|
29142418ba | ||
|
|
c3b54dc0c2 | ||
|
|
a0232cf763 | ||
|
|
57980ba82a | ||
|
|
bcdd54cc5e | ||
|
|
83d5d3142d | ||
|
|
cbbe932ee2 | ||
|
|
593ae41f9d | ||
|
|
e9770fd434 | ||
|
|
53f6785e11 | ||
|
|
1b48fd0abe | ||
|
|
b835059baf | ||
|
|
f7359d6d96 | ||
|
|
4924dd68ae | ||
|
|
02ed166f51 | ||
|
|
9a11586a72 | ||
|
|
b5a5bae09c | ||
|
|
e757543323 | ||
|
|
7b000390a0 | ||
|
|
3f3ec236bb | ||
|
|
22dd3b489d | ||
|
|
0d45142845 | ||
|
|
62d6b5afb7 | ||
|
|
934fe45cfe | ||
|
|
675ae4d802 | ||
|
|
48251f236f | ||
|
|
8e6e70eaa7 | ||
|
|
4925ffda31 | ||
|
|
f89921e153 | ||
|
|
863b811167 | ||
|
|
d1f8884ee6 | ||
|
|
9caf07dd4f | ||
|
|
2044fffa25 | ||
|
|
2e442d81f7 | ||
|
|
28f0e3281a | ||
|
|
6a0d881554 | ||
|
|
4a9eee5a1c | ||
|
|
a4d3b9f14a | ||
|
|
1beac93961 | ||
|
|
8286325fd0 | ||
|
|
228f24c491 | ||
|
|
cff78eec23 | ||
|
|
20d786d7ca | ||
|
|
0c1b1a896f | ||
|
|
db8e247aa5 | ||
|
|
e01fdba557 | ||
|
|
0a1e55f11c | ||
|
|
85bcbdf18b | ||
|
|
a45c4c0ac4 | ||
|
|
d293e00ef5 | ||
|
|
201a4f92c2 | ||
|
|
71f90c0d6e | ||
|
|
26e22d8e95 | ||
|
|
9805728964 | ||
|
|
f64022a57b | ||
|
|
e79201aef8 | ||
|
|
a2498074f1 | ||
|
|
536279b05b | ||
|
|
031351224a | ||
|
|
74ab3e9a05 | ||
|
|
1bc9ebd7de | ||
|
|
81869de9c5 | ||
|
|
f6301c08f6 | ||
|
|
d66d9297fb | ||
|
|
78bbf6dcc4 | ||
|
|
1ff64fbbd3 | ||
|
|
3226ab16c1 | ||
|
|
13285d7ef3 | ||
|
|
7346ce709a | ||
|
|
8ac32f14b1 | ||
|
|
91ef42dc0a | ||
|
|
1ddca80cee | ||
|
|
896521be73 | ||
|
|
6e419ce821 | ||
|
|
93df02f601 | ||
|
|
fdd9337b64 | ||
|
|
2040b021e1 | ||
|
|
d122faf410 | ||
|
|
eaa4713e22 | ||
|
|
0c1a14e8f2 | ||
|
|
357ce9c3b5 | ||
|
|
830d3e86ee | ||
|
|
209b97d86b | ||
|
|
4da955d9cd | ||
|
|
bff701758a | ||
|
|
90acc6fc23 | ||
|
|
eba2527b8e | ||
|
|
48220f087b | ||
|
|
26b17abb01 | ||
|
|
22468f3756 | ||
|
|
9696d83e7d | ||
|
|
7d10019d2a | ||
|
|
274f8f2f87 | ||
|
|
3360b10c2f | ||
|
|
6f9561e64f | ||
|
|
016b216d95 |
16
.travis.yml
16
.travis.yml
@@ -1,22 +1,24 @@
|
||||
language: ruby
|
||||
|
||||
rvm:
|
||||
- 2.3.0
|
||||
- 2.2.4
|
||||
- 2.1.8
|
||||
- 2.1.9
|
||||
- 2.2.5
|
||||
- 2.3.1
|
||||
- ruby-head
|
||||
|
||||
gemfile:
|
||||
- Gemfile
|
||||
- gemfiles/Gemfile.rails-5.0-beta
|
||||
- gemfiles/Gemfile.rails-4.2-stable
|
||||
- gemfiles/Gemfile.rails-4.1-stable
|
||||
|
||||
matrix:
|
||||
exclude:
|
||||
- rvm: 2.1.8
|
||||
gemfile: gemfiles/Gemfile.rails-5.0-beta
|
||||
- rvm: 2.1.9
|
||||
gemfile: Gemfile
|
||||
- env: DEVISE_ORM=mongoid
|
||||
gemfile: gemfiles/Gemfile.rails-5.0-beta
|
||||
gemfile: Gemfile
|
||||
allow_failures:
|
||||
- rvm: ruby-head
|
||||
services:
|
||||
- mongodb
|
||||
|
||||
|
||||
101
CHANGELOG.md
101
CHANGELOG.md
@@ -1,5 +1,102 @@
|
||||
### Unreleased
|
||||
|
||||
### 4.2.0 - 2016-07-01
|
||||
|
||||
* removals
|
||||
* Remove the deprecated `Devise::ParameterSanitizer` API from Devise 3.
|
||||
Please use the `#permit` and `#sanitize` methods over `#for`.
|
||||
* Remove the deprecated OmniAuth URL helpers. Use the fully qualified helpers
|
||||
(`user_facebook_omniauth_authorize_path`) over the scope based helpers
|
||||
( `user_omniauth_authorize_path(:facebook)`).
|
||||
* Remove the `Devise.bcrypt` method, use `Devise::Encryptor.digest` instead.
|
||||
* Remove the `Devise::Models::Confirmable#confirm!` method, use `confirm` instead.
|
||||
* Remove the `Devise::Models::Recoverable#reset_password!` method, use `reset_password` instead.
|
||||
* Remove the `Devise::Models::Recoverable#after_password_reset` method.
|
||||
* bug fixes
|
||||
* Fix an `ActionDispatch::IllegalStateError` when testing controllers with Rails 5 rc 2(by @hamadata).
|
||||
* Use `ActiveSupport.on_load` hooks to include Devise on `ActiveRecord` and `Mongoid`,
|
||||
avoiding autoloading these constants too soon (by @lucasmazza, @rafaelfranca).
|
||||
* enhancements
|
||||
* Display the minimum password length on `registrations/edit` view (by @Yanchek99).
|
||||
* You can disable Devise's routes reloading on boot by through the `reload_routes = false` config.
|
||||
This can reduce the time taken to boot the application but it might trigger
|
||||
some errors if you application (mostly your controllers) requires that
|
||||
Devise mappings be loaded during boot time (by @sidonath).
|
||||
* Added `Devise::Test::IntegrationHelpers` to bypass the sign in process using
|
||||
Warden test API (by @lucasmazza).
|
||||
* Define `inspect` in `Devise::Models::Authenticatable` to help ensure password hashes
|
||||
aren't included in exceptions or otherwise accidentally serialized (by @tkrajcar).
|
||||
* Add missing support of `Rails.application.config.action_controller.relative_url_root` (by @kosdiamantis).
|
||||
* deprecations
|
||||
* `Devise::TestHelpers` is deprecated in favor of `Devise::Test::ControllerHelpers`
|
||||
(by @lucasmazza).
|
||||
* The `sign_in` test helper has changed to use keyword arguments when passing
|
||||
a scope. `sign_in :admin, users(:alice)` should be rewritten as
|
||||
`sign_in users(:alice), scope: :admin` (by @lucasmazza).
|
||||
* The option `bypass` of `Devise::Controllers::SignInOut#sign_in` method is
|
||||
deprecated in favor of `Devise::Controllers::SignInOut#bypass_sign_in`
|
||||
method (by @ulissesalmeida).
|
||||
|
||||
### 4.1.1 - 2016-05-15
|
||||
|
||||
* bug fixes
|
||||
* Fix overwriting the remember_token when a valid one already exists (by @ralinchimev).
|
||||
|
||||
### 4.1.0
|
||||
|
||||
* bug fixes
|
||||
* Fix race condition of sending the confirmation instructions e-mail using background jobs.
|
||||
Using the previous `after_create` callback, the e-mail can be sent before
|
||||
the record be committed on database, generating a `ActiveRecord::NotFound` error.
|
||||
Now the confirmation e-mail will be only sent after the database commit,
|
||||
using the `after_commit` callback.
|
||||
It may break your test suite on Rails 4 if you are testing the sent e-mails
|
||||
or enqueued jobs using transactional fixtures enabled or `DatabaseCleaner` with `transaction` strategy.
|
||||
You can easily fix your test suite using the gem
|
||||
[test_after_commit](https://github.com/grosser/test_after_commit). For example, put in your Gemfile:
|
||||
|
||||
```ruby
|
||||
gem 'test_after_commit', :group => :test
|
||||
```
|
||||
|
||||
On Rails 5 `after_commit` callbacks are triggered even using transactional
|
||||
fixtures, then this fix will not break your test suite. If you are using `DatabaseCleaner` with the `deletion` or `truncation` strategies it may not break your tests. (by @allenwq)
|
||||
* Fix strategy checking in `Lockable#unlock_strategy_enabled?` for `:none` and
|
||||
`:undefined` strategies. (by @f3ndot)
|
||||
* features
|
||||
* Humanize authentication keys in failure flash message (by @byzg)
|
||||
When you are configuring the translations of `devise.failure.invalid`, the
|
||||
`authentication_keys` is translated now.
|
||||
* deprecations
|
||||
* Remove code supporting old session serialization format (by @fphilipe).
|
||||
* Now the `email_regexp` default uses a more permissive regex:
|
||||
`/\A[^@\s]+@[^@\s]+\z/` (by @kimgb)
|
||||
* Now the `strip_whitespace_keys` default is `[:email]` (by @ulissesalmeida)
|
||||
* Now the `reconfirmable` default is `true` (by @ulissesalmeida)
|
||||
* Now the `skip_session_storage` default is `[:http_auth]` (by @ulissesalmeida)
|
||||
* Now the `sign_out_via` default is `:delete` (by @ulissesalmeida)
|
||||
* improvements
|
||||
* Avoids extra computation of friendly token for confirmation token (by @sbc100)
|
||||
|
||||
### 4.0.3 - 2016-05-15
|
||||
|
||||
* bug fixes
|
||||
* Fix overwriting the remember_token when a valid one already exists (by @ralinchimev).
|
||||
|
||||
### 4.0.2 - 2016-05-02
|
||||
|
||||
* bug fixes
|
||||
* Fix strategy checking in `Lockable#unlock_strategy_enabled?` for `:none`
|
||||
and `:undefined` strategies. (by @f3ndot)
|
||||
|
||||
### 4.0.1 - 2016-04-25
|
||||
|
||||
* bug fixes
|
||||
* Fix the e-mail confirmation instructions send when a user updates the email
|
||||
address from nil. (by @lmduc)
|
||||
* Remove unnecessary `attribute_will_change!` call. (by @cadejscroggins)
|
||||
* Consistent `permit!` check. (by @ulissesalmeida)
|
||||
|
||||
### 4.0.0 - 2016-04-18
|
||||
|
||||
* bug fixes
|
||||
@@ -29,11 +126,11 @@
|
||||
|
||||
* deprecations
|
||||
* omniauth routes are no longer defined with a wildcard `:provider` parameter,
|
||||
and provider specific routes are defined instead, so route helpers like `user_omniauth_authorize_path(:github)` are deprecated in favor of `user_github_authorize_path`.
|
||||
and provider specific routes are defined instead, so route helpers like `user_omniauth_authorize_path(:github)` are deprecated in favor of `user_github_omniauth_authorize_path`.
|
||||
You can still use `omniauth_authorize_path(:user, :github)` if you need to
|
||||
call the helpers dynamically.
|
||||
|
||||
### 4.0.0.rc1 - 2016-01-02
|
||||
### 4.0.0.rc1 - 2016-02-01
|
||||
|
||||
* Support added to Rails 5 (by @twalpole).
|
||||
* Devise no longer supports Rails 3.2 and 4.0.
|
||||
|
||||
@@ -1,16 +1,39 @@
|
||||
### Please read before contributing
|
||||
|
||||
1) Do not post questions in the issues tracker. If you have any questions about Devise, search the [Wiki](https://github.com/plataformatec/devise/wiki) or use the [Mailing List](https://groups.google.com/group/plataformatec-devise) or [Stack Overflow](http://stackoverflow.com/questions/tagged/devise).
|
||||
1) Do not post questions in the issues tracker. If you have any questions about
|
||||
Devise, search the [Wiki](https://github.com/plataformatec/devise/wiki) or use
|
||||
the [Mailing List](https://groups.google.com/group/plataformatec-devise) or
|
||||
[Stack Overflow](http://stackoverflow.com/questions/tagged/devise).
|
||||
|
||||
2) If you find a security bug, **DO NOT** submit an issue here. Please send an e-mail to [opensource@plataformatec.com.br](mailto:opensource@plataformatec.com.br) instead.
|
||||
2) If you find a security bug, **DO NOT** submit an issue here. Please send an
|
||||
e-mail to [opensource@plataformatec.com.br](mailto:opensource@plataformatec.com.br)
|
||||
instead.
|
||||
|
||||
3) Do a small search on the issues tracker before submitting your issue to see if it was already reported / fixed.
|
||||
3) If possible, replicate your issue with our
|
||||
[guides/bug_report_templates/integration_test.rb](test case example), and attach
|
||||
it to your issue or Pull Request - this way we have an isolated way to replicate
|
||||
your issue and investigate it further.
|
||||
|
||||
4) When reporting an issue, include Rails, Devise and Warden versions. If you are getting exceptions, please include the full backtrace.
|
||||
4) Otherwise, please provide a fresh new Rails application that replicates your
|
||||
issue on a public GitHub repository, as some scenarios might not be possible to
|
||||
replicate using the standalone test case example.
|
||||
|
||||
5) Notice that all of your interactions in the project are expected to follow our [Code of Conduct](CODE_OF_CONDUCT.md)
|
||||
5) Do a small search on the issues tracker before submitting your issue to see
|
||||
if it was already reported / fixed. Duplicated issues will be closed to avoid
|
||||
too much noise/duplication in the issue tracker.
|
||||
|
||||
That's it! The more information you give, the easier it becomes for us to track it down and fix it.
|
||||
Ideally, you should provide an application that reproduces the error or a test case to Devise's suite.
|
||||
6) When reporting an issue, include Rails, Devise and Warden versions. If you
|
||||
are getting exceptions, please include the full backtrace.
|
||||
|
||||
7) Please do not attempt to translate Devise built in views. The views are meant
|
||||
to be a starting point and not a final version. For historical references,
|
||||
please look into closed issues/Pull regarding i18n.
|
||||
|
||||
8) Notice that all of your interactions in the project are expected to follow
|
||||
our [Code of Conduct](CODE_OF_CONDUCT.md)
|
||||
|
||||
That's it! The more information you give, the easier it becomes for us to track
|
||||
it down and fix it. Ideally, you should provide an application that reproduces
|
||||
the error or a test case to Devise's suite.
|
||||
|
||||
Thanks!
|
||||
|
||||
20
Gemfile
20
Gemfile
@@ -2,14 +2,21 @@ source "https://rubygems.org"
|
||||
|
||||
gemspec
|
||||
|
||||
gem "rails", "~> 4.2.6"
|
||||
gem "rails", "~> 5.0.0"
|
||||
gem "omniauth", "~> 1.3"
|
||||
gem "omniauth-oauth2", "~> 1.4"
|
||||
gem "oauth2"
|
||||
gem "omniauth-oauth2"
|
||||
gem "rdoc"
|
||||
|
||||
gem "activemodel-serializers-xml", github: "rails/activemodel-serializers-xml"
|
||||
|
||||
gem "rails-controller-testing"
|
||||
|
||||
gem "responders", "~> 2.1"
|
||||
|
||||
group :test do
|
||||
gem "omniauth-facebook"
|
||||
gem "omniauth-openid", "~> 1.0.1"
|
||||
gem "omniauth-openid"
|
||||
gem "webrat", "0.7.3", require: false
|
||||
gem "mocha", "~> 1.1", require: false
|
||||
end
|
||||
@@ -24,6 +31,7 @@ platforms :ruby do
|
||||
gem "sqlite3"
|
||||
end
|
||||
|
||||
group :mongoid do
|
||||
gem "mongoid", "~> 4.0"
|
||||
end
|
||||
# TODO:
|
||||
# group :mongoid do
|
||||
# gem "mongoid", "~> 4.0.0"
|
||||
# end
|
||||
|
||||
180
Gemfile.lock
180
Gemfile.lock
@@ -1,7 +1,17 @@
|
||||
GIT
|
||||
remote: git://github.com/rails/activemodel-serializers-xml.git
|
||||
revision: 570ee7ed33d60e44ca1f3ccbec3d1fbf61d52cbf
|
||||
specs:
|
||||
activemodel-serializers-xml (1.0.1)
|
||||
activemodel (> 5.x)
|
||||
activerecord (> 5.x)
|
||||
activesupport (> 5.x)
|
||||
builder (~> 3.1)
|
||||
|
||||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
devise (4.0.0)
|
||||
devise (4.2.0)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 4.1.0, < 5.1)
|
||||
@@ -11,83 +21,79 @@ PATH
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actionmailer (4.2.6)
|
||||
actionpack (= 4.2.6)
|
||||
actionview (= 4.2.6)
|
||||
activejob (= 4.2.6)
|
||||
actioncable (5.0.0)
|
||||
actionpack (= 5.0.0)
|
||||
nio4r (~> 1.2)
|
||||
websocket-driver (~> 0.6.1)
|
||||
actionmailer (5.0.0)
|
||||
actionpack (= 5.0.0)
|
||||
actionview (= 5.0.0)
|
||||
activejob (= 5.0.0)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
actionpack (4.2.6)
|
||||
actionview (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
rack (~> 1.6)
|
||||
rack-test (~> 0.6.2)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (5.0.0)
|
||||
actionview (= 5.0.0)
|
||||
activesupport (= 5.0.0)
|
||||
rack (~> 2.0)
|
||||
rack-test (~> 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionview (4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
actionview (5.0.0)
|
||||
activesupport (= 5.0.0)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
activejob (4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
globalid (>= 0.3.0)
|
||||
activemodel (4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.2.6)
|
||||
activemodel (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
arel (~> 6.0)
|
||||
activesupport (4.2.6)
|
||||
activejob (5.0.0)
|
||||
activesupport (= 5.0.0)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (5.0.0)
|
||||
activesupport (= 5.0.0)
|
||||
activerecord (5.0.0)
|
||||
activemodel (= 5.0.0)
|
||||
activesupport (= 5.0.0)
|
||||
arel (~> 7.0)
|
||||
activesupport (5.0.0)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (~> 0.7)
|
||||
json (~> 1.7, >= 1.7.7)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
tzinfo (~> 1.1)
|
||||
arel (6.0.3)
|
||||
arel (7.0.0)
|
||||
bcrypt (3.1.11)
|
||||
bson (3.2.6)
|
||||
builder (3.2.2)
|
||||
concurrent-ruby (1.0.1)
|
||||
connection_pool (2.2.0)
|
||||
concurrent-ruby (1.0.2)
|
||||
erubis (2.7.0)
|
||||
faraday (0.9.2)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
globalid (0.3.6)
|
||||
activesupport (>= 4.1.0)
|
||||
hashie (3.4.3)
|
||||
hashie (3.4.4)
|
||||
i18n (0.7.0)
|
||||
json (1.8.3)
|
||||
jwt (1.5.1)
|
||||
jwt (1.5.4)
|
||||
loofah (2.0.3)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.6.3)
|
||||
mime-types (>= 1.16, < 3)
|
||||
mail (2.6.4)
|
||||
mime-types (>= 1.16, < 4)
|
||||
metaclass (0.0.4)
|
||||
mime-types (2.99.1)
|
||||
mini_portile2 (2.0.0)
|
||||
minitest (5.8.4)
|
||||
method_source (0.8.2)
|
||||
mime-types (3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0521)
|
||||
mini_portile2 (2.1.0)
|
||||
minitest (5.9.0)
|
||||
mocha (1.1.0)
|
||||
metaclass (~> 0.0.1)
|
||||
mongoid (4.0.2)
|
||||
activemodel (~> 4.0)
|
||||
moped (~> 2.0.0)
|
||||
origin (~> 2.1)
|
||||
tzinfo (>= 0.3.37)
|
||||
moped (2.0.7)
|
||||
bson (~> 3.0)
|
||||
connection_pool (~> 2.0)
|
||||
optionable (~> 0.2.0)
|
||||
multi_json (1.11.2)
|
||||
multi_json (1.12.1)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (2.0.0)
|
||||
nokogiri (1.6.7.2)
|
||||
mini_portile2 (~> 2.0.0.rc2)
|
||||
oauth2 (1.1.0)
|
||||
nio4r (1.2.1)
|
||||
nokogiri (1.6.8)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
pkg-config (~> 1.1.7)
|
||||
oauth2 (1.2.0)
|
||||
faraday (>= 0.8, < 0.10)
|
||||
jwt (~> 1.0, < 1.5.2)
|
||||
jwt (~> 1.0)
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
@@ -102,49 +108,51 @@ GEM
|
||||
omniauth-openid (1.0.1)
|
||||
omniauth (~> 1.0)
|
||||
rack-openid (~> 1.3.1)
|
||||
optionable (0.2.0)
|
||||
origin (2.2.0)
|
||||
orm_adapter (0.5.0)
|
||||
rack (1.6.4)
|
||||
pkg-config (1.1.7)
|
||||
rack (2.0.1)
|
||||
rack-openid (1.3.1)
|
||||
rack (>= 1.1.0)
|
||||
ruby-openid (>= 2.1.8)
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.2.6)
|
||||
actionmailer (= 4.2.6)
|
||||
actionpack (= 4.2.6)
|
||||
actionview (= 4.2.6)
|
||||
activejob (= 4.2.6)
|
||||
activemodel (= 4.2.6)
|
||||
activerecord (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
rails (5.0.0)
|
||||
actioncable (= 5.0.0)
|
||||
actionmailer (= 5.0.0)
|
||||
actionpack (= 5.0.0)
|
||||
actionview (= 5.0.0)
|
||||
activejob (= 5.0.0)
|
||||
activemodel (= 5.0.0)
|
||||
activerecord (= 5.0.0)
|
||||
activesupport (= 5.0.0)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.2.6)
|
||||
sprockets-rails
|
||||
rails-deprecated_sanitizer (1.0.3)
|
||||
activesupport (>= 4.2.0.alpha)
|
||||
rails-dom-testing (1.0.7)
|
||||
activesupport (>= 4.2.0.beta, < 5.0)
|
||||
railties (= 5.0.0)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-controller-testing (0.1.1)
|
||||
actionpack (~> 5.x)
|
||||
actionview (~> 5.x)
|
||||
activesupport (~> 5.x)
|
||||
rails-dom-testing (2.0.1)
|
||||
activesupport (>= 4.2.0, < 6.0)
|
||||
nokogiri (~> 1.6.0)
|
||||
rails-deprecated_sanitizer (>= 1.0.1)
|
||||
rails-html-sanitizer (1.0.3)
|
||||
loofah (~> 2.0)
|
||||
railties (4.2.6)
|
||||
actionpack (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
railties (5.0.0)
|
||||
actionpack (= 5.0.0)
|
||||
activesupport (= 5.0.0)
|
||||
method_source
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
rake (11.0.1)
|
||||
rake (11.2.2)
|
||||
rdoc (4.2.2)
|
||||
json (~> 1.4)
|
||||
responders (2.1.2)
|
||||
responders (2.2.0)
|
||||
railties (>= 4.2.0, < 5.1)
|
||||
ruby-openid (2.7.0)
|
||||
sprockets (3.5.2)
|
||||
sprockets (3.6.2)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.0.4)
|
||||
sprockets-rails (3.1.1)
|
||||
actionpack (>= 4.0)
|
||||
activesupport (>= 4.0)
|
||||
sprockets (>= 3.0.0)
|
||||
@@ -159,25 +167,31 @@ GEM
|
||||
nokogiri (>= 1.2.0)
|
||||
rack (>= 1.0)
|
||||
rack-test (>= 0.5.3)
|
||||
websocket-driver (0.6.4)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.2)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
activemodel-serializers-xml!
|
||||
activerecord-jdbc-adapter
|
||||
activerecord-jdbcsqlite3-adapter
|
||||
devise!
|
||||
jruby-openssl
|
||||
mocha (~> 1.1)
|
||||
mongoid (~> 4.0)
|
||||
oauth2
|
||||
omniauth (~> 1.3)
|
||||
omniauth-facebook
|
||||
omniauth-oauth2 (~> 1.4)
|
||||
omniauth-openid (~> 1.0.1)
|
||||
rails (~> 4.2.6)
|
||||
omniauth-oauth2
|
||||
omniauth-openid
|
||||
rails (~> 5.0.0)
|
||||
rails-controller-testing
|
||||
rdoc
|
||||
responders (~> 2.1)
|
||||
sqlite3
|
||||
webrat (= 0.7.3)
|
||||
|
||||
BUNDLED WITH
|
||||
1.11.2
|
||||
1.12.5
|
||||
|
||||
134
README.md
134
README.md
@@ -89,7 +89,7 @@ Once you have solidified your understanding of Rails and authentication mechanis
|
||||
|
||||
## Getting started
|
||||
|
||||
Devise 4.0 works with Rails 4.2 onwards. You can add it to your Gemfile with:
|
||||
Devise 4.0 works with Rails 4.1 onwards. You can add it to your Gemfile with:
|
||||
|
||||
```ruby
|
||||
gem 'devise'
|
||||
@@ -97,28 +97,31 @@ gem 'devise'
|
||||
|
||||
Run the bundle command to install it.
|
||||
|
||||
After you install Devise and add it to your Gemfile, you need to run the generator:
|
||||
Next, you need to run the generator:
|
||||
|
||||
```console
|
||||
rails generate devise:install
|
||||
$ rails generate devise:install
|
||||
```
|
||||
|
||||
The generator will install an initializer which describes ALL of Devise's configuration options. It is *imperative* that you take a look at it. When you are done, you are ready to add Devise to any of your models using the generator:
|
||||
|
||||
```console
|
||||
rails generate devise MODEL
|
||||
```
|
||||
|
||||
Replace MODEL with the class name used for the application’s users (it’s frequently `User` but could also be `Admin`). This will create a model (if one does not exist) and configure it with the default Devise modules. The generator also configures your `config/routes.rb` file to point to the Devise controller.
|
||||
|
||||
Next, check the MODEL for any additional configuration options you might want to add, such as confirmable or lockable. If you add an option, be sure to inspect the migration file (created by the generator if your ORM supports them) and uncomment the appropriate section. For example, if you add the confirmable option in the model, you'll need to uncomment the Confirmable section in the migration. Then run `rake db:migrate`
|
||||
|
||||
Next, you need to set up the default URL options for the Devise mailer in each environment. Here is a possible configuration for `config/environments/development.rb`:
|
||||
At this point, a number of instructions will appear in the console. Among these instructions, you'll need to set up the default URL options for the Devise mailer in each environment. Here is a possible configuration for `config/environments/development.rb`:
|
||||
|
||||
```ruby
|
||||
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
|
||||
```
|
||||
|
||||
The generator will install an initializer which describes ALL of Devise's configuration options. It is *imperative* that you take a look at it. When you are done, you are ready to add Devise to any of your models using the generator.
|
||||
|
||||
|
||||
In the following command you will replace `MODEL` with the class name used for the application’s users (it’s frequently `User` but could also be `Admin`). This will create a model (if one does not exist) and configure it with the default Devise modules. The generator also configures your `config/routes.rb` file to point to the Devise controller.
|
||||
|
||||
```console
|
||||
$ rails generate devise MODEL
|
||||
```
|
||||
|
||||
Next, check the MODEL for any additional configuration options you might want to add, such as confirmable or lockable. If you add an option, be sure to inspect the migration file (created by the generator if your ORM supports them) and uncomment the appropriate section. For example, if you add the confirmable option in the model, you'll need to uncomment the Confirmable section in the migration.
|
||||
|
||||
Then run `rake db:migrate`
|
||||
|
||||
You should restart your application after changing Devise's configuration options. Otherwise, you will run into strange errors, for example, users being unable to login and route helpers being undefined.
|
||||
|
||||
### Controller filters and helpers
|
||||
@@ -154,7 +157,7 @@ user_session
|
||||
After signing in a user, confirming the account or updating the password, Devise will look for a scoped root path to redirect to. For instance, when using a `:user` resource, the `user_root_path` will be used if it exists; otherwise, the default `root_path` will be used. This means that you need to set the root inside your routes:
|
||||
|
||||
```ruby
|
||||
root to: "home#index"
|
||||
root to: 'home#index'
|
||||
```
|
||||
|
||||
You can also override `after_sign_in_path_for` and `after_sign_out_path_for` to customize your redirect hooks.
|
||||
@@ -270,7 +273,7 @@ We built Devise to help you quickly develop an application that uses authenticat
|
||||
Since Devise is an engine, all its views are packaged inside the gem. These views will help you get started, but after some time you may want to change them. If this is the case, you just need to invoke the following generator, and it will copy all views to your application:
|
||||
|
||||
```console
|
||||
rails generate devise:views
|
||||
$ rails generate devise:views
|
||||
```
|
||||
|
||||
If you have more than one Devise model in your application (such as `User` and `Admin`), you will notice that Devise uses the same views for all models. Fortunately, Devise offers an easy way to customize views. All you need to do is set `config.scoped_views = true` inside the `config/initializers/devise.rb` file.
|
||||
@@ -278,14 +281,14 @@ If you have more than one Devise model in your application (such as `User` and `
|
||||
After doing so, you will be able to have views based on the role like `users/sessions/new` and `admins/sessions/new`. If no view is found within the scope, Devise will use the default view at `devise/sessions/new`. You can also use the generator to generate scoped views:
|
||||
|
||||
```console
|
||||
rails generate devise:views users
|
||||
$ rails generate devise:views users
|
||||
```
|
||||
|
||||
If you would like to generate only a few sets of views, like the ones for the `registerable` and `confirmable` module,
|
||||
you can pass a list of modules to the generator with the `-v` flag.
|
||||
|
||||
```console
|
||||
rails generate devise:views -v registrations confirmations
|
||||
$ rails generate devise:views -v registrations confirmations
|
||||
```
|
||||
|
||||
### Configuring controllers
|
||||
@@ -295,7 +298,7 @@ If the customization at the views level is not enough, you can customize each co
|
||||
1. Create your custom controllers using the generator which requires a scope:
|
||||
|
||||
```console
|
||||
rails generate devise:controllers [scope]
|
||||
$ rails generate devise:controllers [scope]
|
||||
```
|
||||
|
||||
If you specify `users` as the scope, controllers will be created in `app/controllers/users/`.
|
||||
@@ -314,7 +317,7 @@ If the customization at the views level is not enough, you can customize each co
|
||||
2. Tell the router to use this controller:
|
||||
|
||||
```ruby
|
||||
devise_for :users, controllers: { sessions: "users/sessions" }
|
||||
devise_for :users, controllers: { sessions: 'users/sessions' }
|
||||
```
|
||||
|
||||
3. Copy the views from `devise/sessions` to `users/sessions`. Since the controller was changed, it won't use the default views located in `devise/sessions`.
|
||||
@@ -352,7 +355,7 @@ Remember that Devise uses flash messages to let users know if sign in was succes
|
||||
Devise also ships with default routes. If you need to customize them, you should probably be able to do it through the devise_for method. It accepts several options like :class_name, :path_prefix and so on, including the possibility to change path names for I18n:
|
||||
|
||||
```ruby
|
||||
devise_for :users, path: "auth", path_names: { sign_in: 'login', sign_out: 'logout', password: 'secret', confirmation: 'verification', unlock: 'unblock', registration: 'register', sign_up: 'cmon_let_me_in' }
|
||||
devise_for :users, path: 'auth', path_names: { sign_in: 'login', sign_out: 'logout', password: 'secret', confirmation: 'verification', unlock: 'unblock', registration: 'register', sign_up: 'cmon_let_me_in' }
|
||||
```
|
||||
|
||||
Be sure to check `devise_for` [documentation](http://www.rubydoc.info/github/plataformatec/devise/master/ActionDispatch/Routing/Mapper%3Adevise_for) for details.
|
||||
@@ -361,7 +364,7 @@ If you have the need for more deep customization, for instance to also allow "/s
|
||||
|
||||
```ruby
|
||||
devise_scope :user do
|
||||
get "sign_in", to: "devise/sessions#new"
|
||||
get 'sign_in', to: 'devise/sessions#new'
|
||||
end
|
||||
```
|
||||
|
||||
@@ -411,45 +414,94 @@ Caution: Devise Controllers inherit from ApplicationController. If your app uses
|
||||
|
||||
### Test helpers
|
||||
|
||||
Devise includes some test helpers for functional specs. In order to use them, you need to include Devise in your functional tests by adding the following to the bottom of your `test/test_helper.rb` file (make sure you place it out of scope of `ActiveSupport::TestCase` which is the default class inside of `test/test_helper.rb`):
|
||||
Devise includes some test helpers for controller and integration tests.
|
||||
In order to use them, you need to include the respective module in your test
|
||||
cases/specs.
|
||||
|
||||
### Controller tests
|
||||
|
||||
Controller tests require that you include `Devise::Test::ControllerHelpers` on
|
||||
your test case or its parent `ActionController::TestCase` superclass.
|
||||
|
||||
```ruby
|
||||
class ActionController::TestCase
|
||||
include Devise::TestHelpers
|
||||
class PostsControllerTest < ActionController::TestCase
|
||||
include Devise::Test::ControllerHelpers
|
||||
end
|
||||
```
|
||||
|
||||
If you're using RSpec, you can put the following inside a file named `spec/support/devise.rb` or in your `spec/spec_helper.rb` (or `spec/rails_helper.rb` if you are using rspec-rails):
|
||||
If you're using RSpec, you can put the following inside a file named
|
||||
`spec/support/devise.rb` or in your `spec/spec_helper.rb` (or
|
||||
`spec/rails_helper.rb` if you are using `rspec-rails`):
|
||||
|
||||
```ruby
|
||||
RSpec.configure do |config|
|
||||
config.include Devise::TestHelpers, type: :controller
|
||||
config.include Devise::TestHelpers, type: :view
|
||||
config.include Devise::Test::ControllerHelpers, type: :controller
|
||||
config.include Devise::Test::ControllerHelpers, type: :view
|
||||
end
|
||||
```
|
||||
|
||||
Just be sure that this inclusion is made *after* the `require 'rspec/rails'` directive.
|
||||
|
||||
Now you are ready to use the `sign_in` and `sign_out` methods. Such methods have the same signature as in controllers:
|
||||
Now you are ready to use the `sign_in` and `sign_out` methods on your controller
|
||||
tests:
|
||||
|
||||
```ruby
|
||||
sign_in :user, @user # sign_in(scope, resource)
|
||||
sign_in @user # sign_in(resource)
|
||||
|
||||
sign_out :user # sign_out(scope)
|
||||
sign_out @user # sign_out(resource)
|
||||
sign_in @user
|
||||
sign_in @user, scope: admin
|
||||
```
|
||||
|
||||
There are two things that are important to keep in mind:
|
||||
If you are testing Devise internal controllers or a controller that inherits
|
||||
from Devise's, you need to tell Devise which mapping should be used before a
|
||||
request. This is necessary because Devise gets this information from the router,
|
||||
but since controller tests do not pass through the router, it needs to be stated
|
||||
explicitly. For example, if you are testing the user scope, simply use:
|
||||
|
||||
1. These helpers are not going to work for integration tests driven by Capybara or Webrat. They are meant to be used with functional tests only. It is undesirable even to include `Devise::TestHelpers` during integration tests. Instead, fill in the form or explicitly set the user in session;
|
||||
```ruby
|
||||
test 'GET new' do
|
||||
# Mimic the router behavior of setting the Devise scope through the env.
|
||||
@request.env['devise.mapping'] = Devise.mappings[:user]
|
||||
|
||||
2. If you are testing Devise internal controllers or a controller that inherits from Devise's, you need to tell Devise which mapping should be used before a request. This is necessary because Devise gets this information from the router, but since functional tests do not pass through the router, it needs to be stated explicitly. For example, if you are testing the user scope, simply use:
|
||||
# Use the sign_in helper to sign in a fixture `User` record.
|
||||
sign_in users(:alice)
|
||||
|
||||
```ruby
|
||||
@request.env["devise.mapping"] = Devise.mappings[:user]
|
||||
get :new
|
||||
```
|
||||
get :new
|
||||
|
||||
# assert something
|
||||
end
|
||||
```
|
||||
|
||||
### Integration tests
|
||||
|
||||
Integration test helpers are available by including the
|
||||
`Devise::Test::IntegrationHelpers` module.
|
||||
|
||||
```ruby
|
||||
class PostsTests < ActionDispatch::IntegrationTest
|
||||
include Devise::Test::IntegrationHelpers
|
||||
end
|
||||
```
|
||||
|
||||
Now you can use the following `sign_in` and `sign_out` methods in your integration
|
||||
tests:
|
||||
|
||||
```ruby
|
||||
sign_in users(:bob)
|
||||
sign_in users(:bob), scope: :admin
|
||||
|
||||
sign_out :user
|
||||
```
|
||||
|
||||
RSpec users can include the `IntegrationHelpers` module on their `:feature` specs.
|
||||
|
||||
```ruby
|
||||
RSpec.configure do |config|
|
||||
config.include Devise::Test::IntegrationHelpers, type: :feature
|
||||
end
|
||||
```
|
||||
|
||||
Unlike controller tests, integration tests do not need to supply the
|
||||
`devise.mapping` `env` value, as the mapping can be inferred by the routes that
|
||||
are executed in your tests.
|
||||
|
||||
You can read more about testing your Rails 3 - Rails 4 controllers with RSpec in the wiki:
|
||||
|
||||
|
||||
@@ -13,14 +13,14 @@ class Devise::OmniauthCallbacksController < DeviseController
|
||||
protected
|
||||
|
||||
def failed_strategy
|
||||
request.respond_to?(:get_header) ? request.get_header("omniauth.error.strategy") : env["omniauth.error.strategy"]
|
||||
request.respond_to?(:get_header) ? request.get_header("omniauth.error.strategy") : request.env["omniauth.error.strategy"]
|
||||
end
|
||||
|
||||
def failure_message
|
||||
exception = request.respond_to?(:get_header) ? request.get_header("omniauth.error") : env["omniauth.error"]
|
||||
exception = request.respond_to?(:get_header) ? request.get_header("omniauth.error") : request.env["omniauth.error"]
|
||||
error = exception.error_reason if exception.respond_to?(:error_reason)
|
||||
error ||= exception.error if exception.respond_to?(:error)
|
||||
error ||= (request.respond_to?(:get_header) ? request.get_header("omniauth.error.type") : env["omniauth.error.type"]).to_s
|
||||
error ||= (request.respond_to?(:get_header) ? request.get_header("omniauth.error.type") : request.env["omniauth.error.type"]).to_s
|
||||
error.to_s.humanize if error
|
||||
end
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
class Devise::RegistrationsController < DeviseController
|
||||
prepend_before_action :require_no_authentication, only: [:new, :create, :cancel]
|
||||
prepend_before_action :authenticate_scope!, only: [:edit, :update, :destroy]
|
||||
prepend_before_action :set_minimum_password_length, only: [:new, :edit]
|
||||
|
||||
# GET /resource/sign_up
|
||||
def new
|
||||
build_resource({})
|
||||
set_minimum_password_length
|
||||
yield resource if block_given?
|
||||
respond_with self.resource
|
||||
respond_with resource
|
||||
end
|
||||
|
||||
# POST /resource
|
||||
@@ -53,7 +53,7 @@ class Devise::RegistrationsController < DeviseController
|
||||
:update_needs_confirmation : :updated
|
||||
set_flash_message :notice, flash_key
|
||||
end
|
||||
sign_in resource_name, resource, bypass: true
|
||||
bypass_sign_in resource, scope: resource_name
|
||||
respond_with resource, location: after_update_path_for(resource)
|
||||
else
|
||||
clean_up_passwords resource
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
<div class="field">
|
||||
<%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
|
||||
<%= f.password_field :password, autocomplete: "off" %>
|
||||
<% if @minimum_password_length %>
|
||||
<br />
|
||||
<em><%= @minimum_password_length %> characters minimum</em>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
|
||||
@@ -3,15 +3,16 @@ source "https://rubygems.org"
|
||||
gemspec path: ".."
|
||||
|
||||
gem "rails", github: "rails/rails", branch: "4-1-stable"
|
||||
gem "omniauth", "~> 1.3"
|
||||
gem "omniauth-oauth2", "~> 1.4"
|
||||
gem "omniauth"
|
||||
gem "omniauth-oauth2"
|
||||
gem "rdoc"
|
||||
|
||||
group :test do
|
||||
gem "omniauth-facebook"
|
||||
gem "omniauth-openid", "~> 1.0.1"
|
||||
gem "omniauth-openid"
|
||||
gem "webrat", "0.7.3", require: false
|
||||
gem "mocha", "~> 1.1", require: false
|
||||
gem 'test_after_commit', require: false
|
||||
end
|
||||
|
||||
platforms :jruby do
|
||||
@@ -25,5 +26,5 @@ platforms :ruby do
|
||||
end
|
||||
|
||||
group :mongoid do
|
||||
gem "mongoid", "~> 4.0.0"
|
||||
gem "mongoid", "~> 4.0"
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GIT
|
||||
remote: git://github.com/rails/rails.git
|
||||
revision: 41b4d81b4fd14cbf43060c223bea0f461256d099
|
||||
revision: 9f5cbe613c8a80282970c73b0f00095788d54e34
|
||||
branch: 4-1-stable
|
||||
specs:
|
||||
actionmailer (4.1.15)
|
||||
@@ -48,7 +48,7 @@ GIT
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
devise (4.0.0.rc2)
|
||||
devise (4.2.0)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 4.1.0, < 5.1)
|
||||
@@ -62,21 +62,23 @@ GEM
|
||||
bcrypt (3.1.11)
|
||||
bson (3.2.6)
|
||||
builder (3.2.2)
|
||||
concurrent-ruby (1.0.1)
|
||||
concurrent-ruby (1.0.2)
|
||||
connection_pool (2.2.0)
|
||||
erubis (2.7.0)
|
||||
faraday (0.9.2)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
hashie (3.4.3)
|
||||
hashie (3.4.4)
|
||||
i18n (0.7.0)
|
||||
json (1.8.3)
|
||||
jwt (1.5.1)
|
||||
mail (2.6.3)
|
||||
mime-types (>= 1.16, < 3)
|
||||
jwt (1.5.4)
|
||||
mail (2.6.4)
|
||||
mime-types (>= 1.16, < 4)
|
||||
metaclass (0.0.4)
|
||||
mime-types (2.99.1)
|
||||
mini_portile2 (2.0.0)
|
||||
minitest (5.8.4)
|
||||
mime-types (3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0521)
|
||||
mini_portile2 (2.1.0)
|
||||
minitest (5.9.0)
|
||||
mocha (1.1.0)
|
||||
metaclass (~> 0.0.1)
|
||||
mongoid (4.0.2)
|
||||
@@ -88,14 +90,15 @@ GEM
|
||||
bson (~> 3.0)
|
||||
connection_pool (~> 2.0)
|
||||
optionable (~> 0.2.0)
|
||||
multi_json (1.11.2)
|
||||
multi_json (1.12.1)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (2.0.0)
|
||||
nokogiri (1.6.7.2)
|
||||
mini_portile2 (~> 2.0.0.rc2)
|
||||
oauth2 (1.1.0)
|
||||
nokogiri (1.6.8)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
pkg-config (~> 1.1.7)
|
||||
oauth2 (1.2.0)
|
||||
faraday (>= 0.8, < 0.10)
|
||||
jwt (~> 1.0, < 1.5.2)
|
||||
jwt (~> 1.0)
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
@@ -113,19 +116,20 @@ GEM
|
||||
optionable (0.2.0)
|
||||
origin (2.2.0)
|
||||
orm_adapter (0.5.0)
|
||||
pkg-config (1.1.7)
|
||||
rack (1.5.5)
|
||||
rack-openid (1.3.1)
|
||||
rack (>= 1.1.0)
|
||||
ruby-openid (>= 2.1.8)
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rake (11.0.1)
|
||||
rake (11.2.2)
|
||||
rdoc (4.2.2)
|
||||
json (~> 1.4)
|
||||
responders (1.1.2)
|
||||
railties (>= 3.2, < 4.2)
|
||||
ruby-openid (2.7.0)
|
||||
sprockets (3.5.2)
|
||||
sprockets (3.6.2)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (2.3.3)
|
||||
@@ -133,6 +137,8 @@ GEM
|
||||
activesupport (>= 3.0)
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
sqlite3 (1.3.11)
|
||||
test_after_commit (1.1.0)
|
||||
activerecord (>= 3.2)
|
||||
thor (0.19.1)
|
||||
thread_safe (0.3.5)
|
||||
tzinfo (1.2.2)
|
||||
@@ -153,15 +159,16 @@ DEPENDENCIES
|
||||
devise!
|
||||
jruby-openssl
|
||||
mocha (~> 1.1)
|
||||
mongoid (~> 4.0.0)
|
||||
omniauth (~> 1.3)
|
||||
mongoid (~> 4.0)
|
||||
omniauth
|
||||
omniauth-facebook
|
||||
omniauth-oauth2 (~> 1.4)
|
||||
omniauth-openid (~> 1.0.1)
|
||||
omniauth-oauth2
|
||||
omniauth-openid
|
||||
rails!
|
||||
rdoc
|
||||
sqlite3
|
||||
test_after_commit
|
||||
webrat (= 0.7.3)
|
||||
|
||||
BUNDLED WITH
|
||||
1.11.2
|
||||
1.12.5
|
||||
|
||||
@@ -3,15 +3,16 @@ source "https://rubygems.org"
|
||||
gemspec path: ".."
|
||||
|
||||
gem "rails", github: "rails/rails", branch: "4-2-stable"
|
||||
gem "omniauth", "~> 1.3"
|
||||
gem "omniauth-oauth2", "~> 1.4"
|
||||
gem "omniauth"
|
||||
gem "omniauth-oauth2"
|
||||
gem "rdoc"
|
||||
|
||||
group :test do
|
||||
gem "omniauth-facebook"
|
||||
gem "omniauth-openid", "~> 1.0.1"
|
||||
gem "omniauth-openid"
|
||||
gem "webrat", "0.7.3", require: false
|
||||
gem "mocha", "~> 1.1", require: false
|
||||
gem 'test_after_commit', require: false
|
||||
end
|
||||
|
||||
platforms :jruby do
|
||||
@@ -25,5 +26,5 @@ platforms :ruby do
|
||||
end
|
||||
|
||||
group :mongoid do
|
||||
gem "mongoid", "~> 4.0.0"
|
||||
gem "mongoid", "~> 4.0"
|
||||
end
|
||||
|
||||
@@ -1,64 +1,64 @@
|
||||
GIT
|
||||
remote: git://github.com/rails/rails.git
|
||||
revision: 2aa27582c202148296bb169159b0bf9a47a7bd80
|
||||
revision: 5a85938418285ab81e3db52ea102d19f95ed7a94
|
||||
branch: 4-2-stable
|
||||
specs:
|
||||
actionmailer (4.2.6)
|
||||
actionpack (= 4.2.6)
|
||||
actionview (= 4.2.6)
|
||||
activejob (= 4.2.6)
|
||||
actionmailer (4.2.7.rc1)
|
||||
actionpack (= 4.2.7.rc1)
|
||||
actionview (= 4.2.7.rc1)
|
||||
activejob (= 4.2.7.rc1)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
actionpack (4.2.6)
|
||||
actionview (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
actionpack (4.2.7.rc1)
|
||||
actionview (= 4.2.7.rc1)
|
||||
activesupport (= 4.2.7.rc1)
|
||||
rack (~> 1.6)
|
||||
rack-test (~> 0.6.2)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionview (4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
actionview (4.2.7.rc1)
|
||||
activesupport (= 4.2.7.rc1)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
activejob (4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
activejob (4.2.7.rc1)
|
||||
activesupport (= 4.2.7.rc1)
|
||||
globalid (>= 0.3.0)
|
||||
activemodel (4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
activemodel (4.2.7.rc1)
|
||||
activesupport (= 4.2.7.rc1)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.2.6)
|
||||
activemodel (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
activerecord (4.2.7.rc1)
|
||||
activemodel (= 4.2.7.rc1)
|
||||
activesupport (= 4.2.7.rc1)
|
||||
arel (~> 6.0)
|
||||
activesupport (4.2.6)
|
||||
activesupport (4.2.7.rc1)
|
||||
i18n (~> 0.7)
|
||||
json (~> 1.7, >= 1.7.7)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
tzinfo (~> 1.1)
|
||||
rails (4.2.6)
|
||||
actionmailer (= 4.2.6)
|
||||
actionpack (= 4.2.6)
|
||||
actionview (= 4.2.6)
|
||||
activejob (= 4.2.6)
|
||||
activemodel (= 4.2.6)
|
||||
activerecord (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
rails (4.2.7.rc1)
|
||||
actionmailer (= 4.2.7.rc1)
|
||||
actionpack (= 4.2.7.rc1)
|
||||
actionview (= 4.2.7.rc1)
|
||||
activejob (= 4.2.7.rc1)
|
||||
activemodel (= 4.2.7.rc1)
|
||||
activerecord (= 4.2.7.rc1)
|
||||
activesupport (= 4.2.7.rc1)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.2.6)
|
||||
railties (= 4.2.7.rc1)
|
||||
sprockets-rails
|
||||
railties (4.2.6)
|
||||
actionpack (= 4.2.6)
|
||||
activesupport (= 4.2.6)
|
||||
railties (4.2.7.rc1)
|
||||
actionpack (= 4.2.7.rc1)
|
||||
activesupport (= 4.2.7.rc1)
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
devise (4.0.0.rc2)
|
||||
devise (4.2.0)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 4.1.0, < 5.1)
|
||||
@@ -72,25 +72,27 @@ GEM
|
||||
bcrypt (3.1.11)
|
||||
bson (3.2.6)
|
||||
builder (3.2.2)
|
||||
concurrent-ruby (1.0.1)
|
||||
concurrent-ruby (1.0.2)
|
||||
connection_pool (2.2.0)
|
||||
erubis (2.7.0)
|
||||
faraday (0.9.2)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
globalid (0.3.6)
|
||||
activesupport (>= 4.1.0)
|
||||
hashie (3.4.3)
|
||||
hashie (3.4.4)
|
||||
i18n (0.7.0)
|
||||
json (1.8.3)
|
||||
jwt (1.5.1)
|
||||
jwt (1.5.4)
|
||||
loofah (2.0.3)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.6.3)
|
||||
mime-types (>= 1.16, < 3)
|
||||
mail (2.6.4)
|
||||
mime-types (>= 1.16, < 4)
|
||||
metaclass (0.0.4)
|
||||
mime-types (2.99.1)
|
||||
mini_portile2 (2.0.0)
|
||||
minitest (5.8.4)
|
||||
mime-types (3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0521)
|
||||
mini_portile2 (2.1.0)
|
||||
minitest (5.9.0)
|
||||
mocha (1.1.0)
|
||||
metaclass (~> 0.0.1)
|
||||
mongoid (4.0.2)
|
||||
@@ -102,14 +104,15 @@ GEM
|
||||
bson (~> 3.0)
|
||||
connection_pool (~> 2.0)
|
||||
optionable (~> 0.2.0)
|
||||
multi_json (1.11.2)
|
||||
multi_json (1.12.1)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (2.0.0)
|
||||
nokogiri (1.6.7.2)
|
||||
mini_portile2 (~> 2.0.0.rc2)
|
||||
oauth2 (1.1.0)
|
||||
nokogiri (1.6.8)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
pkg-config (~> 1.1.7)
|
||||
oauth2 (1.2.0)
|
||||
faraday (>= 0.8, < 0.10)
|
||||
jwt (~> 1.0, < 1.5.2)
|
||||
jwt (~> 1.0)
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
@@ -127,6 +130,7 @@ GEM
|
||||
optionable (0.2.0)
|
||||
origin (2.2.0)
|
||||
orm_adapter (0.5.0)
|
||||
pkg-config (1.1.7)
|
||||
rack (1.6.4)
|
||||
rack-openid (1.3.1)
|
||||
rack (>= 1.1.0)
|
||||
@@ -141,20 +145,22 @@ GEM
|
||||
rails-deprecated_sanitizer (>= 1.0.1)
|
||||
rails-html-sanitizer (1.0.3)
|
||||
loofah (~> 2.0)
|
||||
rake (11.0.1)
|
||||
rake (11.2.2)
|
||||
rdoc (4.2.2)
|
||||
json (~> 1.4)
|
||||
responders (2.1.1)
|
||||
responders (2.2.0)
|
||||
railties (>= 4.2.0, < 5.1)
|
||||
ruby-openid (2.7.0)
|
||||
sprockets (3.5.2)
|
||||
sprockets (3.6.2)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.0.4)
|
||||
sprockets-rails (3.1.1)
|
||||
actionpack (>= 4.0)
|
||||
activesupport (>= 4.0)
|
||||
sprockets (>= 3.0.0)
|
||||
sqlite3 (1.3.11)
|
||||
test_after_commit (1.1.0)
|
||||
activerecord (>= 3.2)
|
||||
thor (0.19.1)
|
||||
thread_safe (0.3.5)
|
||||
tzinfo (1.2.2)
|
||||
@@ -175,15 +181,16 @@ DEPENDENCIES
|
||||
devise!
|
||||
jruby-openssl
|
||||
mocha (~> 1.1)
|
||||
mongoid (~> 4.0.0)
|
||||
omniauth (~> 1.3)
|
||||
mongoid (~> 4.0)
|
||||
omniauth
|
||||
omniauth-facebook
|
||||
omniauth-oauth2 (~> 1.4)
|
||||
omniauth-openid (~> 1.0.1)
|
||||
omniauth-oauth2
|
||||
omniauth-openid
|
||||
rails!
|
||||
rdoc
|
||||
sqlite3
|
||||
test_after_commit
|
||||
webrat (= 0.7.3)
|
||||
|
||||
BUNDLED WITH
|
||||
1.11.2
|
||||
1.12.5
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gemspec path: ".."
|
||||
|
||||
gem "rails", "5.0.0.beta3"
|
||||
gem "omniauth", " ~>1.3"
|
||||
gem "oauth2"
|
||||
gem "omniauth-oauth2", ">= 1.2.0", "< 1.5.0"
|
||||
gem "rdoc"
|
||||
|
||||
gem "activemodel-serializers-xml", github: "rails/activemodel-serializers-xml"
|
||||
|
||||
gem "rails-controller-testing"
|
||||
|
||||
gem "responders", "~> 2.1.1"
|
||||
|
||||
group :test do
|
||||
gem "omniauth-facebook"
|
||||
gem "omniauth-openid", "~> 1.0.1"
|
||||
gem "webrat", "0.7.3", require: false
|
||||
gem "mocha", "~> 1.1", require: false
|
||||
end
|
||||
|
||||
platforms :jruby do
|
||||
gem "activerecord-jdbc-adapter"
|
||||
gem "activerecord-jdbcsqlite3-adapter"
|
||||
gem "jruby-openssl"
|
||||
end
|
||||
|
||||
platforms :ruby do
|
||||
gem "sqlite3"
|
||||
end
|
||||
|
||||
# TODO:
|
||||
# group :mongoid do
|
||||
# gem "mongoid", "~> 4.0.0"
|
||||
# end
|
||||
@@ -1,199 +0,0 @@
|
||||
GIT
|
||||
remote: git://github.com/rails/activemodel-serializers-xml.git
|
||||
revision: f380ea5ddefcb9a37f4fbc47606ed6fbecdb2b2a
|
||||
specs:
|
||||
activemodel-serializers-xml (1.0.0)
|
||||
activemodel (> 5.x)
|
||||
activerecord (> 5.x)
|
||||
activesupport (> 5.x)
|
||||
builder (~> 3.1)
|
||||
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
devise (4.0.0.rc2)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 4.1.0, < 5.1)
|
||||
responders
|
||||
warden (~> 1.2.3)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actioncable (5.0.0.beta3)
|
||||
actionpack (= 5.0.0.beta3)
|
||||
nio4r (~> 1.2)
|
||||
websocket-driver (~> 0.6.1)
|
||||
actionmailer (5.0.0.beta3)
|
||||
actionpack (= 5.0.0.beta3)
|
||||
actionview (= 5.0.0.beta3)
|
||||
activejob (= 5.0.0.beta3)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
actionpack (5.0.0.beta3)
|
||||
actionview (= 5.0.0.beta3)
|
||||
activesupport (= 5.0.0.beta3)
|
||||
rack (~> 2.x)
|
||||
rack-test (~> 0.6.3)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionview (5.0.0.beta3)
|
||||
activesupport (= 5.0.0.beta3)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
activejob (5.0.0.beta3)
|
||||
activesupport (= 5.0.0.beta3)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (5.0.0.beta3)
|
||||
activesupport (= 5.0.0.beta3)
|
||||
activerecord (5.0.0.beta3)
|
||||
activemodel (= 5.0.0.beta3)
|
||||
activesupport (= 5.0.0.beta3)
|
||||
arel (~> 7.0)
|
||||
activesupport (5.0.0.beta3)
|
||||
concurrent-ruby (~> 1.0)
|
||||
i18n (~> 0.7)
|
||||
minitest (~> 5.1)
|
||||
tzinfo (~> 1.1)
|
||||
arel (7.0.0)
|
||||
bcrypt (3.1.11)
|
||||
builder (3.2.2)
|
||||
concurrent-ruby (1.0.1)
|
||||
erubis (2.7.0)
|
||||
faraday (0.9.2)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
globalid (0.3.6)
|
||||
activesupport (>= 4.1.0)
|
||||
hashie (3.4.3)
|
||||
i18n (0.7.0)
|
||||
json (1.8.3)
|
||||
jwt (1.5.1)
|
||||
loofah (2.0.3)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.6.4)
|
||||
mime-types (>= 1.16, < 4)
|
||||
metaclass (0.0.4)
|
||||
method_source (0.8.2)
|
||||
mime-types (3.0)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0221)
|
||||
mini_portile2 (2.0.0)
|
||||
minitest (5.8.4)
|
||||
mocha (1.1.0)
|
||||
metaclass (~> 0.0.1)
|
||||
multi_json (1.11.2)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (2.0.0)
|
||||
nio4r (1.2.1)
|
||||
nokogiri (1.6.7.2)
|
||||
mini_portile2 (~> 2.0.0.rc2)
|
||||
oauth2 (1.1.0)
|
||||
faraday (>= 0.8, < 0.10)
|
||||
jwt (~> 1.0, < 1.5.2)
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
omniauth (1.3.1)
|
||||
hashie (>= 1.2, < 4)
|
||||
rack (>= 1.0, < 3)
|
||||
omniauth-facebook (3.0.0)
|
||||
omniauth-oauth2 (~> 1.2)
|
||||
omniauth-oauth2 (1.4.0)
|
||||
oauth2 (~> 1.0)
|
||||
omniauth (~> 1.2)
|
||||
omniauth-openid (1.0.1)
|
||||
omniauth (~> 1.0)
|
||||
rack-openid (~> 1.3.1)
|
||||
orm_adapter (0.5.0)
|
||||
rack (2.0.0.alpha)
|
||||
json
|
||||
rack-openid (1.3.1)
|
||||
rack (>= 1.1.0)
|
||||
ruby-openid (>= 2.1.8)
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (5.0.0.beta3)
|
||||
actioncable (= 5.0.0.beta3)
|
||||
actionmailer (= 5.0.0.beta3)
|
||||
actionpack (= 5.0.0.beta3)
|
||||
actionview (= 5.0.0.beta3)
|
||||
activejob (= 5.0.0.beta3)
|
||||
activemodel (= 5.0.0.beta3)
|
||||
activerecord (= 5.0.0.beta3)
|
||||
activesupport (= 5.0.0.beta3)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 5.0.0.beta3)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-controller-testing (0.1.1)
|
||||
actionpack (~> 5.x)
|
||||
actionview (~> 5.x)
|
||||
activesupport (~> 5.x)
|
||||
rails-deprecated_sanitizer (1.0.3)
|
||||
activesupport (>= 4.2.0.alpha)
|
||||
rails-dom-testing (1.0.7)
|
||||
activesupport (>= 4.2.0.beta, < 5.0)
|
||||
nokogiri (~> 1.6.0)
|
||||
rails-deprecated_sanitizer (>= 1.0.1)
|
||||
rails-html-sanitizer (1.0.3)
|
||||
loofah (~> 2.0)
|
||||
railties (5.0.0.beta3)
|
||||
actionpack (= 5.0.0.beta3)
|
||||
activesupport (= 5.0.0.beta3)
|
||||
method_source
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
rake (11.1.2)
|
||||
rdoc (4.2.2)
|
||||
json (~> 1.4)
|
||||
responders (2.1.2)
|
||||
railties (>= 4.2.0, < 5.1)
|
||||
ruby-openid (2.7.0)
|
||||
sprockets (3.6.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.0.4)
|
||||
actionpack (>= 4.0)
|
||||
activesupport (>= 4.0)
|
||||
sprockets (>= 3.0.0)
|
||||
sqlite3 (1.3.11)
|
||||
thor (0.19.1)
|
||||
thread_safe (0.3.5)
|
||||
tzinfo (1.2.2)
|
||||
thread_safe (~> 0.1)
|
||||
warden (1.2.6)
|
||||
rack (>= 1.0)
|
||||
webrat (0.7.3)
|
||||
nokogiri (>= 1.2.0)
|
||||
rack (>= 1.0)
|
||||
rack-test (>= 0.5.3)
|
||||
websocket-driver (0.6.3)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.2)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
activemodel-serializers-xml!
|
||||
activerecord-jdbc-adapter
|
||||
activerecord-jdbcsqlite3-adapter
|
||||
devise!
|
||||
jruby-openssl
|
||||
mocha (~> 1.1)
|
||||
oauth2
|
||||
omniauth (~> 1.3)
|
||||
omniauth-facebook
|
||||
omniauth-oauth2 (>= 1.2.0, < 1.5.0)
|
||||
omniauth-openid (~> 1.0.1)
|
||||
rails (= 5.0.0.beta3)
|
||||
rails-controller-testing
|
||||
rdoc
|
||||
responders (~> 2.1.1)
|
||||
sqlite3
|
||||
webrat (= 0.7.3)
|
||||
|
||||
BUNDLED WITH
|
||||
1.11.2
|
||||
104
guides/bug_report_templates/integration_test.rb
Normal file
104
guides/bug_report_templates/integration_test.rb
Normal file
@@ -0,0 +1,104 @@
|
||||
begin
|
||||
require 'bundler/inline'
|
||||
rescue LoadError => e
|
||||
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
|
||||
raise e
|
||||
end
|
||||
|
||||
gemfile(true) do
|
||||
source 'https://rubygems.org'
|
||||
# Activate the gem you are reporting the issue against.
|
||||
gem 'rails', '~> 4.2.0'
|
||||
gem 'devise', '~> 4.0'
|
||||
gem 'sqlite3'
|
||||
gem 'byebug'
|
||||
end
|
||||
|
||||
require 'rack/test'
|
||||
require 'action_controller/railtie'
|
||||
require 'active_record'
|
||||
require 'devise/rails/routes'
|
||||
require 'devise/rails/warden_compat'
|
||||
|
||||
ActiveRecord::Base.establish_connection( adapter: :sqlite3, database: ':memory:')
|
||||
|
||||
class DeviseCreateUsers < ActiveRecord::Migration
|
||||
def change
|
||||
create_table(:users) do |t|
|
||||
t.string :email, null: false
|
||||
t.string :encrypted_password, null: true
|
||||
t.timestamps null: false
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
Devise.setup do |config|
|
||||
require 'devise/orm/active_record'
|
||||
config.secret_key = 'secret_key_base'
|
||||
end
|
||||
|
||||
class TestApp < Rails::Application
|
||||
config.root = File.dirname(__FILE__)
|
||||
config.session_store :cookie_store, key: 'cookie_store_key'
|
||||
secrets.secret_token = 'secret_token'
|
||||
secrets.secret_key_base = 'secret_key_base'
|
||||
config.eager_load = false
|
||||
|
||||
config.middleware.use Warden::Manager do |config|
|
||||
Devise.warden_config = config
|
||||
end
|
||||
|
||||
config.logger = Logger.new($stdout)
|
||||
Rails.logger = config.logger
|
||||
|
||||
end
|
||||
|
||||
Rails.application.initialize!
|
||||
|
||||
DeviseCreateUsers.migrate(:up)
|
||||
|
||||
class User < ActiveRecord::Base
|
||||
devise :database_authenticatable
|
||||
end
|
||||
|
||||
Rails.application.routes.draw do
|
||||
devise_for :users
|
||||
|
||||
get '/' => 'test#index'
|
||||
end
|
||||
|
||||
class ApplicationController < ActionController::Base
|
||||
end
|
||||
|
||||
class TestController < ApplicationController
|
||||
include Rails.application.routes.url_helpers
|
||||
|
||||
before_filter :authenticate_user!
|
||||
|
||||
def index
|
||||
render plain: 'Home'
|
||||
end
|
||||
end
|
||||
|
||||
require 'minitest/autorun'
|
||||
|
||||
class BugTest < ActionDispatch::IntegrationTest
|
||||
include Rack::Test::Methods
|
||||
include Warden::Test::Helpers
|
||||
|
||||
def test_returns_success
|
||||
Warden.test_mode!
|
||||
|
||||
login_as User.create!(email: 'test@test.com', password: 'test123456', password_confirmation: 'test123456')
|
||||
|
||||
get '/'
|
||||
assert last_response.ok?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def app
|
||||
Rails.application
|
||||
end
|
||||
end
|
||||
154
lib/devise.rb
Normal file → Executable file
154
lib/devise.rb
Normal file → Executable file
@@ -39,13 +39,18 @@ module Devise
|
||||
autoload :Authenticatable, 'devise/strategies/authenticatable'
|
||||
end
|
||||
|
||||
module Test
|
||||
autoload :ControllerHelpers, 'devise/test/controller_helpers'
|
||||
autoload :IntegrationHelpers, 'devise/test/integration_helpers'
|
||||
end
|
||||
|
||||
# Constants which holds devise configuration for extensions. Those should
|
||||
# not be modified by the "end user" (this is why they are constants).
|
||||
ALL = []
|
||||
CONTROLLERS = ActiveSupport::OrderedHash.new
|
||||
ROUTES = ActiveSupport::OrderedHash.new
|
||||
STRATEGIES = ActiveSupport::OrderedHash.new
|
||||
URL_HELPERS = ActiveSupport::OrderedHash.new
|
||||
CONTROLLERS = {}
|
||||
ROUTES = {}
|
||||
STRATEGIES = {}
|
||||
URL_HELPERS = {}
|
||||
|
||||
# Strategies that do not require user input.
|
||||
NO_INPUT = []
|
||||
@@ -53,12 +58,6 @@ module Devise
|
||||
# True values used to check params
|
||||
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE']
|
||||
|
||||
# Track the configs that user explicit changed the default value. It is
|
||||
# helpfull to not warn users about default values changing when they willing
|
||||
# changed.
|
||||
mattr_accessor :app_set_configs
|
||||
@@app_set_configs = Set.new
|
||||
|
||||
# Secret key used by the key generator
|
||||
mattr_accessor :secret_key
|
||||
@@secret_key = nil
|
||||
@@ -88,19 +87,8 @@ module Devise
|
||||
@@case_insensitive_keys = [:email]
|
||||
|
||||
# Keys that should have whitespace stripped.
|
||||
# TODO: 4.1 Do: @@strip_whitespace_keys = [:email]
|
||||
mattr_reader :strip_whitespace_keys
|
||||
@@strip_whitespace_keys = []
|
||||
|
||||
def self.strip_whitespace_keys=(strip_whitespace_keys)
|
||||
app_set_configs << :strip_whitespace_keys
|
||||
@@strip_whitespace_keys = strip_whitespace_keys
|
||||
end
|
||||
|
||||
def strip_whitespace_keys=(strip_whitespace_keys)
|
||||
app_set_configs << :strip_whitespace_keys
|
||||
@@strip_whitespace_keys = strip_whitespace_keys
|
||||
end
|
||||
mattr_accessor :strip_whitespace_keys
|
||||
@@strip_whitespace_keys = [:email]
|
||||
|
||||
# If http authentication is enabled by default.
|
||||
mattr_accessor :http_authenticatable
|
||||
@@ -118,22 +106,11 @@ module Devise
|
||||
mattr_accessor :http_authentication_realm
|
||||
@@http_authentication_realm = "Application"
|
||||
|
||||
# Email regex used to validate email formats. It simply asserts that
|
||||
# an one (and only one) @ exists in the given string. This is mainly
|
||||
# to give user feedback and not to assert the e-mail validity.
|
||||
# TODO: 4.1 Do: @@email_regexp = [/\A[^@\s]+@[^@\s]+\z/]
|
||||
mattr_reader :email_regexp
|
||||
@@email_regexp = /\A[^@\s]+@([^@\s]+\.)+[^@\W]+\z/
|
||||
|
||||
def self.email_regexp=(email_regexp)
|
||||
app_set_configs << :email_regexp
|
||||
@@email_regexp = email_regexp
|
||||
end
|
||||
|
||||
def email_regexp=(email_regexp)
|
||||
app_set_configs << :email_regexp
|
||||
@@email_regexp = email_regexp
|
||||
end
|
||||
# Email regex used to validate email formats. It asserts that there are no
|
||||
# @ symbols or whitespaces in either the localpart or the domain, and that
|
||||
# there is a single @ symbol separating the localpart and the domain.
|
||||
mattr_accessor :email_regexp
|
||||
@@email_regexp = /\A[^@\s]+@[^@\s]+\z/
|
||||
|
||||
# Range validation for password length
|
||||
mattr_accessor :password_length
|
||||
@@ -165,20 +142,8 @@ module Devise
|
||||
@@confirmation_keys = [:email]
|
||||
|
||||
# Defines if email should be reconfirmable.
|
||||
# False by default for backwards compatibility.
|
||||
# TODO: 4.1 Do: @@reconfirmable = true
|
||||
mattr_reader :reconfirmable
|
||||
@@reconfirmable = false
|
||||
|
||||
def self.reconfirmable=(reconfirmable)
|
||||
app_set_configs << :reconfirmable
|
||||
@@reconfirmable = reconfirmable
|
||||
end
|
||||
|
||||
def reconfirmable=(reconfirmable)
|
||||
app_set_configs << :reconfirmable
|
||||
@@reconfirmable = reconfirmable
|
||||
end
|
||||
mattr_accessor :reconfirmable
|
||||
@@reconfirmable = true
|
||||
|
||||
# Time interval to timeout the user session without activity.
|
||||
mattr_accessor :timeout_in
|
||||
@@ -240,19 +205,8 @@ module Devise
|
||||
@@mailer_sender = nil
|
||||
|
||||
# Skip session storage for the following strategies
|
||||
# TODO: 4.1 Do: @@skip_session_storage = [:http_auth]
|
||||
mattr_reader :skip_session_storage
|
||||
@@skip_session_storage = []
|
||||
|
||||
def self.skip_session_storage=(skip_session_storage)
|
||||
app_set_configs << :skip_session_storage
|
||||
@@skip_session_storage = skip_session_storage
|
||||
end
|
||||
|
||||
def skip_session_storage=(skip_session_storage)
|
||||
app_set_configs << :skip_session_storage
|
||||
@@skip_session_storage = skip_session_storage
|
||||
end
|
||||
mattr_accessor :skip_session_storage
|
||||
@@skip_session_storage = [:http_auth]
|
||||
|
||||
# Which formats should be treated as navigational.
|
||||
mattr_accessor :navigational_formats
|
||||
@@ -263,19 +217,8 @@ module Devise
|
||||
@@sign_out_all_scopes = true
|
||||
|
||||
# The default method used while signing out
|
||||
# TODO: 4.1 Do: @@sign_out_via = :delete
|
||||
mattr_reader :sign_out_via
|
||||
@@sign_out_via = :get
|
||||
|
||||
def self.sign_out_via=(sign_out_via)
|
||||
app_set_configs << :sign_out_via
|
||||
@@sign_out_via = sign_out_via
|
||||
end
|
||||
|
||||
def sign_out_via=(sign_out_via)
|
||||
app_set_configs << :sign_out_via
|
||||
@@sign_out_via = sign_out_via
|
||||
end
|
||||
mattr_accessor :sign_out_via
|
||||
@@sign_out_via = :delete
|
||||
|
||||
# The parent controller all Devise controllers inherits from.
|
||||
# Defaults to ApplicationController. This should be set early
|
||||
@@ -304,15 +247,22 @@ module Devise
|
||||
mattr_accessor :clean_up_csrf_token_on_authentication
|
||||
@@clean_up_csrf_token_on_authentication = true
|
||||
|
||||
# When false, Devise will not attempt to reload routes on eager load.
|
||||
# This can reduce the time taken to boot the app but if your application
|
||||
# requires the Devise mappings to be loaded during boot time the application
|
||||
# won't boot properly.
|
||||
mattr_accessor :reload_routes
|
||||
@@reload_routes = true
|
||||
|
||||
# PRIVATE CONFIGURATION
|
||||
|
||||
# Store scopes mappings.
|
||||
mattr_reader :mappings
|
||||
@@mappings = ActiveSupport::OrderedHash.new
|
||||
@@mappings = {}
|
||||
|
||||
# OmniAuth configurations.
|
||||
mattr_reader :omniauth_configs
|
||||
@@omniauth_configs = ActiveSupport::OrderedHash.new
|
||||
@@omniauth_configs = {}
|
||||
|
||||
# Define a set of modules that are called when a mapping is added.
|
||||
mattr_reader :helpers
|
||||
@@ -340,36 +290,10 @@ module Devise
|
||||
# a fresh initializer with all configuration values.
|
||||
def self.setup
|
||||
yield self
|
||||
|
||||
warn_default_config_changed(:email_regexp, '/\A[^@\s]+@([^@\s]+\.)+[^@\W]+\z/', '/\A[^@\s]+@[^@\s]+\z/')
|
||||
warn_default_config_changed(:reconfirmable, 'false', 'true')
|
||||
warn_default_config_changed(:sign_out_via, ':get', ':delete')
|
||||
warn_default_config_changed(:skip_session_storage, '[]', '[:http_auth]')
|
||||
warn_default_config_changed(:strip_whitespace_keys, '[]', '[:email]')
|
||||
end
|
||||
|
||||
def self.warn_default_config_changed(config, current_default, new_default)
|
||||
unless app_set_configs.include?(config)
|
||||
warn = <<-MESSAGE.strip_heredoc
|
||||
[Devise] config.#{config} will have a new default on Devise 4.1
|
||||
To keep the current behavior please set in your config/initializers/devise.rb the following:
|
||||
|
||||
Devise.setup do |config|
|
||||
config.#{config} = #{current_default}
|
||||
end
|
||||
|
||||
If you want to use the new default:
|
||||
|
||||
Devise.setup do |config|
|
||||
config.#{config} = #{new_default}
|
||||
end
|
||||
MESSAGE
|
||||
ActiveSupport::Deprecation.warn(warn)
|
||||
end
|
||||
end
|
||||
|
||||
class Getter
|
||||
def initialize name
|
||||
def initialize(name)
|
||||
@name = name
|
||||
end
|
||||
|
||||
@@ -379,12 +303,8 @@ module Devise
|
||||
end
|
||||
|
||||
def self.ref(arg)
|
||||
if defined?(ActiveSupport::Dependencies::ClassCache)
|
||||
ActiveSupport::Dependencies::reference(arg)
|
||||
Getter.new(arg)
|
||||
else
|
||||
ActiveSupport::Dependencies.ref(arg)
|
||||
end
|
||||
ActiveSupport::Dependencies.reference(arg)
|
||||
Getter.new(arg)
|
||||
end
|
||||
|
||||
def self.available_router_name
|
||||
@@ -505,7 +425,6 @@ module Devise
|
||||
# config.omniauth :github, APP_ID, APP_SECRET
|
||||
#
|
||||
def self.omniauth(provider, *args)
|
||||
@@helpers << Devise::OmniAuth::UrlHelpers
|
||||
config = Devise::OmniAuth::Config.new(provider, args)
|
||||
@@omniauth_configs[config.strategy_name.to_sym] = config
|
||||
end
|
||||
@@ -543,10 +462,7 @@ module Devise
|
||||
mapping.to.serialize_into_session(record)
|
||||
end
|
||||
|
||||
warden_config.serialize_from_session(mapping.name) do |key|
|
||||
# Previous versions contained an additional entry at the beginning of
|
||||
# key with the record's class name.
|
||||
args = key[-2, 2]
|
||||
warden_config.serialize_from_session(mapping.name) do |args|
|
||||
mapping.to.serialize_from_session(*args)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -138,7 +138,7 @@ module Devise
|
||||
|
||||
# The main accessor for the warden proxy instance
|
||||
def warden
|
||||
request.env['warden']
|
||||
request.env['warden'] or raise MissingWarden
|
||||
end
|
||||
|
||||
# Return true if it's a devise_controller. false to all controllers unless
|
||||
@@ -277,4 +277,15 @@ module Devise
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class MissingWarden < StandardError
|
||||
def initialize
|
||||
super "Devise could not find the `Warden::Proxy` instance on your request environment.\n" + \
|
||||
"Make sure that your application is loading Devise and Warden as expected and that " + \
|
||||
"the `Warden::Manager` middleware is present in your middleware stack.\n" + \
|
||||
"If you are seeing this on one of your tests, ensure that your tests are either " + \
|
||||
"executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` " + \
|
||||
"module to inject the `request.env['warden']` object for you."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -18,7 +18,7 @@ module Devise
|
||||
|
||||
# Remembers the given resource by setting up a cookie
|
||||
def remember_me(resource)
|
||||
return if env["devise.skip_storage"]
|
||||
return if request.env["devise.skip_storage"]
|
||||
scope = Devise::Mapping.find_scope!(resource)
|
||||
resource.remember_me!
|
||||
cookies.signed[remember_key(resource, scope)] = remember_cookie_values(resource)
|
||||
|
||||
@@ -12,20 +12,15 @@ module Devise
|
||||
end
|
||||
|
||||
# Sign in a user that already was authenticated. This helper is useful for logging
|
||||
# users in after sign up.
|
||||
#
|
||||
# All options given to sign_in is passed forward to the set_user method in warden.
|
||||
# The only exception is the :bypass option, which bypass warden callbacks and stores
|
||||
# the user straight in session. This option is useful in cases the user is already
|
||||
# signed in, but we want to refresh the credentials in session.
|
||||
# users in after sign up. All options given to sign_in is passed forward
|
||||
# to the set_user method in warden.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# sign_in :user, @user # sign_in(scope, resource)
|
||||
# sign_in @user # sign_in(resource)
|
||||
# sign_in @user, event: :authentication # sign_in(resource, options)
|
||||
# sign_in @user, store: false # sign_in(resource, options)
|
||||
# sign_in @user, bypass: true # sign_in(resource, options)
|
||||
# sign_in @user, event: :authentication # sign_in(resource, options)
|
||||
# sign_in @user, store: false # sign_in(resource, options)
|
||||
#
|
||||
def sign_in(resource_or_scope, *args)
|
||||
options = args.extract_options!
|
||||
@@ -35,6 +30,13 @@ module Devise
|
||||
expire_data_after_sign_in!
|
||||
|
||||
if options[:bypass]
|
||||
ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc, caller)
|
||||
[Devise] bypass option is deprecated and it will be removed in future version of Devise.
|
||||
Please use bypass_sign_in method instead.
|
||||
Example:
|
||||
|
||||
bypass_sign_in(user)
|
||||
DEPRECATION
|
||||
warden.session_serializer.store(resource, scope)
|
||||
elsif warden.user(scope) == resource && !options.delete(:force)
|
||||
# Do nothing. User already signed in and we are not forcing it.
|
||||
@@ -44,6 +46,20 @@ module Devise
|
||||
end
|
||||
end
|
||||
|
||||
# Sign in a user bypassing the warden callbacks and stores the user
|
||||
# straight in session. This option is useful in cases the user is already
|
||||
# signed in, but we want to refresh the credentials in session.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# bypass_sign_in @user, scope: :user
|
||||
# bypass_sign_in @user
|
||||
def bypass_sign_in(resource, scope: nil)
|
||||
scope ||= Devise::Mapping.find_scope!(resource)
|
||||
expire_data_after_sign_in!
|
||||
warden.session_serializer.store(resource, scope)
|
||||
end
|
||||
|
||||
# Sign out a given user or scope. This helper is useful for signing out a user
|
||||
# after deleting accounts. Returns true if there was a logout and false if there
|
||||
# is no user logged in on the referred scope
|
||||
@@ -58,7 +74,6 @@ module Devise
|
||||
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
||||
user = warden.user(scope: scope, run_callbacks: false) # If there is no user
|
||||
|
||||
warden.raw_session.inspect # Without this inspect here. The session does not clear.
|
||||
warden.logout(scope)
|
||||
warden.clear_strategies_cache!(scope: scope)
|
||||
instance_variable_set(:"@current_#{scope}", nil)
|
||||
|
||||
@@ -50,13 +50,11 @@ module Devise
|
||||
end
|
||||
|
||||
def recall
|
||||
config = Rails.application.config
|
||||
|
||||
header_info = if config.try(:relative_url_root)
|
||||
base_path = Pathname.new(config.relative_url_root)
|
||||
header_info = if relative_url_root?
|
||||
base_path = Pathname.new(relative_url_root)
|
||||
full_path = Pathname.new(attempted_path)
|
||||
|
||||
{ "SCRIPT_NAME" => config.relative_url_root,
|
||||
{ "SCRIPT_NAME" => relative_url_root,
|
||||
"PATH_INFO" => '/' + full_path.relative_path_from(base_path).to_s }
|
||||
else
|
||||
{ "PATH_INFO" => attempted_path }
|
||||
@@ -66,7 +64,7 @@ module Devise
|
||||
if request.respond_to?(:set_header)
|
||||
request.set_header(var, value)
|
||||
else
|
||||
env[var] = value
|
||||
request.env[var] = value
|
||||
end
|
||||
end
|
||||
|
||||
@@ -103,7 +101,7 @@ module Devise
|
||||
options[:scope] = "devise.failure"
|
||||
options[:default] = [message]
|
||||
auth_keys = scope_class.authentication_keys
|
||||
keys = auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys
|
||||
keys = (auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys).map { |key| scope_class.human_attribute_name(key) }
|
||||
options[:authentication_keys] = keys.join(I18n.translate(:"support.array.words_connector"))
|
||||
options = i18n_options(options)
|
||||
|
||||
@@ -135,18 +133,16 @@ module Devise
|
||||
|
||||
def scope_url
|
||||
opts = {}
|
||||
|
||||
# Initialize script_name with nil to prevent infinite loops in
|
||||
# authenticated mounted engines in rails 4.2 and 5.0
|
||||
opts[:script_name] = nil
|
||||
|
||||
route = route(scope)
|
||||
|
||||
opts[:format] = request_format unless skip_format?
|
||||
|
||||
config = Rails.application.config
|
||||
|
||||
if config.respond_to?(:relative_url_root)
|
||||
# Rails 4.2 goes into an infinite loop if opts[:script_name] is unset
|
||||
rails_4_2 = (Rails::VERSION::MAJOR >= 4) && (Rails::VERSION::MINOR >= 2)
|
||||
if config.relative_url_root.present? || rails_4_2
|
||||
opts[:script_name] = config.relative_url_root
|
||||
end
|
||||
end
|
||||
opts[:script_name] = relative_url_root if relative_url_root?
|
||||
|
||||
router_name = Devise.mappings[scope].router_name || Devise.available_router_name
|
||||
context = send(router_name)
|
||||
@@ -206,11 +202,11 @@ module Devise
|
||||
end
|
||||
|
||||
def warden
|
||||
request.respond_to?(:get_header) ? request.get_header("warden") : env["warden"]
|
||||
request.respond_to?(:get_header) ? request.get_header("warden") : request.env["warden"]
|
||||
end
|
||||
|
||||
def warden_options
|
||||
request.respond_to?(:get_header) ? request.get_header("warden.options") : env["warden.options"]
|
||||
request.respond_to?(:get_header) ? request.get_header("warden.options") : request.env["warden.options"]
|
||||
end
|
||||
|
||||
def warden_message
|
||||
@@ -250,5 +246,17 @@ module Devise
|
||||
def request_format
|
||||
@request_format ||= request.format.try(:ref)
|
||||
end
|
||||
|
||||
def relative_url_root
|
||||
@relative_url_root ||= begin
|
||||
config = Rails.application.config
|
||||
|
||||
config.try(:relative_url_root) || config.action_controller.try(:relative_url_root)
|
||||
end
|
||||
end
|
||||
|
||||
def relative_url_root?
|
||||
relative_url_root.present?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,7 +7,7 @@ module Devise
|
||||
include Devise::Controllers::SignInOut
|
||||
|
||||
attr_reader :warden
|
||||
delegate :cookies, :env, to: :warden
|
||||
delegate :cookies, :request, to: :warden
|
||||
|
||||
def initialize(warden)
|
||||
@warden = warden
|
||||
|
||||
@@ -114,6 +114,15 @@ module Devise
|
||||
super(options)
|
||||
end
|
||||
|
||||
# Redefine inspect using serializable_hash, to ensure we don't accidentally
|
||||
# leak passwords into exceptions.
|
||||
def inspect
|
||||
inspection = serializable_hash.collect do |k,v|
|
||||
"#{k}: #{respond_to?(:attribute_for_inspect) ? attribute_for_inspect(k) : v.inspect}"
|
||||
end
|
||||
"#<#{self.class} #{inspection.join(", ")}>"
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def devise_mailer
|
||||
@@ -143,13 +152,25 @@ module Devise
|
||||
# if new_record? || changed?
|
||||
# pending_notifications << [notification, args]
|
||||
# else
|
||||
# devise_mailer.send(notification, self, *args).deliver
|
||||
# message = devise_mailer.send(notification, self, *args)
|
||||
# Remove once we move to Rails 4.2+ only.
|
||||
# if message.respond_to?(:deliver_now)
|
||||
# message.deliver_now
|
||||
# else
|
||||
# message.deliver
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# def send_pending_notifications
|
||||
# pending_notifications.each do |notification, args|
|
||||
# devise_mailer.send(notification, self, *args).deliver
|
||||
# message = devise_mailer.send(notification, self, *args)
|
||||
# Remove once we move to Rails 4.2+ only.
|
||||
# if message.respond_to?(:deliver_now)
|
||||
# message.deliver_now
|
||||
# else
|
||||
# message.deliver
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# # Empty the pending notifications array because the
|
||||
@@ -253,7 +274,7 @@ module Devise
|
||||
|
||||
# Find or initialize a record with group of attributes based on a list of required attributes.
|
||||
def find_or_initialize_with_errors(required_attributes, attributes, error=:invalid) #:nodoc:
|
||||
attributes = if attributes.respond_to? :permit
|
||||
attributes = if attributes.respond_to? :permit!
|
||||
attributes.slice(*required_attributes).permit!.to_h.with_indifferent_access
|
||||
else
|
||||
attributes.with_indifferent_access.slice(*required_attributes)
|
||||
|
||||
@@ -43,13 +43,20 @@ module Devise
|
||||
|
||||
included do
|
||||
before_create :generate_confirmation_token, if: :confirmation_required?
|
||||
after_create :send_on_create_confirmation_instructions, if: :send_confirmation_notification?
|
||||
after_create :skip_reconfirmation_in_callback!, if: :send_confirmation_notification?
|
||||
if respond_to?(:after_commit) # ActiveRecord
|
||||
after_commit :send_on_create_confirmation_instructions, on: :create, if: :send_confirmation_notification?
|
||||
after_commit :send_reconfirmation_instructions, on: :update, if: :reconfirmation_required?
|
||||
else # Mongoid
|
||||
after_create :send_on_create_confirmation_instructions, if: :send_confirmation_notification?
|
||||
after_update :send_reconfirmation_instructions, if: :reconfirmation_required?
|
||||
end
|
||||
before_update :postpone_email_change_until_confirmation_and_regenerate_confirmation_token, if: :postpone_email_change?
|
||||
after_update :send_reconfirmation_instructions, if: :reconfirmation_required?
|
||||
end
|
||||
|
||||
def initialize(*args, &block)
|
||||
@bypass_confirmation_postpone = false
|
||||
@skip_reconfirmation_in_callback = false
|
||||
@reconfirmation_required = false
|
||||
@skip_confirmation_notification = false
|
||||
@raw_confirmation_token = nil
|
||||
@@ -91,11 +98,6 @@ module Devise
|
||||
end
|
||||
end
|
||||
|
||||
def confirm!(args={})
|
||||
ActiveSupport::Deprecation.warn "confirm! is deprecated in favor of confirm"
|
||||
confirm(args)
|
||||
end
|
||||
|
||||
# Verifies whether a user is confirmed or not
|
||||
def confirmed?
|
||||
!!confirmed_at
|
||||
@@ -164,6 +166,12 @@ module Devise
|
||||
|
||||
protected
|
||||
|
||||
# To not require reconfirmation after creating with #save called in a
|
||||
# callback call skip_create_confirmation!
|
||||
def skip_reconfirmation_in_callback!
|
||||
@skip_reconfirmation_in_callback = true
|
||||
end
|
||||
|
||||
# A callback method used to deliver confirmation
|
||||
# instructions on creation. This can be overridden
|
||||
# in models to map to a nice sign up e-mail.
|
||||
@@ -234,8 +242,7 @@ module Devise
|
||||
if self.confirmation_token && !confirmation_period_expired?
|
||||
@raw_confirmation_token = self.confirmation_token
|
||||
else
|
||||
raw, _ = Devise.token_generator.generate(self.class, :confirmation_token)
|
||||
self.confirmation_token = @raw_confirmation_token = raw
|
||||
self.confirmation_token = @raw_confirmation_token = Devise.friendly_token
|
||||
self.confirmation_sent_at = Time.now.utc
|
||||
end
|
||||
end
|
||||
@@ -253,13 +260,17 @@ module Devise
|
||||
end
|
||||
|
||||
def postpone_email_change?
|
||||
postpone = self.class.reconfirmable && email_changed? && email_was.present? && !@bypass_confirmation_postpone && self.email.present?
|
||||
postpone = self.class.reconfirmable &&
|
||||
email_changed? &&
|
||||
!@bypass_confirmation_postpone &&
|
||||
self.email.present? &&
|
||||
(!@skip_reconfirmation_in_callback || !self.email_was.nil?)
|
||||
@bypass_confirmation_postpone = false
|
||||
postpone
|
||||
end
|
||||
|
||||
def reconfirmation_required?
|
||||
self.class.reconfirmable && @reconfirmation_required && self.email.present?
|
||||
self.class.reconfirmable && @reconfirmation_required && (self.email.present? || self.unconfirmed_email.present?)
|
||||
end
|
||||
|
||||
def send_confirmation_notification?
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
require 'devise/strategies/database_authenticatable'
|
||||
|
||||
module Devise
|
||||
def self.bcrypt(klass, password)
|
||||
ActiveSupport::Deprecation.warn "Devise.bcrypt is deprecated; use Devise::Encryptor.digest instead"
|
||||
Devise::Encryptor.digest(klass, password)
|
||||
end
|
||||
|
||||
module Models
|
||||
# Authenticatable Module, responsible for hashing the password and
|
||||
# validating the authenticity of a user while signing in.
|
||||
@@ -41,7 +36,6 @@ module Devise
|
||||
# For legacy reasons, we use `encrypted_password` to store
|
||||
# the hashed password.
|
||||
def password=(new_password)
|
||||
attribute_will_change! 'password'
|
||||
@password = new_password
|
||||
self.encrypted_password = password_digest(@password) if @password.present?
|
||||
end
|
||||
|
||||
@@ -64,7 +64,7 @@ module Devise
|
||||
def send_unlock_instructions
|
||||
raw, enc = Devise.token_generator.generate(self.class, :unlock_token)
|
||||
self.unlock_token = enc
|
||||
self.save(validate: false)
|
||||
save(validate: false)
|
||||
send_devise_notification(:unlock_instructions, raw, {})
|
||||
raw
|
||||
end
|
||||
@@ -155,6 +155,9 @@ module Devise
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
# List of strategies that are enabled/supported if :both is used.
|
||||
BOTH_STRATEGIES = [:time, :email]
|
||||
|
||||
# Attempt to find a user by its unlock keys. If a record is found, send new
|
||||
# unlock instructions to it. If not user is found, returns a new user
|
||||
# with an email not found error.
|
||||
@@ -181,7 +184,8 @@ module Devise
|
||||
|
||||
# Is the unlock enabled for the given unlock strategy?
|
||||
def unlock_strategy_enabled?(strategy)
|
||||
[:both, strategy].include?(self.unlock_strategy)
|
||||
self.unlock_strategy == strategy ||
|
||||
(self.unlock_strategy == :both && BOTH_STRATEGIES.include?(strategy))
|
||||
end
|
||||
|
||||
# Is the lock enabled for the given lock strategy?
|
||||
|
||||
@@ -27,11 +27,7 @@ module Devise
|
||||
end
|
||||
|
||||
included do
|
||||
before_update do
|
||||
if (respond_to?(:email_changed?) && email_changed?) || encrypted_password_changed?
|
||||
clear_reset_password_token
|
||||
end
|
||||
end
|
||||
before_update :clear_reset_password_token, if: :clear_reset_password_token?
|
||||
end
|
||||
|
||||
# Update password saving the record and clearing token. Returns true if
|
||||
@@ -40,19 +36,9 @@ module Devise
|
||||
self.password = new_password
|
||||
self.password_confirmation = new_password_confirmation
|
||||
|
||||
if respond_to?(:after_password_reset) && valid?
|
||||
ActiveSupport::Deprecation.warn "after_password_reset is deprecated"
|
||||
after_password_reset
|
||||
end
|
||||
|
||||
save
|
||||
end
|
||||
|
||||
def reset_password!(new_password, new_password_confirmation)
|
||||
ActiveSupport::Deprecation.warn "reset_password! is deprecated in favor of reset_password"
|
||||
reset_password(new_password, new_password_confirmation)
|
||||
end
|
||||
|
||||
# Resets reset password token and send reset password instructions by email.
|
||||
# Returns the token sent in the e-mail.
|
||||
def send_reset_password_instructions
|
||||
@@ -99,7 +85,7 @@ module Devise
|
||||
|
||||
self.reset_password_token = enc
|
||||
self.reset_password_sent_at = Time.now.utc
|
||||
self.save(validate: false)
|
||||
save(validate: false)
|
||||
raw
|
||||
end
|
||||
|
||||
@@ -107,6 +93,15 @@ module Devise
|
||||
send_devise_notification(:reset_password_instructions, token, {})
|
||||
end
|
||||
|
||||
def clear_reset_password_token?
|
||||
encrypted_password_changed = respond_to?(:encrypted_password_changed?) && encrypted_password_changed?
|
||||
authentication_keys_changed = self.class.authentication_keys.any? do |attribute|
|
||||
respond_to?("#{attribute}_changed?") && send("#{attribute}_changed?")
|
||||
end
|
||||
|
||||
authentication_keys_changed || encrypted_password_changed
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
# Attempt to find a user by password reset token. If a user is found, return it
|
||||
# If a user is not found, return nil
|
||||
|
||||
@@ -46,7 +46,7 @@ module Devise
|
||||
end
|
||||
|
||||
def remember_me!
|
||||
self.remember_token = self.class.remember_token if respond_to?(:remember_token)
|
||||
self.remember_token ||= self.class.remember_token if respond_to?(:remember_token)
|
||||
self.remember_created_at ||= Time.now.utc
|
||||
save(validate: false) if self.changed?
|
||||
end
|
||||
|
||||
@@ -1,57 +1,6 @@
|
||||
module Devise
|
||||
module OmniAuth
|
||||
module UrlHelpers
|
||||
def self.define_helpers(mapping)
|
||||
return unless mapping.omniauthable?
|
||||
|
||||
mapping = mapping.name
|
||||
|
||||
class_eval do
|
||||
define_method("#{mapping}_omniauth_authorize_path") do |provider, *args|
|
||||
ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
|
||||
[Devise] #{mapping}_omniauth_authorize_path(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
|
||||
|
||||
Please use #{mapping}_#{provider}_omniauth_authorize_path instead.
|
||||
DEPRECATION
|
||||
send("#{mapping}_#{provider}_omniauth_authorize_path", *args)
|
||||
end
|
||||
|
||||
define_method("#{mapping}_omniauth_authorize_url") do |provider, *args|
|
||||
ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
|
||||
[Devise] #{mapping}_omniauth_authorize_url(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
|
||||
|
||||
Please use #{mapping}_#{provider}_omniauth_authorize_url instead.
|
||||
DEPRECATION
|
||||
send("#{mapping}_#{provider}_omniauth_authorize_url", *args)
|
||||
end
|
||||
|
||||
define_method("#{mapping}_omniauth_callback_path") do |provider, *args|
|
||||
ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
|
||||
[Devise] #{mapping}_omniauth_callback_path(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
|
||||
|
||||
Please use #{mapping}_#{provider}_omniauth_callback_path instead.
|
||||
DEPRECATION
|
||||
send("#{mapping}_#{provider}_omniauth_callback_path", *args)
|
||||
end
|
||||
|
||||
define_method("#{mapping}_omniauth_callback_url") do |provider, *args|
|
||||
ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
|
||||
[Devise] #{mapping}_omniauth_callback_url(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
|
||||
|
||||
Please use #{mapping}_#{provider}_omniauth_callback_url instead.
|
||||
DEPRECATION
|
||||
send("#{mapping}_#{provider}_omniauth_callback_url", *args)
|
||||
end
|
||||
end
|
||||
|
||||
ActiveSupport.on_load(:action_controller) do
|
||||
if respond_to?(:helper_method)
|
||||
helper_method "#{mapping}_omniauth_authorize_path", "#{mapping}_omniauth_authorize_url"
|
||||
helper_method "#{mapping}_omniauth_callback_path", "#{mapping}_omniauth_callback_url"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def omniauth_authorize_path(resource_or_scope, provider, *args)
|
||||
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
||||
_devise_route_context.send("#{scope}_#{provider}_omniauth_authorize_path", *args)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
require 'orm_adapter/adapters/active_record'
|
||||
|
||||
ActiveRecord::Base.extend Devise::Models
|
||||
ActiveSupport.on_load(:active_record) do
|
||||
extend Devise::Models
|
||||
end
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
require 'orm_adapter/adapters/mongoid'
|
||||
ActiveSupport.on_load(:mongoid) do
|
||||
require 'orm_adapter/adapters/mongoid'
|
||||
|
||||
Mongoid::Document::ClassMethods.send :include, Devise::Models
|
||||
Mongoid::Document::ClassMethods.send :include, Devise::Models
|
||||
end
|
||||
|
||||
@@ -68,12 +68,6 @@ module Devise
|
||||
def sanitize(action)
|
||||
permissions = @permitted[action]
|
||||
|
||||
# DEPRECATED: Remove this branch on Devise 4.1.
|
||||
if respond_to?(action, true)
|
||||
deprecate_instance_method_sanitization(action)
|
||||
return cast_to_hash send(action)
|
||||
end
|
||||
|
||||
if permissions.respond_to?(:call)
|
||||
cast_to_hash permissions.call(default_params)
|
||||
elsif permissions.present?
|
||||
@@ -127,17 +121,6 @@ module Devise
|
||||
end
|
||||
end
|
||||
|
||||
# DEPRECATED: Remove this method on Devise 4.1.
|
||||
def for(action, &block) # :nodoc:
|
||||
if block_given?
|
||||
deprecate_for_with_block(action)
|
||||
permit(action, &block)
|
||||
else
|
||||
deprecate_for_without_block(action)
|
||||
@permitted[action] or unknown_action!(action)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Cast a sanitized +ActionController::Parameters+ to a +HashWithIndifferentAccess+
|
||||
@@ -172,43 +155,5 @@ module Devise
|
||||
devise_parameter_sanitizer.permit(:#{action}, keys: [:param1, :param2, :param3])
|
||||
MESSAGE
|
||||
end
|
||||
|
||||
def deprecate_for_with_block(action)
|
||||
ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
|
||||
[Devise] Changing the sanitized parameters through "#{self.class.name}#for(#{action}) is deprecated and it will be removed from Devise 4.1.
|
||||
Please use the `permit` method:
|
||||
|
||||
devise_parameter_sanitizer.permit(:#{action}) do |user|
|
||||
# Your block here.
|
||||
end
|
||||
MESSAGE
|
||||
end
|
||||
|
||||
def deprecate_for_without_block(action)
|
||||
ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
|
||||
[Devise] Changing the sanitized parameters through "#{self.class.name}#for(#{action}) is deprecated and it will be removed from Devise 4.1.
|
||||
Please use the `permit` method to add or remove any key:
|
||||
|
||||
To add any new key, use the `keys` keyword argument:
|
||||
devise_parameter_sanitizer.permit(:#{action}, keys: [:param1, :param2, :param3])
|
||||
|
||||
To remove any existing key, use the `except` keyword argument:
|
||||
devise_parameter_sanitizer.permit(:#{action}, except: [:email])
|
||||
MESSAGE
|
||||
end
|
||||
|
||||
def deprecate_instance_method_sanitization(action)
|
||||
ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
|
||||
[Devise] Parameter sanitization through a "#{self.class.name}##{action}" method is deprecated and it will be removed from Devise 4.1.
|
||||
Please use the `permit` method on your sanitizer `initialize` method.
|
||||
|
||||
class #{self.class.name} < Devise::ParameterSanitizer
|
||||
def initialize(*)
|
||||
super
|
||||
permit(:#{action}, keys: [:param1, :param2, :param3])
|
||||
end
|
||||
end
|
||||
MESSAGE
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,7 +11,9 @@ module Devise
|
||||
end
|
||||
|
||||
# Force routes to be loaded if we are doing any eager load.
|
||||
config.before_eager_load { |app| app.reload_routes! }
|
||||
config.before_eager_load do |app|
|
||||
app.reload_routes! if Devise.reload_routes
|
||||
end
|
||||
|
||||
initializer "devise.url_helpers" do
|
||||
Devise.include_helpers(Devise::Controllers)
|
||||
|
||||
162
lib/devise/test/controller_helpers.rb
Normal file
162
lib/devise/test/controller_helpers.rb
Normal file
@@ -0,0 +1,162 @@
|
||||
module Devise
|
||||
module Test
|
||||
# `Devise::Test::ControllerHelpers` provides a facility to test controllers
|
||||
# in isolation when using `ActionController::TestCase` allowing you to
|
||||
# quickly sign_in or sign_out a user. Do not use
|
||||
# `Devise::Test::ControllerHelpers` in integration tests.
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# class PostsTest < ActionController::TestCase
|
||||
# include Devise::Test::ControllerHelpers
|
||||
#
|
||||
# test 'authenticated users can GET index' do
|
||||
# sign_in users(:bob)
|
||||
#
|
||||
# get :index
|
||||
# assert_response :success
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# Important: you should not test Warden specific behavior (like callbacks)
|
||||
# using `Devise::Test::ControllerHelpers` since it is a stub of the actual
|
||||
# behavior. Such callbacks should be tested in your integration suite instead.
|
||||
module ControllerHelpers
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
setup :setup_controller_for_warden, :warden
|
||||
end
|
||||
|
||||
# Override process to consider warden.
|
||||
def process(*)
|
||||
_catch_warden { super }
|
||||
|
||||
@response
|
||||
end
|
||||
|
||||
# We need to set up the environment variables and the response in the controller.
|
||||
def setup_controller_for_warden #:nodoc:
|
||||
@request.env['action_controller.instance'] = @controller
|
||||
end
|
||||
|
||||
# Quick access to Warden::Proxy.
|
||||
def warden #:nodoc:
|
||||
@request.env['warden'] ||= begin
|
||||
manager = Warden::Manager.new(nil) do |config|
|
||||
config.merge! Devise.warden_config
|
||||
end
|
||||
Warden::Proxy.new(@request.env, manager)
|
||||
end
|
||||
end
|
||||
|
||||
# sign_in a given resource by storing its keys in the session.
|
||||
# This method bypass any warden authentication callback.
|
||||
#
|
||||
# * +resource+ - The resource that should be authenticated
|
||||
# * +scope+ - An optional +Symbol+ with the scope where the resource
|
||||
# should be signed in with.
|
||||
# Examples:
|
||||
#
|
||||
# sign_in users(:alice)
|
||||
# sign_in users(:alice), scope: :admin
|
||||
def sign_in(resource, deprecated = nil, scope: nil)
|
||||
if deprecated.present?
|
||||
scope = resource
|
||||
resource = deprecated
|
||||
|
||||
ActiveSupport::Deprecation.warn <<-DEPRECATION
|
||||
[Devise] sign_in(:#{scope}, resource) on controller tests is deprecated and will be removed from Devise.
|
||||
Please use sign_in(resource, scope: :#{scope}) instead.
|
||||
DEPRECATION
|
||||
end
|
||||
|
||||
scope ||= Devise::Mapping.find_scope!(resource)
|
||||
|
||||
warden.instance_variable_get(:@users).delete(scope)
|
||||
warden.session_serializer.store(resource, scope)
|
||||
end
|
||||
|
||||
# Sign out a given resource or scope by calling logout on Warden.
|
||||
# This method bypass any warden logout callback.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# sign_out :user # sign_out(scope)
|
||||
# sign_out @user # sign_out(resource)
|
||||
#
|
||||
def sign_out(resource_or_scope)
|
||||
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
||||
@controller.instance_variable_set(:"@current_#{scope}", nil)
|
||||
user = warden.instance_variable_get(:@users).delete(scope)
|
||||
warden.session_serializer.delete(scope, user)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
# Catch warden continuations and handle like the middleware would.
|
||||
# Returns nil when interrupted, otherwise the normal result of the block.
|
||||
def _catch_warden(&block)
|
||||
result = catch(:warden, &block)
|
||||
|
||||
env = @controller.request.env
|
||||
|
||||
result ||= {}
|
||||
|
||||
# Set the response. In production, the rack result is returned
|
||||
# from Warden::Manager#call, which the following is modelled on.
|
||||
case result
|
||||
when Array
|
||||
if result.first == 401 && intercept_401?(env) # does this happen during testing?
|
||||
_process_unauthenticated(env)
|
||||
else
|
||||
result
|
||||
end
|
||||
when Hash
|
||||
_process_unauthenticated(env, result)
|
||||
else
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
def _process_unauthenticated(env, options = {})
|
||||
options[:action] ||= :unauthenticated
|
||||
proxy = request.env['warden']
|
||||
result = options[:result] || proxy.result
|
||||
|
||||
ret = case result
|
||||
when :redirect
|
||||
body = proxy.message || "You are being redirected to #{proxy.headers['Location']}"
|
||||
[proxy.status, proxy.headers, [body]]
|
||||
when :custom
|
||||
proxy.custom_response
|
||||
else
|
||||
request.env["PATH_INFO"] = "/#{options[:action]}"
|
||||
request.env["warden.options"] = options
|
||||
Warden::Manager._run_callbacks(:before_failure, env, options)
|
||||
|
||||
status, headers, response = Devise.warden_config[:failure_app].call(env).to_a
|
||||
@controller.response.headers.merge!(headers)
|
||||
@controller.status = status
|
||||
@controller.response.body = response.body
|
||||
nil # causes process return @response
|
||||
end
|
||||
|
||||
# ensure that the controller response is set up. In production, this is
|
||||
# not necessary since warden returns the results to rack. However, at
|
||||
# testing time, we want the response to be available to the testing
|
||||
# framework to verify what would be returned to rack.
|
||||
if ret.is_a?(Array)
|
||||
status, headers, body = *ret
|
||||
# ensure the controller response is set to our response.
|
||||
@controller.response ||= @response
|
||||
@response.status = status
|
||||
@response.headers.merge!(headers)
|
||||
@response.body = body
|
||||
end
|
||||
|
||||
ret
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
61
lib/devise/test/integration_helpers.rb
Normal file
61
lib/devise/test/integration_helpers.rb
Normal file
@@ -0,0 +1,61 @@
|
||||
module Devise
|
||||
# Devise::Test::IntegrationHelpers is a helper module for facilitating
|
||||
# authentication on Rails integration tests to bypass the required steps for
|
||||
# signin in or signin out a record.
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# class PostsTest < ActionDispatch::IntegrationTest
|
||||
# include Devise::Test::IntegrationHelpers
|
||||
#
|
||||
# test 'authenticated users can see posts' do
|
||||
# sign_in users(:bob)
|
||||
#
|
||||
# get '/posts'
|
||||
# assert_response :success
|
||||
# end
|
||||
# end
|
||||
module Test
|
||||
module IntegrationHelpers
|
||||
def self.included(base)
|
||||
base.class_eval do
|
||||
include Warden::Test::Helpers
|
||||
|
||||
setup :setup_integration_for_devise
|
||||
teardown :teardown_integration_for_devise
|
||||
end
|
||||
end
|
||||
|
||||
# Signs in a specific resource, mimicking a successfull sign in
|
||||
# operation through +Devise::SessionsController#create+.
|
||||
#
|
||||
# * +resource+ - The resource that should be authenticated
|
||||
# * +scope+ - An optional +Symbol+ with the scope where the resource
|
||||
# should be signed in with.
|
||||
def sign_in(resource, scope: nil)
|
||||
scope ||= Devise::Mapping.find_scope!(resource)
|
||||
|
||||
login_as(resource, scope: scope)
|
||||
end
|
||||
|
||||
# Signs out a specific scope from the session.
|
||||
#
|
||||
# * +resource_or_scope+ - The resource or scope that should be signed out.
|
||||
def sign_out(resource_or_scope)
|
||||
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
||||
|
||||
logout scope
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def setup_integration_for_devise
|
||||
Warden.test_mode!
|
||||
end
|
||||
|
||||
def teardown_integration_for_devise
|
||||
Warden.test_reset!
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,137 +1,13 @@
|
||||
module Devise
|
||||
# Devise::TestHelpers provides a facility to test controllers in isolation
|
||||
# when using ActionController::TestCase allowing you to quickly sign_in or
|
||||
# sign_out a user. Do not use Devise::TestHelpers in integration tests.
|
||||
#
|
||||
# Notice you should not test Warden specific behavior (like Warden callbacks)
|
||||
# using Devise::TestHelpers since it is a stub of the actual behavior. Such
|
||||
# callbacks should be tested in your integration suite instead.
|
||||
module TestHelpers
|
||||
def self.included(base)
|
||||
base.class_eval do
|
||||
setup :setup_controller_for_warden, :warden if respond_to?(:setup)
|
||||
ActiveSupport::Deprecation.warn <<-DEPRECATION
|
||||
[Devise] including `Devise::TestHelpers` is deprecated and will be removed from Devise.
|
||||
For controller tests, please include `Devise::Test::ControllerHelpers` instead.
|
||||
DEPRECATION
|
||||
include Devise::Test::ControllerHelpers
|
||||
end
|
||||
end
|
||||
|
||||
# Override process to consider warden.
|
||||
def process(*)
|
||||
# Make sure we always return @response, a la ActionController::TestCase::Behaviour#process, even if warden interrupts
|
||||
_catch_warden { super } # || @response # _catch_warden will setup the @response object
|
||||
|
||||
# process needs to return the ActionDispath::TestResponse object
|
||||
@response
|
||||
end
|
||||
|
||||
# We need to set up the environment variables and the response in the controller.
|
||||
def setup_controller_for_warden #:nodoc:
|
||||
@request.env['action_controller.instance'] = @controller
|
||||
end
|
||||
|
||||
# Quick access to Warden::Proxy.
|
||||
def warden #:nodoc:
|
||||
@request.env['warden'] ||= begin
|
||||
manager = Warden::Manager.new(nil) do |config|
|
||||
config.merge! Devise.warden_config
|
||||
end
|
||||
Warden::Proxy.new(@request.env, manager)
|
||||
end
|
||||
end
|
||||
|
||||
# sign_in a given resource by storing its keys in the session.
|
||||
# This method bypass any warden authentication callback.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# sign_in :user, @user # sign_in(scope, resource)
|
||||
# sign_in @user # sign_in(resource)
|
||||
#
|
||||
def sign_in(resource_or_scope, resource=nil)
|
||||
scope ||= Devise::Mapping.find_scope!(resource_or_scope)
|
||||
resource ||= resource_or_scope
|
||||
warden.instance_variable_get(:@users).delete(scope)
|
||||
warden.session_serializer.store(resource, scope)
|
||||
end
|
||||
|
||||
# Sign out a given resource or scope by calling logout on Warden.
|
||||
# This method bypass any warden logout callback.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# sign_out :user # sign_out(scope)
|
||||
# sign_out @user # sign_out(resource)
|
||||
#
|
||||
def sign_out(resource_or_scope)
|
||||
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
||||
@controller.instance_variable_set(:"@current_#{scope}", nil)
|
||||
user = warden.instance_variable_get(:@users).delete(scope)
|
||||
warden.session_serializer.delete(scope, user)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
# Catch warden continuations and handle like the middleware would.
|
||||
# Returns nil when interrupted, otherwise the normal result of the block.
|
||||
def _catch_warden(&block)
|
||||
result = catch(:warden, &block)
|
||||
|
||||
env = @controller.request.env
|
||||
|
||||
result ||= {}
|
||||
|
||||
# Set the response. In production, the rack result is returned
|
||||
# from Warden::Manager#call, which the following is modelled on.
|
||||
case result
|
||||
when Array
|
||||
if result.first == 401 && intercept_401?(env) # does this happen during testing?
|
||||
_process_unauthenticated(env)
|
||||
else
|
||||
result
|
||||
end
|
||||
when Hash
|
||||
_process_unauthenticated(env, result)
|
||||
else
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
def _process_unauthenticated(env, options = {})
|
||||
options[:action] ||= :unauthenticated
|
||||
proxy = env['warden']
|
||||
result = options[:result] || proxy.result
|
||||
|
||||
ret = case result
|
||||
when :redirect
|
||||
body = proxy.message || "You are being redirected to #{proxy.headers['Location']}"
|
||||
[proxy.status, proxy.headers, [body]]
|
||||
when :custom
|
||||
proxy.custom_response
|
||||
else
|
||||
env["PATH_INFO"] = "/#{options[:action]}"
|
||||
env["warden.options"] = options
|
||||
Warden::Manager._run_callbacks(:before_failure, env, options)
|
||||
|
||||
status, headers, response = Devise.warden_config[:failure_app].call(env).to_a
|
||||
@controller.response.headers.merge!(headers)
|
||||
r_opts = { status: status, content_type: headers["Content-Type"], location: headers["Location"] }
|
||||
r_opts[Rails.version.start_with?('5') ? :body : :text] = response.body
|
||||
@controller.send :render, r_opts
|
||||
nil # causes process return @response
|
||||
end
|
||||
|
||||
# ensure that the controller response is set up. In production, this is
|
||||
# not necessary since warden returns the results to rack. However, at
|
||||
# testing time, we want the response to be available to the testing
|
||||
# framework to verify what would be returned to rack.
|
||||
if ret.is_a?(Array)
|
||||
# ensure the controller response is set to our response.
|
||||
@controller.response ||= @response
|
||||
@response.status = ret.first
|
||||
@response.headers.clear
|
||||
ret.second.each { |k,v| @response[k] = v }
|
||||
@response.body = ret.third
|
||||
end
|
||||
|
||||
ret
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Devise
|
||||
VERSION = "4.0.0".freeze
|
||||
VERSION = "4.2.0".freeze
|
||||
end
|
||||
|
||||
@@ -21,14 +21,7 @@ Some setup you must do manually if you haven't yet:
|
||||
<p class="notice"><%= notice %></p>
|
||||
<p class="alert"><%= alert %></p>
|
||||
|
||||
4. If you are deploying on Heroku with Rails 3.2 only, you may want to set:
|
||||
|
||||
config.assets.initialize_on_precompile = false
|
||||
|
||||
On config/application.rb forcing your application to not access the DB
|
||||
or load models when precompiling your assets.
|
||||
|
||||
5. You can copy Devise views (for customization) to your app by running:
|
||||
4. You can copy Devise views (for customization) to your app by running:
|
||||
|
||||
rails g devise:views
|
||||
|
||||
|
||||
8
lib/generators/templates/devise.rb
Normal file → Executable file
8
lib/generators/templates/devise.rb
Normal file → Executable file
@@ -90,6 +90,12 @@ Devise.setup do |config|
|
||||
# from the server. You can disable this option at your own risk.
|
||||
# config.clean_up_csrf_token_on_authentication = true
|
||||
|
||||
# When false, Devise will not attempt to reload routes on eager load.
|
||||
# This can reduce the time taken to boot the app but if your application
|
||||
# requires the Devise mappings to be loaded during boot time the application
|
||||
# won't boot properly.
|
||||
# config.reload_routes = true
|
||||
|
||||
# ==> Configuration for :database_authenticatable
|
||||
# For bcrypt, this is the cost for hashing the password and defaults to 11. If
|
||||
# using other algorithms, it sets how many times you want the password to be hashed.
|
||||
@@ -153,7 +159,7 @@ Devise.setup do |config|
|
||||
# Email regex used to validate email formats. It simply asserts that
|
||||
# one (and only one) @ exists in the given string. This is mainly
|
||||
# to give user feedback and not to assert the e-mail validity.
|
||||
config.email_regexp = /\A[^@]+@[^@]+\z/
|
||||
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
|
||||
|
||||
# ==> Configuration for :timeoutable
|
||||
# The time you want to timeout the user session without activity. After this
|
||||
|
||||
@@ -3,7 +3,7 @@ require 'test_helper'
|
||||
class CustomRegistrationsControllerTest < Devise::ControllerTestCase
|
||||
tests Custom::RegistrationsController
|
||||
|
||||
include Devise::TestHelpers
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
setup do
|
||||
request.env["devise.mapping"] = Devise.mappings[:user]
|
||||
|
||||
@@ -27,7 +27,7 @@ end
|
||||
class CustomStrategyTest < Devise::ControllerTestCase
|
||||
tests CustomStrategyController
|
||||
|
||||
include Devise::TestHelpers
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
setup do
|
||||
Warden::Strategies.add(:custom_strategy, CustomStrategy)
|
||||
|
||||
@@ -96,7 +96,7 @@ class ControllerAuthenticatableTest < Devise::ControllerTestCase
|
||||
|
||||
test 'proxy admin_signed_in? to authenticatewith admin scope' do
|
||||
@mock_warden.expects(:authenticate).with(scope: :admin)
|
||||
assert_not @controller.admin_signed_in?
|
||||
refute @controller.admin_signed_in?
|
||||
end
|
||||
|
||||
test 'proxy publisher_account_signed_in? to authenticate with namespaced publisher account scope' do
|
||||
@@ -150,11 +150,11 @@ class ControllerAuthenticatableTest < Devise::ControllerTestCase
|
||||
@controller.sign_in(user, force: true)
|
||||
end
|
||||
|
||||
test 'sign in accepts bypass as option' do
|
||||
test 'bypass the sign in' do
|
||||
user = User.new
|
||||
@mock_warden.expects(:session_serializer).returns(serializer = mock())
|
||||
serializer.expects(:store).with(user, :user)
|
||||
@controller.sign_in(user, bypass: true)
|
||||
@controller.bypass_sign_in(user)
|
||||
end
|
||||
|
||||
test 'sign out clears up any signed in user from all scopes' do
|
||||
@@ -311,6 +311,6 @@ class ControllerAuthenticatableTest < Devise::ControllerTestCase
|
||||
end
|
||||
|
||||
test 'is not a devise controller' do
|
||||
assert_not @controller.devise_controller?
|
||||
refute @controller.devise_controller?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -119,7 +119,7 @@ class HelpersTest < Devise::ControllerTestCase
|
||||
MyController.send(:public, :navigational_formats)
|
||||
|
||||
swap Devise, navigational_formats: ['*/*', :html] do
|
||||
assert_not @controller.navigational_formats.include?("*/*")
|
||||
refute @controller.navigational_formats.include?("*/*")
|
||||
end
|
||||
|
||||
MyController.send(:protected, :navigational_formats)
|
||||
|
||||
@@ -2,7 +2,7 @@ require 'test_helper'
|
||||
|
||||
class PasswordsControllerTest < Devise::ControllerTestCase
|
||||
tests Devise::PasswordsController
|
||||
include Devise::TestHelpers
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
setup do
|
||||
request.env["devise.mapping"] = Devise.mappings[:user]
|
||||
|
||||
@@ -2,11 +2,11 @@ require 'test_helper'
|
||||
|
||||
class SessionsControllerTest < Devise::ControllerTestCase
|
||||
tests Devise::SessionsController
|
||||
include Devise::TestHelpers
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
test "#create doesn't raise unpermitted params when sign in fails" do
|
||||
begin
|
||||
subscriber = ActiveSupport::Notifications.subscribe /unpermitted_parameters/ do |name, start, finish, id, payload|
|
||||
subscriber = ActiveSupport::Notifications.subscribe %r{unpermitted_parameters} do |name, start, finish, id, payload|
|
||||
flunk "Unpermitted params: #{payload}"
|
||||
end
|
||||
request.env["devise.mapping"] = Devise.mappings[:user]
|
||||
@@ -94,7 +94,7 @@ class SessionsControllerTest < Devise::ControllerTestCase
|
||||
User.class_eval { attr_protected :email }
|
||||
|
||||
begin
|
||||
assert_nothing_raised ActiveModel::MassAssignmentSecurity::Error do
|
||||
assert_nothing_raised do
|
||||
get :new, user: { email: "allez viens!" }
|
||||
end
|
||||
ensure
|
||||
|
||||
49
test/devise_test.rb
Normal file → Executable file
49
test/devise_test.rb
Normal file → Executable file
@@ -35,33 +35,6 @@ class DeviseTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
test 'setup block warns about defaults changing' do
|
||||
Devise.app_set_configs = Set.new
|
||||
|
||||
ActiveSupport::Deprecation.expects(:warn).with() { |value| value =~ /email_regexp/ }
|
||||
ActiveSupport::Deprecation.expects(:warn).with() { |value| value =~ /reconfirmable/ }
|
||||
ActiveSupport::Deprecation.expects(:warn).with() { |value| value =~ /sign_out_via/ }
|
||||
ActiveSupport::Deprecation.expects(:warn).with() { |value| value =~ /skip_session_storage/ }
|
||||
ActiveSupport::Deprecation.expects(:warn).with() { |value| value =~ /strip_whitespace_keys/ }
|
||||
|
||||
Devise.setup do
|
||||
end
|
||||
end
|
||||
|
||||
test 'setup block doest not warns when the change is explicit set' do
|
||||
ActiveSupport::Deprecation.expects(:warn).never
|
||||
|
||||
swap Devise,
|
||||
email_regexp: /@/,
|
||||
reconfirmable: false,
|
||||
sign_out_via: :get,
|
||||
skip_session_storage: [],
|
||||
strip_whitespace_keys: [] do
|
||||
Devise.setup do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
test 'stores warden configuration' do
|
||||
assert_kind_of Devise::Delegator, Devise.warden_config.failure_app
|
||||
assert_equal :user, Devise.warden_config.default_scope
|
||||
@@ -94,18 +67,18 @@ class DeviseTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test 'add new module using the helper method' do
|
||||
assert_nothing_raised(Exception) { Devise.add_module(:coconut) }
|
||||
Devise.add_module(:coconut)
|
||||
assert_equal 1, Devise::ALL.select { |v| v == :coconut }.size
|
||||
assert_not Devise::STRATEGIES.include?(:coconut)
|
||||
assert_not defined?(Devise::Models::Coconut)
|
||||
refute Devise::STRATEGIES.include?(:coconut)
|
||||
refute defined?(Devise::Models::Coconut)
|
||||
Devise::ALL.delete(:coconut)
|
||||
|
||||
assert_nothing_raised(Exception) { Devise.add_module(:banana, strategy: :fruits) }
|
||||
Devise.add_module(:banana, strategy: :fruits)
|
||||
assert_equal :fruits, Devise::STRATEGIES[:banana]
|
||||
Devise::ALL.delete(:banana)
|
||||
Devise::STRATEGIES.delete(:banana)
|
||||
|
||||
assert_nothing_raised(Exception) { Devise.add_module(:kivi, controller: :fruits) }
|
||||
Devise.add_module(:kivi, controller: :fruits)
|
||||
assert_equal :fruits, Devise::CONTROLLERS[:kivi]
|
||||
Devise::ALL.delete(:kivi)
|
||||
Devise::CONTROLLERS.delete(:kivi)
|
||||
@@ -113,16 +86,16 @@ class DeviseTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should complain when comparing empty or different sized passes' do
|
||||
[nil, ""].each do |empty|
|
||||
assert_not Devise.secure_compare(empty, "something")
|
||||
assert_not Devise.secure_compare("something", empty)
|
||||
assert_not Devise.secure_compare(empty, empty)
|
||||
refute Devise.secure_compare(empty, "something")
|
||||
refute Devise.secure_compare("something", empty)
|
||||
refute Devise.secure_compare(empty, empty)
|
||||
end
|
||||
assert_not Devise.secure_compare("size_1", "size_four")
|
||||
refute Devise.secure_compare("size_1", "size_four")
|
||||
end
|
||||
|
||||
test 'Devise.email_regexp should match valid email addresses' do
|
||||
valid_emails = ["test@example.com", "jo@jo.co", "f4$_m@you.com", "testing.example@example.com.ua"]
|
||||
non_valid_emails = ["rex", "test@go,com", "test user@example.com", "test_user@example server.com", "test_user@example.com."]
|
||||
valid_emails = ["test@example.com", "jo@jo.co", "f4$_m@you.com", "testing.example@example.com.ua", "test@tt", "test@valid---domain.com"]
|
||||
non_valid_emails = ["rex", "test user@example.com", "test_user@example server.com"]
|
||||
|
||||
valid_emails.each do |email|
|
||||
assert_match Devise.email_regexp, email
|
||||
|
||||
@@ -131,16 +131,34 @@ class FailureTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
if Rails.application.config.action_controller.respond_to?(:relative_url_root)
|
||||
test "returns to the default redirect location considering action_controller's relative url root" do
|
||||
swap Rails.application.config.action_controller, relative_url_root: "/sample" do
|
||||
call_failure
|
||||
assert_equal 302, @response.first
|
||||
assert_equal 'http://test.host/sample/users/sign_in', @response.second['Location']
|
||||
end
|
||||
end
|
||||
|
||||
test "returns to the default redirect location considering action_controller's relative url root and subdomain" do
|
||||
swap Rails.application.config.action_controller, relative_url_root: "/sample" do
|
||||
call_failure('warden.options' => { scope: :subdomain_user })
|
||||
assert_equal 302, @response.first
|
||||
assert_equal 'http://sub.test.host/sample/subdomain_users/sign_in', @response.second['Location']
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
test 'uses the proxy failure message as symbol' do
|
||||
call_failure('warden' => OpenStruct.new(message: :invalid))
|
||||
assert_equal 'Invalid email or password.', @request.flash[:alert]
|
||||
assert_equal 'Invalid Email or password.', @request.flash[:alert]
|
||||
assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
|
||||
end
|
||||
|
||||
test 'supports authentication_keys as a Hash for the flash message' do
|
||||
swap Devise, authentication_keys: { email: true, login: true } do
|
||||
call_failure('warden' => OpenStruct.new(message: :invalid))
|
||||
assert_equal 'Invalid email, login or password.', @request.flash[:alert]
|
||||
assert_equal 'Invalid Email, Login or password.', @request.flash[:alert]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -226,7 +244,7 @@ class FailureTest < ActiveSupport::TestCase
|
||||
|
||||
test 'uses the failure message as response body' do
|
||||
call_failure('formats' => Mime[:xml], 'warden' => OpenStruct.new(message: :invalid))
|
||||
assert_match '<error>Invalid email or password.</error>', @response.third.body
|
||||
assert_match '<error>Invalid Email or password.</error>', @response.third.body
|
||||
end
|
||||
|
||||
context 'on ajax call' do
|
||||
@@ -275,7 +293,7 @@ class FailureTest < ActiveSupport::TestCase
|
||||
}
|
||||
call_failure(env)
|
||||
assert @response.third.body.include?('<h2>Log in</h2>')
|
||||
assert @response.third.body.include?('Invalid email or password.')
|
||||
assert @response.third.body.include?('Invalid Email or password.')
|
||||
end
|
||||
|
||||
test 'calls the original controller if not confirmed email' do
|
||||
@@ -310,7 +328,7 @@ class FailureTest < ActiveSupport::TestCase
|
||||
}
|
||||
call_failure(env)
|
||||
assert @response.third.body.include?('<h2>Log in</h2>')
|
||||
assert @response.third.body.include?('Invalid email or password.')
|
||||
assert @response.third.body.include?('Invalid Email or password.')
|
||||
assert_equal @request.env["SCRIPT_NAME"], '/sample'
|
||||
assert_equal @request.env["PATH_INFO"], '/users/sign_in'
|
||||
end
|
||||
|
||||
@@ -74,7 +74,7 @@ if DEVISE_ORM == :active_record
|
||||
|
||||
assert_file "app/models/rails_engine/monster.rb", /devise/
|
||||
assert_file "app/models/rails_engine/monster.rb" do |content|
|
||||
assert_no_match /attr_accessible :email/, content
|
||||
assert_no_match %r{attr_accessible :email}, content
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -10,13 +10,13 @@ class AuthenticationSanityTest < Devise::IntegrationTest
|
||||
test 'sign in as user should not authenticate admin scope' do
|
||||
sign_in_as_user
|
||||
assert warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
|
||||
test 'sign in as admin should not authenticate user scope' do
|
||||
sign_in_as_admin
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'sign in as both user and admin at same time' do
|
||||
@@ -30,8 +30,8 @@ class AuthenticationSanityTest < Devise::IntegrationTest
|
||||
swap Devise, sign_out_all_scopes: false do
|
||||
sign_in_as_user
|
||||
sign_in_as_admin
|
||||
get destroy_user_session_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
delete destroy_user_session_path
|
||||
refute warden.authenticated?(:user)
|
||||
assert warden.authenticated?(:admin)
|
||||
end
|
||||
end
|
||||
@@ -41,8 +41,8 @@ class AuthenticationSanityTest < Devise::IntegrationTest
|
||||
sign_in_as_user
|
||||
sign_in_as_admin
|
||||
|
||||
get destroy_admin_session_path
|
||||
assert_not warden.authenticated?(:admin)
|
||||
delete destroy_admin_session_path
|
||||
refute warden.authenticated?(:admin)
|
||||
assert warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
@@ -52,9 +52,9 @@ class AuthenticationSanityTest < Devise::IntegrationTest
|
||||
sign_in_as_user
|
||||
sign_in_as_admin
|
||||
|
||||
get destroy_user_session_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
delete destroy_user_session_path
|
||||
refute warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -63,22 +63,22 @@ class AuthenticationSanityTest < Devise::IntegrationTest
|
||||
sign_in_as_user
|
||||
sign_in_as_admin
|
||||
|
||||
get destroy_admin_session_path
|
||||
assert_not warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
delete destroy_admin_session_path
|
||||
refute warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
test 'not signed in as admin should not be able to access admins actions' do
|
||||
get admins_path
|
||||
assert_redirected_to new_admin_session_path
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
|
||||
test 'signed in as user should not be able to access admins actions' do
|
||||
sign_in_as_user
|
||||
assert warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
|
||||
get admins_path
|
||||
assert_redirected_to new_admin_session_path
|
||||
@@ -87,7 +87,7 @@ class AuthenticationSanityTest < Devise::IntegrationTest
|
||||
test 'signed in as admin should be able to access admin actions' do
|
||||
sign_in_as_admin
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
get admins_path
|
||||
|
||||
@@ -109,17 +109,17 @@ class AuthenticationSanityTest < Devise::IntegrationTest
|
||||
sign_in_as_admin
|
||||
assert warden.authenticated?(:admin)
|
||||
|
||||
get destroy_admin_session_path
|
||||
delete destroy_admin_session_path
|
||||
assert_response :redirect
|
||||
assert_redirected_to root_path
|
||||
|
||||
get root_path
|
||||
assert_contain 'Signed out successfully'
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
|
||||
test 'unauthenticated admin set message on sign out' do
|
||||
get destroy_admin_session_path
|
||||
delete destroy_admin_session_path
|
||||
assert_response :redirect
|
||||
assert_redirected_to root_path
|
||||
|
||||
@@ -138,13 +138,13 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'not signed in should not be able to access private route (authenticate denied)' do
|
||||
get private_path
|
||||
assert_redirected_to new_admin_session_path
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
|
||||
test 'signed in as user should not be able to access private route restricted to admins (authenticate denied)' do
|
||||
sign_in_as_user
|
||||
assert warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
get private_path
|
||||
assert_redirected_to new_admin_session_path
|
||||
end
|
||||
@@ -152,7 +152,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in as admin should be able to access private route restricted to admins (authenticate accepted)' do
|
||||
sign_in_as_admin
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
get private_path
|
||||
|
||||
@@ -164,7 +164,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in as inactive admin should not be able to access private/active route restricted to active admins (authenticate denied)' do
|
||||
sign_in_as_admin(active: false)
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
assert_raises ActionController::RoutingError do
|
||||
get "/private/active"
|
||||
@@ -174,7 +174,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in as active admin should be able to access private/active route restricted to active admins (authenticate accepted)' do
|
||||
sign_in_as_admin(active: true)
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
get private_active_path
|
||||
|
||||
@@ -186,7 +186,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in as admin should get admin dashboard (authenticated accepted)' do
|
||||
sign_in_as_admin
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
get dashboard_path
|
||||
|
||||
@@ -198,7 +198,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in as user should get user dashboard (authenticated accepted)' do
|
||||
sign_in_as_user
|
||||
assert warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
|
||||
get dashboard_path
|
||||
|
||||
@@ -216,7 +216,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in as inactive admin should not be able to access dashboard/active route restricted to active admins (authenticated denied)' do
|
||||
sign_in_as_admin(active: false)
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
assert_raises ActionController::RoutingError do
|
||||
get "/dashboard/active"
|
||||
@@ -226,7 +226,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in as active admin should be able to access dashboard/active route restricted to active admins (authenticated accepted)' do
|
||||
sign_in_as_admin(active: true)
|
||||
assert warden.authenticated?(:admin)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
get dashboard_active_path
|
||||
|
||||
@@ -238,7 +238,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
|
||||
test 'signed in user should not see unauthenticated page (unauthenticated denied)' do
|
||||
sign_in_as_user
|
||||
assert warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
|
||||
assert_raises ActionController::RoutingError do
|
||||
get join_path
|
||||
@@ -347,37 +347,6 @@ class AuthenticationSessionTest < Devise::IntegrationTest
|
||||
assert_equal "Cart", @controller.user_session[:cart]
|
||||
end
|
||||
|
||||
test 'does not explode when class name is still stored in session' do
|
||||
# In order to test that old sessions do not break with the new scoped
|
||||
# deserialization, we need to serialize the session the old way. This is
|
||||
# done by removing the newly used scoped serialization method
|
||||
# (#user_serialize) and bringing back the old uncsoped #serialize method
|
||||
# that includes the record's class name in the serialization.
|
||||
begin
|
||||
Warden::SessionSerializer.class_eval do
|
||||
alias_method :original_serialize, :serialize
|
||||
alias_method :original_user_serialize, :user_serialize
|
||||
remove_method :user_serialize
|
||||
|
||||
def serialize(record)
|
||||
klass = record.class
|
||||
array = klass.serialize_into_session(record)
|
||||
array.unshift(klass.name)
|
||||
end
|
||||
end
|
||||
|
||||
sign_in_as_user
|
||||
assert warden.authenticated?(:user)
|
||||
ensure
|
||||
Warden::SessionSerializer.class_eval do
|
||||
alias_method :serialize, :original_serialize
|
||||
remove_method :original_serialize
|
||||
alias_method :user_serialize, :original_user_serialize
|
||||
remove_method :original_user_serialize
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
test 'session id is changed on sign in' do
|
||||
get '/users'
|
||||
session_id = request.session["session_id"]
|
||||
@@ -396,7 +365,7 @@ class AuthenticationWithScopedViewsTest < Devise::IntegrationTest
|
||||
assert_raise Webrat::NotFoundError do
|
||||
sign_in_as_user
|
||||
end
|
||||
assert_match /Special user view/, response.body
|
||||
assert_match %r{Special user view}, response.body
|
||||
end
|
||||
end
|
||||
|
||||
@@ -407,7 +376,7 @@ class AuthenticationWithScopedViewsTest < Devise::IntegrationTest
|
||||
sign_in_as_user
|
||||
end
|
||||
|
||||
assert_match /Special user view/, response.body
|
||||
assert_match %r{Special user view}, response.body
|
||||
assert !Devise::PasswordsController.scoped_views?
|
||||
ensure
|
||||
Devise::SessionsController.send :remove_instance_variable, :@scoped_views
|
||||
@@ -435,13 +404,13 @@ class AuthenticationOthersTest < Devise::IntegrationTest
|
||||
test 'handles unverified requests gets rid of caches' do
|
||||
swap ApplicationController, allow_forgery_protection: true do
|
||||
post exhibit_user_url(1)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
sign_in_as_user
|
||||
assert warden.authenticated?(:user)
|
||||
|
||||
post exhibit_user_url(1)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
assert_equal "User is not authenticated", response.body
|
||||
end
|
||||
end
|
||||
@@ -480,7 +449,7 @@ class AuthenticationOthersTest < Devise::IntegrationTest
|
||||
test 'sign in stub in xml format' do
|
||||
get new_user_session_path(format: 'xml')
|
||||
assert_match '<?xml version="1.0" encoding="UTF-8"?>', response.body
|
||||
assert_match /<user>.*<\/user>/m, response.body
|
||||
assert_match %r{<user>.*</user>}m, response.body
|
||||
assert_match '<email></email>', response.body
|
||||
assert_match '<password nil="true"', response.body
|
||||
end
|
||||
@@ -504,7 +473,7 @@ class AuthenticationOthersTest < Devise::IntegrationTest
|
||||
test 'uses the mapping from router' do
|
||||
sign_in_as_user visit: "/as/sign_in"
|
||||
assert warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
|
||||
test 'sign in with xml format returns xml response' do
|
||||
@@ -532,36 +501,36 @@ class AuthenticationOthersTest < Devise::IntegrationTest
|
||||
|
||||
test 'sign out with html redirects' do
|
||||
sign_in_as_user
|
||||
get destroy_user_session_path
|
||||
delete destroy_user_session_path
|
||||
assert_response :redirect
|
||||
assert_current_url '/'
|
||||
|
||||
sign_in_as_user
|
||||
get destroy_user_session_path(format: 'html')
|
||||
delete destroy_user_session_path(format: 'html')
|
||||
assert_response :redirect
|
||||
assert_current_url '/'
|
||||
end
|
||||
|
||||
test 'sign out with xml format returns no content' do
|
||||
sign_in_as_user
|
||||
get destroy_user_session_path(format: 'xml')
|
||||
delete destroy_user_session_path(format: 'xml')
|
||||
assert_response :no_content
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'sign out with json format returns no content' do
|
||||
sign_in_as_user
|
||||
get destroy_user_session_path(format: 'json')
|
||||
delete destroy_user_session_path(format: 'json')
|
||||
assert_response :no_content
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'sign out with non-navigational format via XHR does not redirect' do
|
||||
swap Devise, navigational_formats: ['*/*', :html] do
|
||||
sign_in_as_user
|
||||
get destroy_user_session_path, xhr: true, headers: { "HTTP_ACCEPT" => "application/json,text/javascript,*/*" } # NOTE: Bug is triggered by combination of XHR and */*.
|
||||
sign_in_as_admin
|
||||
get destroy_sign_out_via_get_session_path, xhr: true, headers: { "HTTP_ACCEPT" => "application/json,text/javascript,*/*" } # NOTE: Bug is triggered by combination of XHR and */*.
|
||||
assert_response :no_content
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -569,9 +538,9 @@ class AuthenticationOthersTest < Devise::IntegrationTest
|
||||
test 'sign out with navigational format via XHR does redirect' do
|
||||
swap Devise, navigational_formats: ['*/*', :html] do
|
||||
sign_in_as_user
|
||||
get destroy_user_session_path, xhr: true, headers: { "HTTP_ACCEPT" => "text/html,*/*" }
|
||||
delete destroy_user_session_path, xhr: true, headers: { "HTTP_ACCEPT" => "text/html,*/*" }
|
||||
assert_response :redirect
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -580,8 +549,8 @@ class AuthenticationKeysTest < Devise::IntegrationTest
|
||||
test 'missing authentication keys cause authentication to abort' do
|
||||
swap Devise, authentication_keys: [:subdomain] do
|
||||
sign_in_as_user
|
||||
assert_contain "Invalid subdomain or password."
|
||||
assert_not warden.authenticated?(:user)
|
||||
assert_contain "Invalid Subdomain or password."
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -610,7 +579,7 @@ class AuthenticationRequestKeysTest < Devise::IntegrationTest
|
||||
sign_in_as_user
|
||||
end
|
||||
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -619,8 +588,8 @@ class AuthenticationRequestKeysTest < Devise::IntegrationTest
|
||||
|
||||
swap Devise, request_keys: [:subdomain] do
|
||||
sign_in_as_user
|
||||
assert_contain "Invalid email or password."
|
||||
assert_not warden.authenticated?(:user)
|
||||
assert_contain "Invalid Email or password."
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -643,7 +612,7 @@ class AuthenticationSignOutViaTest < Devise::IntegrationTest
|
||||
test 'allow sign out via delete when sign_out_via provides only delete' do
|
||||
sign_in!(:sign_out_via_delete)
|
||||
delete destroy_sign_out_via_delete_session_path
|
||||
assert_not warden.authenticated?(:sign_out_via_delete)
|
||||
refute warden.authenticated?(:sign_out_via_delete)
|
||||
end
|
||||
|
||||
test 'do not allow sign out via get when sign_out_via provides only delete' do
|
||||
@@ -657,7 +626,7 @@ class AuthenticationSignOutViaTest < Devise::IntegrationTest
|
||||
test 'allow sign out via post when sign_out_via provides only post' do
|
||||
sign_in!(:sign_out_via_post)
|
||||
post destroy_sign_out_via_post_session_path
|
||||
assert_not warden.authenticated?(:sign_out_via_post)
|
||||
refute warden.authenticated?(:sign_out_via_post)
|
||||
end
|
||||
|
||||
test 'do not allow sign out via get when sign_out_via provides only post' do
|
||||
@@ -671,13 +640,13 @@ class AuthenticationSignOutViaTest < Devise::IntegrationTest
|
||||
test 'allow sign out via delete when sign_out_via provides delete and post' do
|
||||
sign_in!(:sign_out_via_delete_or_post)
|
||||
delete destroy_sign_out_via_delete_or_post_session_path
|
||||
assert_not warden.authenticated?(:sign_out_via_delete_or_post)
|
||||
refute warden.authenticated?(:sign_out_via_delete_or_post)
|
||||
end
|
||||
|
||||
test 'allow sign out via post when sign_out_via provides delete and post' do
|
||||
sign_in!(:sign_out_via_delete_or_post)
|
||||
post destroy_sign_out_via_delete_or_post_session_path
|
||||
assert_not warden.authenticated?(:sign_out_via_delete_or_post)
|
||||
refute warden.authenticated?(:sign_out_via_delete_or_post)
|
||||
end
|
||||
|
||||
test 'do not allow sign out via get when sign_out_via provides delete and post' do
|
||||
|
||||
@@ -35,18 +35,18 @@ class ConfirmationTest < Devise::IntegrationTest
|
||||
test 'user with invalid confirmation token should not be able to confirm an account' do
|
||||
visit_user_confirmation_with_token('invalid_confirmation')
|
||||
assert_have_selector '#error_explanation'
|
||||
assert_contain /Confirmation token(.*)invalid/
|
||||
assert_contain %r{Confirmation token(.*)invalid}
|
||||
end
|
||||
|
||||
test 'user with valid confirmation token should not be able to confirm an account after the token has expired' do
|
||||
swap Devise, confirm_within: 3.days do
|
||||
user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
|
||||
assert_not user.confirmed?
|
||||
refute user.confirmed?
|
||||
visit_user_confirmation_with_token(user.raw_confirmation_token)
|
||||
|
||||
assert_have_selector '#error_explanation'
|
||||
assert_contain /needs to be confirmed within 3 days/
|
||||
assert_not user.reload.confirmed?
|
||||
assert_contain %r{needs to be confirmed within 3 days}
|
||||
refute user.reload.confirmed?
|
||||
assert_current_url "/users/confirmation?confirmation_token=#{user.raw_confirmation_token}"
|
||||
end
|
||||
end
|
||||
@@ -84,7 +84,7 @@ class ConfirmationTest < Devise::IntegrationTest
|
||||
test 'user with valid confirmation token should be able to confirm an account before the token has expired' do
|
||||
swap Devise, confirm_within: 3.days do
|
||||
user = create_user(confirm: false, confirmation_sent_at: 2.days.ago)
|
||||
assert_not user.confirmed?
|
||||
refute user.confirmed?
|
||||
visit_user_confirmation_with_token(user.raw_confirmation_token)
|
||||
|
||||
assert_contain 'Your email address has been successfully confirmed.'
|
||||
@@ -130,7 +130,7 @@ class ConfirmationTest < Devise::IntegrationTest
|
||||
sign_in_as_user(confirm: false)
|
||||
|
||||
assert_contain 'You have to confirm your email address before continuing'
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -140,8 +140,8 @@ class ConfirmationTest < Devise::IntegrationTest
|
||||
fill_in 'password', with: 'invalid'
|
||||
end
|
||||
|
||||
assert_contain 'Invalid email or password'
|
||||
assert_not warden.authenticated?(:user)
|
||||
assert_contain 'Invalid Email or password'
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -284,7 +284,7 @@ class ConfirmationOnChangeTest < Devise::IntegrationTest
|
||||
assert_contain 'Your email address has been successfully confirmed.'
|
||||
assert_current_url '/admin_area/sign_in'
|
||||
assert admin.reload.confirmed?
|
||||
assert_not admin.reload.pending_reconfirmation?
|
||||
refute admin.reload.pending_reconfirmation?
|
||||
end
|
||||
|
||||
test 'admin with previously valid confirmation token should not be able to confirm email after email changed again' do
|
||||
@@ -306,7 +306,7 @@ class ConfirmationOnChangeTest < Devise::IntegrationTest
|
||||
assert_contain 'Your email address has been successfully confirmed.'
|
||||
assert_current_url '/admin_area/sign_in'
|
||||
assert admin.reload.confirmed?
|
||||
assert_not admin.reload.pending_reconfirmation?
|
||||
refute admin.reload.pending_reconfirmation?
|
||||
end
|
||||
|
||||
test 'admin email should be unique also within unconfirmed_email' do
|
||||
|
||||
@@ -19,7 +19,7 @@ class DatabaseAuthenticationTest < Devise::IntegrationTest
|
||||
fill_in 'email', with: 'foo@bar.com'
|
||||
end
|
||||
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -41,14 +41,14 @@ class DatabaseAuthenticationTest < Devise::IntegrationTest
|
||||
fill_in 'email', with: ' foo@bar.com '
|
||||
end
|
||||
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
test 'sign in should not authenticate if not using proper authentication keys' do
|
||||
swap Devise, authentication_keys: [:username] do
|
||||
sign_in_as_user
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -59,7 +59,7 @@ class DatabaseAuthenticationTest < Devise::IntegrationTest
|
||||
end
|
||||
|
||||
assert_contain 'Invalid email address'
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -68,8 +68,8 @@ class DatabaseAuthenticationTest < Devise::IntegrationTest
|
||||
fill_in 'password', with: 'abcdef'
|
||||
end
|
||||
|
||||
assert_contain 'Invalid email or password'
|
||||
assert_not warden.authenticated?(:admin)
|
||||
assert_contain 'Invalid Email or password'
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
|
||||
test 'error message is configurable by resource name' do
|
||||
|
||||
@@ -11,13 +11,15 @@ class HttpAuthenticationTest < Devise::IntegrationTest
|
||||
end
|
||||
|
||||
test 'sign in should authenticate with http' do
|
||||
sign_in_as_new_user_with_http
|
||||
assert_response 200
|
||||
assert_match '<email>user@test.com</email>', response.body
|
||||
assert warden.authenticated?(:user)
|
||||
swap Devise, skip_session_storage: [] do
|
||||
sign_in_as_new_user_with_http
|
||||
assert_response 200
|
||||
assert_match '<email>user@test.com</email>', response.body
|
||||
assert warden.authenticated?(:user)
|
||||
|
||||
get users_path(format: :xml)
|
||||
assert_response 200
|
||||
get users_path(format: :xml)
|
||||
assert_response 200
|
||||
end
|
||||
end
|
||||
|
||||
test 'sign in should authenticate with http but not emit a cookie if skipping session storage' do
|
||||
@@ -42,7 +44,7 @@ class HttpAuthenticationTest < Devise::IntegrationTest
|
||||
sign_in_as_new_user_with_http("unknown")
|
||||
assert_equal 401, status
|
||||
assert_equal "application/xml; charset=utf-8", headers["Content-Type"]
|
||||
assert_match "<error>Invalid email or password.</error>", response.body
|
||||
assert_match "<error>Invalid Email or password.</error>", response.body
|
||||
end
|
||||
|
||||
test 'returns a custom response with www-authenticate and chosen realm' do
|
||||
@@ -63,7 +65,7 @@ class HttpAuthenticationTest < Devise::IntegrationTest
|
||||
end
|
||||
|
||||
test 'it uses appropriate authentication_keys when configured with hash' do
|
||||
swap Devise, authentication_keys: ActiveSupport::OrderedHash[:username, false, :email, false] do
|
||||
swap Devise, authentication_keys: { username: false, email: false } do
|
||||
sign_in_as_new_user_with_http("usertest")
|
||||
assert_response :success
|
||||
assert_match '<email>user@test.com</email>', response.body
|
||||
@@ -72,7 +74,7 @@ class HttpAuthenticationTest < Devise::IntegrationTest
|
||||
end
|
||||
|
||||
test 'it uses the appropriate key when configured explicitly' do
|
||||
swap Devise, authentication_keys: ActiveSupport::OrderedHash[:email, false, :username, false], http_authentication_key: :username do
|
||||
swap Devise, authentication_keys: { email: false, username: false }, http_authentication_key: :username do
|
||||
sign_in_as_new_user_with_http("usertest")
|
||||
assert_response :success
|
||||
assert_match '<email>user@test.com</email>', response.body
|
||||
|
||||
@@ -75,7 +75,7 @@ class LockTest < Devise::IntegrationTest
|
||||
assert_response :success
|
||||
assert_current_url '/users/unlock?unlock_token=invalid_token'
|
||||
assert_have_selector '#error_explanation'
|
||||
assert_contain /Unlock token(.*)invalid/
|
||||
assert_contain %r{Unlock token(.*)invalid}
|
||||
end
|
||||
|
||||
test "locked user should be able to unlock account" do
|
||||
@@ -85,7 +85,7 @@ class LockTest < Devise::IntegrationTest
|
||||
|
||||
assert_current_url "/users/sign_in"
|
||||
assert_contain 'Your account has been unlocked successfully. Please sign in to continue.'
|
||||
assert_not user.reload.access_locked?
|
||||
refute user.reload.access_locked?
|
||||
end
|
||||
|
||||
test "user should not send a new e-mail if already locked" do
|
||||
|
||||
36
test/integration/mounted_engine_test.rb
Normal file
36
test/integration/mounted_engine_test.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
require 'test_helper'
|
||||
|
||||
class MyMountableEngine
|
||||
def self.call(env)
|
||||
['200', { 'Content-Type' => 'text/html' }, ['Rendered content of MyMountableEngine']]
|
||||
end
|
||||
end
|
||||
|
||||
# If disable_clear_and_finalize is set to true, Rails will not clear other routes when calling
|
||||
# again the draw method. Look at the source code at:
|
||||
# http://www.rubydoc.info/docs/rails/ActionDispatch/Routing/RouteSet:draw
|
||||
Rails.application.routes.disable_clear_and_finalize = true
|
||||
|
||||
Rails.application.routes.draw do
|
||||
authenticate(:user) do
|
||||
mount MyMountableEngine, at: '/mountable_engine'
|
||||
end
|
||||
end
|
||||
|
||||
class AuthenticatedMountedEngineTest < Devise::IntegrationTest
|
||||
test 'redirects to the sign in page when not authenticated' do
|
||||
get '/mountable_engine'
|
||||
follow_redirect!
|
||||
|
||||
assert_response :ok
|
||||
assert_contain 'You need to sign in or sign up before continuing.'
|
||||
end
|
||||
|
||||
test 'renders the mounted engine when authenticated' do
|
||||
sign_in_as_user
|
||||
get '/mountable_engine'
|
||||
|
||||
assert_response :success
|
||||
assert_contain 'Rendered content of MyMountableEngine'
|
||||
end
|
||||
end
|
||||
@@ -71,7 +71,7 @@ class OmniauthableIntegrationTest < Devise::IntegrationTest
|
||||
assert_current_url "/"
|
||||
assert_contain "You have signed up successfully."
|
||||
assert_contain "Hello User user@example.com"
|
||||
assert_not session["devise.facebook_data"]
|
||||
refute session["devise.facebook_data"]
|
||||
end
|
||||
|
||||
test "cleans up session on cancel" do
|
||||
|
||||
@@ -10,7 +10,7 @@ class PasswordTest < Devise::IntegrationTest
|
||||
def request_forgot_password(&block)
|
||||
visit_new_password_path
|
||||
assert_response :success
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
fill_in 'email', with: 'user@test.com'
|
||||
yield if block_given?
|
||||
@@ -146,8 +146,8 @@ class PasswordTest < Devise::IntegrationTest
|
||||
assert_response :success
|
||||
assert_current_url '/users/password'
|
||||
assert_have_selector '#error_explanation'
|
||||
assert_contain /Reset password token(.*)invalid/
|
||||
assert_not user.reload.valid_password?('987654321')
|
||||
assert_contain %r{Reset password token(.*)invalid}
|
||||
refute user.reload.valid_password?('987654321')
|
||||
end
|
||||
|
||||
test 'not authenticated user with valid reset password token but invalid password should not be able to change their password' do
|
||||
@@ -161,7 +161,7 @@ class PasswordTest < Devise::IntegrationTest
|
||||
assert_current_url '/users/password'
|
||||
assert_have_selector '#error_explanation'
|
||||
assert_contain "Password confirmation doesn't match Password"
|
||||
assert_not user.reload.valid_password?('987654321')
|
||||
refute user.reload.valid_password?('987654321')
|
||||
end
|
||||
|
||||
test 'not authenticated user with valid data should be able to change their password' do
|
||||
@@ -181,7 +181,7 @@ class PasswordTest < Devise::IntegrationTest
|
||||
reset_password { fill_in 'Confirm new password', with: 'other_password' }
|
||||
assert_response :success
|
||||
assert_have_selector '#error_explanation'
|
||||
assert_not user.reload.valid_password?('987654321')
|
||||
refute user.reload.valid_password?('987654321')
|
||||
|
||||
reset_password visit: false
|
||||
assert_contain 'Your password has been changed successfully.'
|
||||
@@ -212,7 +212,7 @@ class PasswordTest < Devise::IntegrationTest
|
||||
test 'does not sign in user automatically after changing its password if it\'s locked and unlock strategy is :none or :time' do
|
||||
[:none, :time].each do |strategy|
|
||||
swap Devise, unlock_strategy: strategy do
|
||||
user = create_user(locked: true)
|
||||
create_user(locked: true)
|
||||
request_forgot_password
|
||||
reset_password
|
||||
|
||||
|
||||
@@ -64,11 +64,11 @@ class RegistrationTest < Devise::IntegrationTest
|
||||
assert_not_contain 'You have to confirm your account before continuing'
|
||||
assert_current_url "/"
|
||||
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
user = User.to_adapter.find_first(order: [:id, :desc])
|
||||
assert_equal user.email, 'new_user@test.com'
|
||||
assert_not user.confirmed?
|
||||
refute user.confirmed?
|
||||
end
|
||||
|
||||
test 'a guest user should receive the confirmation instructions from the default mailer' do
|
||||
@@ -92,7 +92,7 @@ class RegistrationTest < Devise::IntegrationTest
|
||||
click_button 'Sign up'
|
||||
|
||||
assert_current_url "/?custom=1"
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'a guest user cannot sign up with invalid information' do
|
||||
@@ -114,7 +114,7 @@ class RegistrationTest < Devise::IntegrationTest
|
||||
assert_contain "2 errors prohibited"
|
||||
assert_nil User.to_adapter.find_first
|
||||
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'a guest should not sign up with email/password that already exists' do
|
||||
@@ -133,7 +133,7 @@ class RegistrationTest < Devise::IntegrationTest
|
||||
assert_current_url '/users'
|
||||
assert_contain(/Email.*already.*taken/)
|
||||
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'a guest should not be able to change account' do
|
||||
@@ -217,7 +217,13 @@ class RegistrationTest < Devise::IntegrationTest
|
||||
click_button 'Update'
|
||||
|
||||
assert_contain "Password confirmation doesn't match Password"
|
||||
assert_not User.to_adapter.find_first.valid_password?('pas123')
|
||||
refute User.to_adapter.find_first.valid_password?('pas123')
|
||||
end
|
||||
|
||||
test 'a signed in user should see a warning about minimum password length' do
|
||||
sign_in_as_user
|
||||
get edit_user_registration_path
|
||||
assert_contain 'characters minimum'
|
||||
end
|
||||
|
||||
test 'a signed in user should be able to cancel their account' do
|
||||
|
||||
@@ -33,12 +33,12 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
test 'handle unverified requests gets rid of caches' do
|
||||
swap ApplicationController, allow_forgery_protection: true do
|
||||
post exhibit_user_url(1)
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
|
||||
create_user_and_remember
|
||||
post exhibit_user_url(1)
|
||||
assert_equal "User is not authenticated", response.body
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -51,8 +51,8 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
authenticity_token: "oops",
|
||||
user: { email: "jose.valim@gmail.com", password: "123456", remember_me: "1" }
|
||||
}
|
||||
assert_not warden.authenticated?(:user)
|
||||
assert_not request.cookies['remember_user_token']
|
||||
refute warden.authenticated?(:user)
|
||||
refute request.cookies['remember_user_token']
|
||||
end
|
||||
end
|
||||
|
||||
@@ -121,7 +121,7 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
|
||||
test 'extends remember period when extend remember period config is true' do
|
||||
swap Devise, extend_remember_period: true, remember_for: 1.year do
|
||||
user = create_user_and_remember
|
||||
create_user_and_remember
|
||||
old_remember_token = nil
|
||||
|
||||
travel_to 1.day.ago do
|
||||
@@ -138,7 +138,7 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
|
||||
test 'does not extend remember period when extend period config is false' do
|
||||
swap Devise, extend_remember_period: false, remember_for: 1.year do
|
||||
user = create_user_and_remember
|
||||
create_user_and_remember
|
||||
old_remember_token = nil
|
||||
|
||||
travel_to 1.day.ago do
|
||||
@@ -158,13 +158,13 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
get root_path
|
||||
assert_response :success
|
||||
assert warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
|
||||
test 'do not remember with invalid token' do
|
||||
create_user_and_remember('add')
|
||||
get users_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
assert_redirected_to new_user_session_path
|
||||
end
|
||||
|
||||
@@ -172,7 +172,7 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
create_user_and_remember
|
||||
swap Devise, remember_for: 0.days do
|
||||
get users_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
assert_redirected_to new_user_session_path
|
||||
end
|
||||
end
|
||||
@@ -182,12 +182,12 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
get users_path
|
||||
assert warden.authenticated?(:user)
|
||||
|
||||
get destroy_user_session_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
delete destroy_user_session_path
|
||||
refute warden.authenticated?(:user)
|
||||
assert_nil warden.cookies['remember_user_token']
|
||||
|
||||
get users_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'changing user password expires remember me token' do
|
||||
@@ -197,7 +197,7 @@ class RememberMeTest < Devise::IntegrationTest
|
||||
user.save!
|
||||
|
||||
get users_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'valid sign in calls after_remembered callback' do
|
||||
|
||||
@@ -56,7 +56,7 @@ class SessionTimeoutTest < Devise::IntegrationTest
|
||||
|
||||
get users_path
|
||||
assert_redirected_to users_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
assert warden.authenticated?(:admin)
|
||||
end
|
||||
end
|
||||
@@ -70,8 +70,8 @@ class SessionTimeoutTest < Devise::IntegrationTest
|
||||
assert_not_nil last_request_at
|
||||
|
||||
get root_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
assert_not warden.authenticated?(:admin)
|
||||
refute warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:admin)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -89,7 +89,7 @@ class SessionTimeoutTest < Devise::IntegrationTest
|
||||
user = sign_in_as_user
|
||||
get expire_user_path(user)
|
||||
|
||||
get destroy_user_session_path
|
||||
delete destroy_user_session_path
|
||||
|
||||
assert_response :redirect
|
||||
assert_redirected_to root_path
|
||||
@@ -108,7 +108,7 @@ class SessionTimeoutTest < Devise::IntegrationTest
|
||||
|
||||
assert_response :success
|
||||
assert_contain 'Sign in'
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test 'time out is not triggered on sign in' do
|
||||
@@ -134,7 +134,7 @@ class SessionTimeoutTest < Devise::IntegrationTest
|
||||
get expire_user_path(user)
|
||||
get users_path
|
||||
assert_redirected_to users_path
|
||||
assert_not warden.authenticated?(:user)
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class TrackableHooksTest < Devise::IntegrationTest
|
||||
assert_equal user.current_sign_in_at, user.last_sign_in_at
|
||||
assert user.current_sign_in_at >= user.created_at
|
||||
|
||||
visit destroy_user_session_path
|
||||
delete destroy_user_session_path
|
||||
new_time = 2.seconds.from_now
|
||||
Time.stubs(:now).returns(new_time)
|
||||
|
||||
@@ -56,7 +56,7 @@ class TrackableHooksTest < Devise::IntegrationTest
|
||||
user.reload
|
||||
assert_equal 1, user.sign_in_count
|
||||
|
||||
visit destroy_user_session_path
|
||||
delete destroy_user_session_path
|
||||
sign_in_as_user
|
||||
user.reload
|
||||
assert_equal 2, user.sign_in_count
|
||||
@@ -80,7 +80,7 @@ class TrackableHooksTest < Devise::IntegrationTest
|
||||
end
|
||||
user.reload
|
||||
assert_equal 0, user.sign_in_count
|
||||
visit destroy_user_session_path
|
||||
delete destroy_user_session_path
|
||||
|
||||
sign_in_as_user do
|
||||
header 'devise.skip_trackable', false
|
||||
|
||||
@@ -35,8 +35,8 @@ class MappingTest < ActiveSupport::TestCase
|
||||
assert_equal [], Devise.mappings[:skip_admin].used_routes
|
||||
end
|
||||
|
||||
test 'sign_out_via defaults to :get' do
|
||||
assert_equal :get, Devise.mappings[:user].sign_out_via
|
||||
test 'sign_out_via defaults to :delete' do
|
||||
assert_equal :delete, Devise.mappings[:user].sign_out_via
|
||||
end
|
||||
|
||||
test 'allows custom sign_out_via to be given' do
|
||||
@@ -115,7 +115,7 @@ class MappingTest < ActiveSupport::TestCase
|
||||
assert mapping.authenticatable?
|
||||
assert mapping.recoverable?
|
||||
assert mapping.lockable?
|
||||
assert_not mapping.omniauthable?
|
||||
refute mapping.omniauthable?
|
||||
end
|
||||
|
||||
test 'find mapping by path' do
|
||||
|
||||
@@ -28,9 +28,9 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test 'should verify whether a user is confirmed or not' do
|
||||
assert_not new_user.confirmed?
|
||||
refute new_user.confirmed?
|
||||
user = create_user
|
||||
assert_not user.confirmed?
|
||||
refute user.confirmed?
|
||||
user.confirm
|
||||
assert user.confirmed?
|
||||
end
|
||||
@@ -40,7 +40,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
assert user.confirm
|
||||
assert_blank user.errors[:email]
|
||||
|
||||
assert_not user.confirm
|
||||
refute user.confirm
|
||||
assert_equal "was already confirmed, please try signing in", user.errors[:email].join
|
||||
end
|
||||
|
||||
@@ -54,13 +54,13 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should return a new record with errors when a invalid token is given' do
|
||||
confirmed_user = User.confirm_by_token('invalid_confirmation_token')
|
||||
assert_not confirmed_user.persisted?
|
||||
refute confirmed_user.persisted?
|
||||
assert_equal "is invalid", confirmed_user.errors[:confirmation_token].join
|
||||
end
|
||||
|
||||
test 'should return a new record with errors when a blank token is given' do
|
||||
confirmed_user = User.confirm_by_token('')
|
||||
assert_not confirmed_user.persisted?
|
||||
refute confirmed_user.persisted?
|
||||
assert_equal "can't be blank", confirmed_user.errors[:confirmation_token].join
|
||||
end
|
||||
|
||||
@@ -114,7 +114,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
|
||||
assert_email_not_sent do
|
||||
user.save!
|
||||
assert !user.confirmed?
|
||||
refute user.confirmed?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -134,7 +134,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should return a new user if no email was found' do
|
||||
confirmation_user = User.send_confirmation_instructions(email: "invalid@example.com")
|
||||
assert_not confirmation_user.persisted?
|
||||
refute confirmation_user.persisted?
|
||||
end
|
||||
|
||||
test 'should add error to new user email if no email was found' do
|
||||
@@ -181,7 +181,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
test 'should not be able to send instructions if the user is already confirmed' do
|
||||
user = create_user
|
||||
user.confirm
|
||||
assert_not user.resend_confirmation_instructions
|
||||
refute user.resend_confirmation_instructions
|
||||
assert user.confirmed?
|
||||
assert_equal 'was already confirmed, please try signing in', user.errors[:email].join
|
||||
end
|
||||
@@ -190,7 +190,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
swap Devise, allow_unconfirmed_access_for: 1.day do
|
||||
user = create_user
|
||||
user.confirmation_sent_at = 2.days.ago
|
||||
assert_not user.active_for_authentication?
|
||||
refute user.active_for_authentication?
|
||||
|
||||
Devise.allow_unconfirmed_access_for = 3.days
|
||||
assert user.active_for_authentication?
|
||||
@@ -206,14 +206,14 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
assert user.active_for_authentication?
|
||||
|
||||
user.confirmation_sent_at = 5.days.ago
|
||||
assert_not user.active_for_authentication?
|
||||
refute user.active_for_authentication?
|
||||
end
|
||||
end
|
||||
|
||||
test 'should be active when already confirmed' do
|
||||
user = create_user
|
||||
assert_not user.confirmed?
|
||||
assert_not user.active_for_authentication?
|
||||
refute user.confirmed?
|
||||
refute user.active_for_authentication?
|
||||
|
||||
user.confirm
|
||||
assert user.confirmed?
|
||||
@@ -224,7 +224,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
Devise.allow_unconfirmed_access_for = 0.days
|
||||
user = create_user
|
||||
user.confirmation_sent_at = Time.zone.today
|
||||
assert_not user.active_for_authentication?
|
||||
refute user.active_for_authentication?
|
||||
end
|
||||
|
||||
test 'should be active when we set allow_unconfirmed_access_for to nil' do
|
||||
@@ -239,7 +239,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
user = create_user
|
||||
user.confirmation_sent_at = nil
|
||||
user.save
|
||||
assert_not user.reload.active_for_authentication?
|
||||
refute user.reload.active_for_authentication?
|
||||
end
|
||||
|
||||
test 'should be active without confirmation when confirmation is not required' do
|
||||
@@ -272,7 +272,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
swap Devise, confirmation_keys: [:username, :email] do
|
||||
user = create_user
|
||||
confirm_user = User.send_confirmation_instructions(email: user.email)
|
||||
assert_not confirm_user.persisted?
|
||||
refute confirm_user.persisted?
|
||||
assert_equal "can't be blank", confirm_user.errors[:username].join
|
||||
end
|
||||
end
|
||||
@@ -297,7 +297,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should not accept confirmation email token after 4 days when expiration is set to 3 days' do
|
||||
swap Devise, confirm_within: 3.days do
|
||||
assert_not confirm_user_by_token_with_confirmation_sent_at(4.days.ago)
|
||||
refute confirm_user_by_token_with_confirmation_sent_at(4.days.ago)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -337,14 +337,14 @@ class ConfirmableTest < ActiveSupport::TestCase
|
||||
self.username = self.username.to_s + 'updated'
|
||||
end
|
||||
old = user.username
|
||||
assert_not user.confirm
|
||||
refute user.confirm
|
||||
assert_equal user.username, old
|
||||
end
|
||||
|
||||
test 'should always perform validations upon confirm when ensure valid true' do
|
||||
admin = create_admin
|
||||
admin.stubs(:valid?).returns(false)
|
||||
assert_not admin.confirm(ensure_valid: true)
|
||||
refute admin.confirm(ensure_valid: true)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -370,7 +370,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
||||
admin.skip_reconfirmation!
|
||||
assert admin.update_attributes(email: 'new_test@example.com')
|
||||
assert admin.confirmed?
|
||||
assert_not admin.pending_reconfirmation?
|
||||
refute admin.pending_reconfirmation?
|
||||
assert_equal original_token, admin.confirmation_token
|
||||
end
|
||||
|
||||
@@ -401,6 +401,14 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
||||
assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
|
||||
end
|
||||
|
||||
test 'should send confirmation instructions by email after changing email from nil' do
|
||||
admin = create_admin(email: nil)
|
||||
assert_email_sent "new_test@example.com" do
|
||||
assert admin.update_attributes(email: 'new_test@example.com')
|
||||
end
|
||||
assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
|
||||
end
|
||||
|
||||
test 'should not send confirmation by email after changing password' do
|
||||
admin = create_admin
|
||||
assert admin.confirm
|
||||
@@ -453,7 +461,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should return a new admin if no email or unconfirmed_email was found' do
|
||||
confirmation_admin = Admin.send_confirmation_instructions(email: "invalid@email.com")
|
||||
assert_not confirmation_admin.persisted?
|
||||
refute confirmation_admin.persisted?
|
||||
end
|
||||
|
||||
test 'should add error to new admin email if no email or unconfirmed_email was found' do
|
||||
@@ -471,25 +479,25 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test 'required_fields should contain the fields that Devise uses' do
|
||||
assert_same_content Devise::Models::Confirmable.required_fields(User), [
|
||||
:confirmation_sent_at,
|
||||
assert_equal Devise::Models::Confirmable.required_fields(User), [
|
||||
:confirmation_token,
|
||||
:confirmed_at
|
||||
:confirmed_at,
|
||||
:confirmation_sent_at
|
||||
]
|
||||
end
|
||||
|
||||
test 'required_fields should also contain unconfirmable when reconfirmable_email is true' do
|
||||
assert_same_content Devise::Models::Confirmable.required_fields(Admin), [
|
||||
:confirmation_sent_at,
|
||||
assert_equal Devise::Models::Confirmable.required_fields(Admin), [
|
||||
:confirmation_token,
|
||||
:confirmed_at,
|
||||
:confirmation_sent_at,
|
||||
:unconfirmed_email
|
||||
]
|
||||
end
|
||||
|
||||
test 'should not require reconfirmation after creating a record' do
|
||||
user = create_admin
|
||||
assert !user.pending_reconfirmation?
|
||||
admin = create_admin
|
||||
assert !admin.pending_reconfirmation?
|
||||
end
|
||||
|
||||
test 'should not require reconfirmation after creating a record with #save called in callback' do
|
||||
@@ -497,7 +505,15 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
||||
after_create :save
|
||||
end
|
||||
|
||||
user = Admin::WithSaveInCallback.create(valid_attributes.except(:username))
|
||||
assert !user.pending_reconfirmation?
|
||||
admin = Admin::WithSaveInCallback.create(valid_attributes.except(:username))
|
||||
assert !admin.pending_reconfirmation?
|
||||
end
|
||||
|
||||
test 'should require reconfirmation after creating a record and updating the email' do
|
||||
admin = create_admin
|
||||
assert !admin.instance_variable_get(:@bypass_confirmation_postpone)
|
||||
admin.email = "new_test@email.com"
|
||||
admin.save
|
||||
assert admin.pending_reconfirmation?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -124,7 +124,7 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
test 'should test for a valid password' do
|
||||
user = create_user
|
||||
assert user.valid_password?('12345678')
|
||||
assert_not user.valid_password?('654321')
|
||||
refute user.valid_password?('654321')
|
||||
end
|
||||
|
||||
test 'should not raise error with an empty password' do
|
||||
@@ -136,7 +136,7 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
test 'should be an invalid password if the user has an empty password' do
|
||||
user = create_user
|
||||
user.encrypted_password = ''
|
||||
assert_not user.valid_password?('654321')
|
||||
refute user.valid_password?('654321')
|
||||
end
|
||||
|
||||
test 'should respond to current password' do
|
||||
@@ -152,7 +152,7 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should add an error to current password when it is invalid' do
|
||||
user = create_user
|
||||
assert_not user.update_with_password(current_password: 'other',
|
||||
refute user.update_with_password(current_password: 'other',
|
||||
password: 'pass4321', password_confirmation: 'pass4321')
|
||||
assert user.reload.valid_password?('12345678')
|
||||
assert_match "is invalid", user.errors[:current_password].join
|
||||
@@ -160,7 +160,7 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should add an error to current password when it is blank' do
|
||||
user = create_user
|
||||
assert_not user.update_with_password(password: 'pass4321',
|
||||
refute user.update_with_password(password: 'pass4321',
|
||||
password_confirmation: 'pass4321')
|
||||
assert user.reload.valid_password?('12345678')
|
||||
assert_match "can't be blank", user.errors[:current_password].join
|
||||
@@ -170,7 +170,7 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
user = UserWithValidation.create!(valid_attributes)
|
||||
user.save
|
||||
assert user.persisted?
|
||||
assert_not user.update_with_password(username: "")
|
||||
refute user.update_with_password(username: "")
|
||||
assert_match "usertest", user.reload.username
|
||||
assert_match "can't be blank", user.errors[:username].join
|
||||
end
|
||||
@@ -183,14 +183,14 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should not update password with invalid confirmation' do
|
||||
user = create_user
|
||||
assert_not user.update_with_password(current_password: '12345678',
|
||||
refute user.update_with_password(current_password: '12345678',
|
||||
password: 'pass4321', password_confirmation: 'other')
|
||||
assert user.reload.valid_password?('12345678')
|
||||
end
|
||||
|
||||
test 'should clean up password fields on failure' do
|
||||
user = create_user
|
||||
assert_not user.update_with_password(current_password: '12345678',
|
||||
refute user.update_with_password(current_password: '12345678',
|
||||
password: 'pass4321', password_confirmation: 'other')
|
||||
assert user.password.blank?
|
||||
assert user.password_confirmation.blank?
|
||||
@@ -217,14 +217,14 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should not destroy user with invalid password' do
|
||||
user = create_user
|
||||
assert_not user.destroy_with_password('other')
|
||||
refute user.destroy_with_password('other')
|
||||
assert user.persisted?
|
||||
assert_match "is invalid", user.errors[:current_password].join
|
||||
end
|
||||
|
||||
test 'should not destroy user with blank password' do
|
||||
user = create_user
|
||||
assert_not user.destroy_with_password(nil)
|
||||
refute user.destroy_with_password(nil)
|
||||
assert user.persisted?
|
||||
assert_match "can't be blank", user.errors[:current_password].join
|
||||
end
|
||||
@@ -252,15 +252,15 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test 'required_fields should be encryptable_password and the email field by default' do
|
||||
assert_same_content Devise::Models::DatabaseAuthenticatable.required_fields(User), [
|
||||
:email,
|
||||
:encrypted_password
|
||||
assert_equal Devise::Models::DatabaseAuthenticatable.required_fields(User), [
|
||||
:encrypted_password,
|
||||
:email
|
||||
]
|
||||
end
|
||||
|
||||
test 'required_fields should be encryptable_password and the login when the login is on authentication_keys' do
|
||||
swap Devise, authentication_keys: [:login] do
|
||||
assert_same_content Devise::Models::DatabaseAuthenticatable.required_fields(User), [
|
||||
assert_equal Devise::Models::DatabaseAuthenticatable.required_fields(User), [
|
||||
:encrypted_password,
|
||||
:login
|
||||
]
|
||||
|
||||
@@ -46,7 +46,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
|
||||
test "should verify whether a user is locked or not" do
|
||||
user = create_user
|
||||
assert_not user.access_locked?
|
||||
refute user.access_locked?
|
||||
user.lock_access!
|
||||
assert user.access_locked?
|
||||
end
|
||||
@@ -56,7 +56,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
user.confirm
|
||||
assert user.active_for_authentication?
|
||||
user.lock_access!
|
||||
assert_not user.active_for_authentication?
|
||||
refute user.active_for_authentication?
|
||||
end
|
||||
|
||||
test "should unlock a user by cleaning locked_at, failed_attempts and unlock_token" do
|
||||
@@ -72,7 +72,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test "new user should not be locked and should have zero failed_attempts" do
|
||||
assert_not new_user.access_locked?
|
||||
refute new_user.access_locked?
|
||||
assert_equal 0, create_user.failed_attempts
|
||||
end
|
||||
|
||||
@@ -83,7 +83,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
assert user.access_locked?
|
||||
|
||||
Devise.unlock_in = 1.hour
|
||||
assert_not user.access_locked?
|
||||
refute user.access_locked?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -162,18 +162,18 @@ class LockableTest < ActiveSupport::TestCase
|
||||
raw = user.send_unlock_instructions
|
||||
locked_user = User.unlock_access_by_token(raw)
|
||||
assert_equal locked_user, user
|
||||
assert_not user.reload.access_locked?
|
||||
refute user.reload.access_locked?
|
||||
end
|
||||
|
||||
test 'should return a new record with errors when a invalid token is given' do
|
||||
locked_user = User.unlock_access_by_token('invalid_token')
|
||||
assert_not locked_user.persisted?
|
||||
refute locked_user.persisted?
|
||||
assert_equal "is invalid", locked_user.errors[:unlock_token].join
|
||||
end
|
||||
|
||||
test 'should return a new record with errors when a blank token is given' do
|
||||
locked_user = User.unlock_access_by_token('')
|
||||
assert_not locked_user.persisted?
|
||||
refute locked_user.persisted?
|
||||
assert_equal "can't be blank", locked_user.errors[:unlock_token].join
|
||||
end
|
||||
|
||||
@@ -186,7 +186,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should return a new user if no email was found' do
|
||||
unlock_user = User.send_unlock_instructions(email: "invalid@example.com")
|
||||
assert_not unlock_user.persisted?
|
||||
refute unlock_user.persisted?
|
||||
end
|
||||
|
||||
test 'should add error to new user email if no email was found' do
|
||||
@@ -206,23 +206,23 @@ class LockableTest < ActiveSupport::TestCase
|
||||
swap Devise, unlock_keys: [:username, :email] do
|
||||
user = create_user
|
||||
unlock_user = User.send_unlock_instructions(email: user.email)
|
||||
assert_not unlock_user.persisted?
|
||||
refute unlock_user.persisted?
|
||||
assert_equal "can't be blank", unlock_user.errors[:username].join
|
||||
end
|
||||
end
|
||||
|
||||
test 'should not be able to send instructions if the user is not locked' do
|
||||
user = create_user
|
||||
assert_not user.resend_unlock_instructions
|
||||
assert_not user.access_locked?
|
||||
refute user.resend_unlock_instructions
|
||||
refute user.access_locked?
|
||||
assert_equal 'was not locked', user.errors[:email].join
|
||||
end
|
||||
|
||||
test 'should not be able to send instructions if the user if not locked and have username as unlock key' do
|
||||
swap Devise, unlock_keys: [:username] do
|
||||
user = create_user
|
||||
assert_not user.resend_unlock_instructions
|
||||
assert_not user.access_locked?
|
||||
refute user.resend_unlock_instructions
|
||||
refute user.access_locked?
|
||||
assert_equal 'was not locked', user.errors[:username].join
|
||||
end
|
||||
end
|
||||
@@ -257,7 +257,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
test 'required_fields should contain the all the fields when all the strategies are enabled' do
|
||||
swap Devise, unlock_strategy: :both do
|
||||
swap Devise, lock_strategy: :failed_attempts do
|
||||
assert_same_content Devise::Models::Lockable.required_fields(User), [
|
||||
assert_equal Devise::Models::Lockable.required_fields(User), [
|
||||
:failed_attempts,
|
||||
:locked_at,
|
||||
:unlock_token
|
||||
@@ -269,7 +269,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
test 'required_fields should contain only failed_attempts and locked_at when the strategies are time and failed_attempts are enabled' do
|
||||
swap Devise, unlock_strategy: :time do
|
||||
swap Devise, lock_strategy: :failed_attempts do
|
||||
assert_same_content Devise::Models::Lockable.required_fields(User), [
|
||||
assert_equal Devise::Models::Lockable.required_fields(User), [
|
||||
:failed_attempts,
|
||||
:locked_at
|
||||
]
|
||||
@@ -280,7 +280,7 @@ class LockableTest < ActiveSupport::TestCase
|
||||
test 'required_fields should contain only failed_attempts and unlock_token when the strategies are token and failed_attempts are enabled' do
|
||||
swap Devise, unlock_strategy: :email do
|
||||
swap Devise, lock_strategy: :failed_attempts do
|
||||
assert_same_content Devise::Models::Lockable.required_fields(User), [
|
||||
assert_equal Devise::Models::Lockable.required_fields(User), [
|
||||
:failed_attempts,
|
||||
:unlock_token
|
||||
]
|
||||
@@ -325,4 +325,26 @@ class LockableTest < ActiveSupport::TestCase
|
||||
user.lock_access!
|
||||
assert_equal :locked, user.unauthenticated_message
|
||||
end
|
||||
|
||||
test 'unlock_strategy_enabled? should return true for both, email, and time strategies if :both is used' do
|
||||
swap Devise, unlock_strategy: :both do
|
||||
user = create_user
|
||||
assert_equal true, user.unlock_strategy_enabled?(:both)
|
||||
assert_equal true, user.unlock_strategy_enabled?(:time)
|
||||
assert_equal true, user.unlock_strategy_enabled?(:email)
|
||||
assert_equal false, user.unlock_strategy_enabled?(:none)
|
||||
assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
|
||||
end
|
||||
end
|
||||
|
||||
test 'unlock_strategy_enabled? should return true only for the configured strategy' do
|
||||
swap Devise, unlock_strategy: :email do
|
||||
user = create_user
|
||||
assert_equal false, user.unlock_strategy_enabled?(:both)
|
||||
assert_equal false, user.unlock_strategy_enabled?(:time)
|
||||
assert_equal true, user.unlock_strategy_enabled?(:email)
|
||||
assert_equal false, user.unlock_strategy_enabled?(:none)
|
||||
assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,6 +2,6 @@ require 'test_helper'
|
||||
|
||||
class OmniauthableTest < ActiveSupport::TestCase
|
||||
test 'required_fields should contain the fields that Devise uses' do
|
||||
assert_same_content Devise::Models::Omniauthable.required_fields(User), []
|
||||
assert_equal Devise::Models::Omniauthable.required_fields(User), []
|
||||
end
|
||||
end
|
||||
|
||||
@@ -92,14 +92,14 @@ class RecoverableTest < ActiveSupport::TestCase
|
||||
user = create_user
|
||||
user.send_reset_password_instructions
|
||||
assert_present user.reset_password_token
|
||||
assert_not user.reset_password('123456789', '987654321')
|
||||
refute user.reset_password('123456789', '987654321')
|
||||
assert_present user.reset_password_token
|
||||
end
|
||||
|
||||
test 'should not reset password with invalid data' do
|
||||
user = create_user
|
||||
user.stubs(:valid?).returns(false)
|
||||
assert_not user.reset_password('123456789', '987654321')
|
||||
refute user.reset_password('123456789', '987654321')
|
||||
end
|
||||
|
||||
test 'should reset reset password token and send instructions by email' do
|
||||
@@ -119,7 +119,7 @@ class RecoverableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should return a new record with errors if user was not found by e-mail' do
|
||||
reset_password_user = User.send_reset_password_instructions(email: "invalid@example.com")
|
||||
assert_not reset_password_user.persisted?
|
||||
refute reset_password_user.persisted?
|
||||
assert_equal "not found", reset_password_user.errors[:email].join
|
||||
end
|
||||
|
||||
@@ -135,7 +135,7 @@ class RecoverableTest < ActiveSupport::TestCase
|
||||
swap Devise, reset_password_keys: [:username, :email] do
|
||||
user = create_user
|
||||
reset_password_user = User.send_reset_password_instructions(email: user.email)
|
||||
assert_not reset_password_user.persisted?
|
||||
refute reset_password_user.persisted?
|
||||
assert_equal "can't be blank", reset_password_user.errors[:username].join
|
||||
end
|
||||
end
|
||||
@@ -164,13 +164,13 @@ class RecoverableTest < ActiveSupport::TestCase
|
||||
|
||||
test 'should return a new record with errors if no reset_password_token is found' do
|
||||
reset_password_user = User.reset_password_by_token(reset_password_token: 'invalid_token')
|
||||
assert_not reset_password_user.persisted?
|
||||
refute reset_password_user.persisted?
|
||||
assert_equal "is invalid", reset_password_user.errors[:reset_password_token].join
|
||||
end
|
||||
|
||||
test 'should return a new record with errors if reset_password_token is blank' do
|
||||
reset_password_user = User.reset_password_by_token(reset_password_token: '')
|
||||
assert_not reset_password_user.persisted?
|
||||
refute reset_password_user.persisted?
|
||||
assert_match "can't be blank", reset_password_user.errors[:reset_password_token].join
|
||||
end
|
||||
|
||||
@@ -179,7 +179,7 @@ class RecoverableTest < ActiveSupport::TestCase
|
||||
raw = user.send_reset_password_instructions
|
||||
|
||||
reset_password_user = User.reset_password_by_token(reset_password_token: raw, password: '')
|
||||
assert_not reset_password_user.errors.empty?
|
||||
refute reset_password_user.errors.empty?
|
||||
assert_match "can't be blank", reset_password_user.errors[:password].join
|
||||
assert_equal raw, reset_password_user.reset_password_token
|
||||
end
|
||||
@@ -197,7 +197,7 @@ class RecoverableTest < ActiveSupport::TestCase
|
||||
assert_nil reset_password_user.reset_password_token
|
||||
|
||||
user.reload
|
||||
assert_not user.valid_password?(old_password)
|
||||
refute user.valid_password?(old_password)
|
||||
assert user.valid_password?('new_password')
|
||||
assert_nil user.reset_password_token
|
||||
end
|
||||
@@ -219,13 +219,13 @@ class RecoverableTest < ActiveSupport::TestCase
|
||||
user.reload
|
||||
|
||||
assert user.valid_password?(old_password)
|
||||
assert_not user.valid_password?('new_password')
|
||||
refute user.valid_password?('new_password')
|
||||
assert_equal "has expired, please request a new one", reset_password_user.errors[:reset_password_token].join
|
||||
end
|
||||
end
|
||||
|
||||
test 'required_fields should contain the fields that Devise uses' do
|
||||
assert_same_content Devise::Models::Recoverable.required_fields(User), [
|
||||
assert_equal Devise::Models::Recoverable.required_fields(User), [
|
||||
:reset_password_sent_at,
|
||||
:reset_password_token
|
||||
]
|
||||
|
||||
@@ -2,6 +2,6 @@ require 'test_helper'
|
||||
|
||||
class RegisterableTest < ActiveSupport::TestCase
|
||||
test 'required_fields should contain the fields that Devise uses' do
|
||||
assert_same_content Devise::Models::Registerable.required_fields(User), []
|
||||
assert_equal Devise::Models::Registerable.required_fields(User), []
|
||||
end
|
||||
end
|
||||
|
||||
@@ -16,6 +16,18 @@ class RememberableTest < ActiveSupport::TestCase
|
||||
assert user.remember_created_at
|
||||
end
|
||||
|
||||
test 'remember_me should not generate a new token if valid token exists' do
|
||||
user = create_user
|
||||
user.singleton_class.send(:attr_accessor, :remember_token)
|
||||
User.to_adapter.expects(:find_first).returns(nil)
|
||||
|
||||
user.remember_me!
|
||||
existing_token = user.remember_token
|
||||
|
||||
user.remember_me!
|
||||
assert_equal existing_token, user.remember_token
|
||||
end
|
||||
|
||||
test 'forget_me should not clear remember token if using salt' do
|
||||
user = create_user
|
||||
user.remember_me!
|
||||
@@ -87,15 +99,28 @@ class RememberableTest < ActiveSupport::TestCase
|
||||
assert_nil User.serialize_from_cookie(user.to_key, "123", Time.now.utc)
|
||||
end
|
||||
|
||||
test 'raises a RuntimeError if the user does not implements a rememberable value' do
|
||||
user = User.new
|
||||
assert_raise(RuntimeError) { user.rememberable_value }
|
||||
|
||||
user_with_remember_token = User.new
|
||||
def user_with_remember_token.remember_token; '123-token'; end
|
||||
assert_equal '123-token', user_with_remember_token.rememberable_value
|
||||
|
||||
user_with_salt = User.new
|
||||
def user_with_salt.authenticatable_salt; '123-salt'; end
|
||||
assert_equal '123-salt', user_with_salt.rememberable_value
|
||||
end
|
||||
|
||||
test 'raises a RuntimeError if authenticatable_salt is nil or empty' do
|
||||
user = User.new
|
||||
def user.authenticable_salt; nil; end
|
||||
def user.authenticatable_salt; nil; end
|
||||
assert_raise RuntimeError do
|
||||
user.rememberable_value
|
||||
end
|
||||
|
||||
user = User.new
|
||||
def user.authenticable_salt; ""; end
|
||||
def user.authenticatable_salt; ""; end
|
||||
assert_raise RuntimeError do
|
||||
user.rememberable_value
|
||||
end
|
||||
@@ -150,7 +175,7 @@ class RememberableTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test 'should have the required_fields array' do
|
||||
assert_same_content Devise::Models::Rememberable.required_fields(User), [
|
||||
assert_equal Devise::Models::Rememberable.required_fields(User), [
|
||||
:remember_created_at
|
||||
]
|
||||
end
|
||||
|
||||
@@ -35,6 +35,11 @@ class SerializableTest < ActiveSupport::TestCase
|
||||
assert_key "confirmation_token", from_json(force_except: :email)
|
||||
end
|
||||
|
||||
test 'should not include unsafe keys in inspect' do
|
||||
assert_match(/email/, @user.inspect)
|
||||
assert_no_match(/confirmation_token/, @user.inspect)
|
||||
end
|
||||
|
||||
def assert_key(key, subject)
|
||||
assert subject.key?(key), "Expected #{subject.inspect} to have key #{key.inspect}"
|
||||
end
|
||||
|
||||
@@ -7,11 +7,11 @@ class TimeoutableTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test 'should not be expired' do
|
||||
assert_not new_user.timedout?(29.minutes.ago)
|
||||
refute new_user.timedout?(29.minutes.ago)
|
||||
end
|
||||
|
||||
test 'should not be expired when params is nil' do
|
||||
assert_not new_user.timedout?(nil)
|
||||
refute new_user.timedout?(nil)
|
||||
end
|
||||
|
||||
test 'should use timeout_in method' do
|
||||
@@ -19,29 +19,29 @@ class TimeoutableTest < ActiveSupport::TestCase
|
||||
user.instance_eval { def timeout_in; 10.minutes end }
|
||||
|
||||
assert user.timedout?(12.minutes.ago)
|
||||
assert_not user.timedout?(8.minutes.ago)
|
||||
refute user.timedout?(8.minutes.ago)
|
||||
end
|
||||
|
||||
test 'should not be expired when timeout_in method returns nil' do
|
||||
user = new_user
|
||||
user.instance_eval { def timeout_in; nil end }
|
||||
assert_not user.timedout?(10.hours.ago)
|
||||
refute user.timedout?(10.hours.ago)
|
||||
end
|
||||
|
||||
test 'fallback to Devise config option' do
|
||||
swap Devise, timeout_in: 1.minute do
|
||||
user = new_user
|
||||
assert user.timedout?(2.minutes.ago)
|
||||
assert_not user.timedout?(30.seconds.ago)
|
||||
refute user.timedout?(30.seconds.ago)
|
||||
|
||||
Devise.timeout_in = 5.minutes
|
||||
assert_not user.timedout?(2.minutes.ago)
|
||||
refute user.timedout?(2.minutes.ago)
|
||||
assert user.timedout?(6.minutes.ago)
|
||||
end
|
||||
end
|
||||
|
||||
test 'required_fields should contain the fields that Devise uses' do
|
||||
assert_same_content Devise::Models::Timeoutable.required_fields(User), []
|
||||
assert_equal Devise::Models::Timeoutable.required_fields(User), []
|
||||
end
|
||||
|
||||
test 'should not raise error if remember_created_at is not empty and rememberable is disabled' do
|
||||
|
||||
@@ -2,7 +2,7 @@ require 'test_helper'
|
||||
|
||||
class TrackableTest < ActiveSupport::TestCase
|
||||
test 'required_fields should contain the fields that Devise uses' do
|
||||
assert_same_content Devise::Models::Trackable.required_fields(User), [
|
||||
assert_equal Devise::Models::Trackable.required_fields(User), [
|
||||
:current_sign_in_at,
|
||||
:current_sign_in_ip,
|
||||
:last_sign_in_at,
|
||||
|
||||
@@ -29,7 +29,7 @@ class ValidatableTest < ActiveSupport::TestCase
|
||||
assert user.invalid?
|
||||
assert_not_equal 'is invalid', user.errors[:email].join
|
||||
|
||||
%w{invalid_email_format 123 $$$ () ☃ bla@bla.}.each do |email|
|
||||
%w{invalid_email_format 123 $$$ () ☃}.each do |email|
|
||||
user.email = email
|
||||
assert user.invalid?, 'should be invalid with email ' << email
|
||||
assert_equal 'is invalid', user.errors[:email].join
|
||||
@@ -97,7 +97,7 @@ class ValidatableTest < ActiveSupport::TestCase
|
||||
|
||||
user.password_confirmation = 'confirmation'
|
||||
assert user.invalid?
|
||||
assert_not (user.errors[:password].join =~ /is too long/)
|
||||
refute (user.errors[:password].join =~ /is too long/)
|
||||
end
|
||||
|
||||
test 'should complain about length even if password is not required' do
|
||||
|
||||
@@ -13,7 +13,7 @@ class ActiveRecordTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
(Devise::ALL - modules).each do |mod|
|
||||
assert_not include_module?(klass, mod)
|
||||
refute include_module?(klass, mod)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -112,7 +112,7 @@ class CheckFieldsTest < ActiveSupport::TestCase
|
||||
attr_accessor :encrypted_password, :email
|
||||
end
|
||||
|
||||
assert_nothing_raised Devise::Models::MissingAttribute do
|
||||
assert_nothing_raised do
|
||||
Devise::Models.check_fields!(Player)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,9 +5,11 @@ ActiveRecord::Base.include_root_in_json = true
|
||||
ActiveRecord::Migrator.migrate(File.expand_path("../../rails_app/db/migrate/", __FILE__))
|
||||
|
||||
class ActiveSupport::TestCase
|
||||
if Rails.version >= '5.0.0'
|
||||
if Devise.rails5?
|
||||
self.use_transactional_tests = true
|
||||
else
|
||||
# Let `after_commit` work with transactional fixtures, however this is not needed for Rails 5.
|
||||
require 'test_after_commit'
|
||||
self.use_transactional_fixtures = true
|
||||
end
|
||||
|
||||
|
||||
@@ -73,59 +73,3 @@ class ParameterSanitizerTest < ActiveSupport::TestCase
|
||||
assert_equal({ 'username' => 'jose' }, sanitized)
|
||||
end
|
||||
end
|
||||
|
||||
class DeprecatedParameterSanitizerAPITest < ActiveSupport::TestCase
|
||||
class CustomSanitizer < Devise::ParameterSanitizer
|
||||
def sign_in
|
||||
default_params.permit(:username)
|
||||
end
|
||||
end
|
||||
|
||||
def sanitizer(params)
|
||||
params = ActionController::Parameters.new(params)
|
||||
Devise::ParameterSanitizer.new(User, :user, params)
|
||||
end
|
||||
|
||||
test 'overriding instance methods have precedence over the default sanitized attributes' do
|
||||
assert_deprecated do
|
||||
params = ActionController::Parameters.new(user: { "username" => "jose", "name" => "Jose" })
|
||||
sanitizer = CustomSanitizer.new(User, :user, params)
|
||||
|
||||
sanitized = sanitizer.sanitize(:sign_in)
|
||||
|
||||
assert_equal({ "username" => "jose" }, sanitized)
|
||||
end
|
||||
end
|
||||
|
||||
test 'adding new parameters by mutating the Array' do
|
||||
assert_deprecated do
|
||||
sanitizer = sanitizer('user' => { 'username' => 'jose' })
|
||||
sanitizer.for(:sign_in) << :username
|
||||
sanitized = sanitizer.sanitize(:sign_in)
|
||||
|
||||
assert_equal({ 'username' => 'jose' }, sanitized)
|
||||
end
|
||||
end
|
||||
|
||||
test 'adding new parameters with a block' do
|
||||
assert_deprecated do
|
||||
sanitizer = sanitizer('user' => { 'username' => 'jose' })
|
||||
sanitizer.for(:sign_in) { |user| user.permit(:username) }
|
||||
|
||||
sanitized = sanitizer.sanitize(:sign_in)
|
||||
|
||||
assert_equal({ 'username' => 'jose' }, sanitized)
|
||||
end
|
||||
end
|
||||
|
||||
test 'removing multiple default parameters' do
|
||||
assert_deprecated do
|
||||
sanitizer = sanitizer('user' => { 'email' => 'jose', 'password' => 'invalid', 'remember_me' => '1' })
|
||||
sanitizer.for(:sign_in).delete(:email)
|
||||
sanitizer.for(:sign_in).delete(:password)
|
||||
sanitized = sanitizer.sanitize(:sign_in)
|
||||
|
||||
assert_equal({ 'remember_me' => '1' }, sanitized)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,8 +5,7 @@ class ApplicationController < ActionController::Base
|
||||
protect_from_forgery
|
||||
before_action :current_user, unless: :devise_controller?
|
||||
before_action :authenticate_user!, if: :devise_controller?
|
||||
respond_to *Mime::SET.map(&:to_sym)
|
||||
respond_to(*Mime::SET.map(&:to_sym))
|
||||
|
||||
devise_group :commenter, contains: [:user, :admin]
|
||||
end
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
||||
def facebook
|
||||
data = request.respond_to?(:get_header) ? request.get_header("omniauth.auth") : env["omniauth.auth"]
|
||||
data = request.respond_to?(:get_header) ? request.get_header("omniauth.auth") : request.env["omniauth.auth"]
|
||||
session["devise.facebook_data"] = data["extra"]["user_hash"]
|
||||
render json: data
|
||||
end
|
||||
|
||||
@@ -32,6 +32,10 @@ module RailsApp
|
||||
|
||||
config.action_mailer.default_url_options = { host: "localhost", port: 3000 }
|
||||
|
||||
if DEVISE_ORM == :active_record && (Rails::VERSION::MAJOR >= 4 && Rails::VERSION::MINOR >= 2)
|
||||
config.active_record.raise_in_transactional_callbacks = true
|
||||
end
|
||||
|
||||
# This was used to break devise in some situations
|
||||
config.to_prepare do
|
||||
Devise::SessionsController.layout "application"
|
||||
|
||||
@@ -20,7 +20,9 @@ RailsApp::Application.configure do
|
||||
# config.action_dispatch.rack_cache = true
|
||||
|
||||
# Disable Rails's static asset server (Apache or nginx will already do this).
|
||||
if Rails.version >= "4.2.0"
|
||||
if Rails.version >= "5.0.0"
|
||||
config.public_file_server.enabled = false
|
||||
elsif Rails.version >= "4.2.0"
|
||||
config.serve_static_files = false
|
||||
else
|
||||
config.serve_static_assets = false
|
||||
|
||||
@@ -14,15 +14,14 @@ RailsApp::Application.configure do
|
||||
|
||||
# Disable serving static files from the `/public` folder by default since
|
||||
# Apache or NGINX already handles this.
|
||||
if Rails.version >= "4.2.0"
|
||||
if Rails.version >= "5.0.0"
|
||||
config.public_file_server.enabled = true
|
||||
config.public_file_server.headers = {'Cache-Control' => 'public, max-age=3600'}
|
||||
elsif Rails.version >= "4.2.0"
|
||||
config.serve_static_files = true
|
||||
config.static_cache_control = "public, max-age=3600"
|
||||
else
|
||||
config.serve_static_assets = true
|
||||
end
|
||||
|
||||
if Rails.version >= "5.0.0"
|
||||
config.public_file_server.headers = {'Cache-Control' => 'public, max-age=3600'}
|
||||
else
|
||||
config.static_cache_control = "public, max-age=3600"
|
||||
end
|
||||
|
||||
|
||||
@@ -114,6 +114,7 @@ Rails.application.routes.draw do
|
||||
namespace :sign_out_via, module: "devise" do
|
||||
devise_for :deletes, sign_out_via: :delete, class_name: "Admin"
|
||||
devise_for :posts, sign_out_via: :post, class_name: "Admin"
|
||||
devise_for :gets, sign_out_via: :get, class_name: "Admin"
|
||||
devise_for :delete_or_posts, sign_out_via: [:delete, :post], class_name: "Admin"
|
||||
end
|
||||
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
class CreateTables < ActiveRecord::Migration
|
||||
superclass = ActiveRecord::Migration
|
||||
# TODO: Inherit from the 5.0 Migration class directly when we drop support for Rails 4.
|
||||
superclass = ActiveRecord::Migration[5.0] if superclass.respond_to?(:[])
|
||||
|
||||
class CreateTables < superclass
|
||||
def self.up
|
||||
create_table :users do |t|
|
||||
t.string :username
|
||||
|
||||
@@ -4,7 +4,8 @@ module SharedUser
|
||||
included do
|
||||
devise :database_authenticatable, :confirmable, :lockable, :recoverable,
|
||||
:registerable, :rememberable, :timeoutable,
|
||||
:trackable, :validatable, :omniauthable, password_length: 7..72
|
||||
:trackable, :validatable, :omniauthable, password_length: 7..72,
|
||||
reconfirmable: false
|
||||
|
||||
attr_accessor :other_key
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ module SharedUserWithoutOmniauth
|
||||
included do
|
||||
devise :database_authenticatable, :confirmable, :lockable, :recoverable,
|
||||
:registerable, :rememberable, :timeoutable,
|
||||
:trackable, :validatable
|
||||
:trackable, :validatable, reconfirmable: false
|
||||
end
|
||||
|
||||
def raw_confirmation_token
|
||||
|
||||
@@ -14,7 +14,7 @@ class DefaultRoutingTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
test 'map destroy user session' do
|
||||
assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: 'users/sign_out', method: :get})
|
||||
assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: 'users/sign_out', method: :delete})
|
||||
assert_named_route "/users/sign_out", :destroy_user_session_path
|
||||
end
|
||||
|
||||
@@ -146,7 +146,7 @@ class CustomizedRoutingTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
test 'map account with custom path name for session sign out' do
|
||||
assert_recognizes({controller: 'devise/sessions', action: 'destroy', locale: 'en'}, '/en/accounts/logout')
|
||||
assert_recognizes({controller: 'devise/sessions', action: 'destroy', locale: 'en'}, {path: '/en/accounts/logout', method: :delete })
|
||||
end
|
||||
|
||||
test 'map account with custom path name for password' do
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
require 'active_support/test_case'
|
||||
|
||||
class ActiveSupport::TestCase
|
||||
def assert_not(assertion)
|
||||
assert !assertion
|
||||
end
|
||||
|
||||
def assert_blank(assertion)
|
||||
assert assertion.blank?
|
||||
end
|
||||
@@ -24,13 +20,6 @@ class ActiveSupport::TestCase
|
||||
assert_no_difference('ActionMailer::Base.deliveries.size', &block)
|
||||
end
|
||||
|
||||
def assert_same_content(result, expected)
|
||||
assert expected.size == result.size, "the arrays doesn't have the same size"
|
||||
expected.each do |element|
|
||||
assert result.include?(element), "The array doesn't include '#{element}'."
|
||||
end
|
||||
end
|
||||
|
||||
def assert_raise_with_message(exception_klass, message, &block)
|
||||
exception = assert_raise exception_klass, &block
|
||||
assert_equal exception.message, message,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
test:
|
||||
sessions:
|
||||
<%= Mongoid::VERSION.to_i > 4 ? 'clients' : 'sessions' %>:
|
||||
default:
|
||||
database: devise-test-suite
|
||||
hosts:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
require 'test_helper'
|
||||
|
||||
class TestHelpersTest < Devise::ControllerTestCase
|
||||
class TestControllerHelpersTest < Devise::ControllerTestCase
|
||||
tests UsersController
|
||||
include Devise::TestHelpers
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
test "redirects if attempting to access a page unauthenticated" do
|
||||
get :index
|
||||
32
test/test/integration_helpers_test.rb
Normal file
32
test/test/integration_helpers_test.rb
Normal file
@@ -0,0 +1,32 @@
|
||||
require 'test_helper'
|
||||
|
||||
class TestIntegrationsHelpersTest < Devise::IntegrationTest
|
||||
include Devise::Test::IntegrationHelpers
|
||||
|
||||
test '#sign_in signs in the resource directly' do
|
||||
sign_in(create_user)
|
||||
|
||||
visit '/'
|
||||
assert warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test '#sign_outs signs out in the resource directly' do
|
||||
user = create_user
|
||||
sign_in user
|
||||
sign_out user
|
||||
|
||||
visit '/'
|
||||
refute warden.authenticated?(:user)
|
||||
end
|
||||
|
||||
test '#sign_out does not signs out other scopes' do
|
||||
sign_in(create_user)
|
||||
sign_in(create_admin)
|
||||
sign_out :user
|
||||
|
||||
visit '/'
|
||||
|
||||
refute warden.authenticated?(:user)
|
||||
assert warden.authenticated?(:admin)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user