janus 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.gitignore +4 -3
- data/.travis.yml +3 -2
- data/CHANGELOG.md +27 -3
- data/VERSION +1 -1
- data/janus.gemspec +1 -0
- data/lib/generators/janus/resource_generator.rb +4 -0
- data/lib/generators/templates/confirmations_controller.erb +1 -1
- data/lib/generators/templates/passwords_controller.erb +1 -1
- data/lib/generators/templates/registrations_controller.erb +1 -1
- data/lib/janus/controllers/confirmations_controller.rb +26 -45
- data/lib/janus/controllers/internal_helpers.rb +24 -0
- data/lib/janus/controllers/passwords_controller.rb +2 -1
- data/lib/janus/controllers/registrations_controller.rb +2 -1
- data/lib/janus/controllers/sessions_controller.rb +43 -41
- data/lib/janus/models/database_authenticatable.rb +3 -1
- data/lib/janus/test_helper.rb +10 -6
- data/test/functional/janus/mailer_test.rb +2 -1
- data/test/functional/janus/manager_test.rb +1 -1
- data/test/functional/users/confirmations_controller_test.rb +4 -4
- data/test/functional/users/passwords_controller_test.rb +2 -2
- data/test/functional/users/sessions_controller_test.rb +7 -7
- data/test/integration/users/rememberable_test.rb +2 -2
- data/test/integration/users/remote_test.rb +4 -4
- data/test/integration/users/token_authenticatable_test.rb +2 -2
- data/test/integration/users/trackable_test.rb +1 -1
- data/test/rails_app/config/application.rb +3 -0
- data/test/rails_app/config/environments/test.rb +2 -0
- data/test/rails_app/db/migrate/20130412104138_create_admins.rb +1 -1
- data/test/test_helper.rb +8 -1
- data/test/unit/confirmable_test.rb +3 -3
- data/test/unit/rememberable_test.rb +3 -3
- data/test/unit/remote_authenticatable_test.rb +1 -1
- data/test/unit/remote_token_test.rb +1 -1
- data/test/unit/reset_password_test.rb +4 -4
- data/test/unit/trackable_test.rb +4 -4
- data/test/unit/user_test.rb +16 -5
- data.tar.gz.sig +0 -0
- metadata +16 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f73008d3812ab8275c869ee2e9abccaecd4133fb
|
4
|
+
data.tar.gz: 79ddf846b1d04560c7add204300756a21c1e159c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c781f9e06208ec6eea86da263ee76d89860a910921e458b7e68a64dc003175b49e059d76fb5390b62b55cc904a39b354d828de7678a5cc809aa18b6f9de08079
|
7
|
+
data.tar.gz: b66e7f792b3b5698e8a84b0b9c4fa48d904ea467a59489d115d7adbf61826234b8d8216cb024e44b3ead9a37e2ecc32e4c590603788083e4263df3551f346c75
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -3,12 +3,12 @@ script: bundle exec rake test
|
|
3
3
|
|
4
4
|
rvm:
|
5
5
|
- 1.9.3
|
6
|
-
- 2.1.
|
6
|
+
- 2.1.5
|
7
7
|
|
8
8
|
gemfile:
|
9
9
|
- Gemfile
|
10
|
-
- gemfiles/Gemfile.rails-4.0-stable
|
11
10
|
- gemfiles/Gemfile.rails-3.2-stable
|
11
|
+
- gemfiles/Gemfile.rails-4.1-stable
|
12
12
|
- gemfiles/Gemfile.rails-head
|
13
13
|
|
14
14
|
matrix:
|
@@ -21,3 +21,4 @@ matrix:
|
|
21
21
|
env:
|
22
22
|
global:
|
23
23
|
- NOKOGIRI_USE_SYSTEM_LIBRARIES=1
|
24
|
+
- CODECLIMATE_REPO_TOKEN=13f6e67dc6be3f749e752a3231502a48ae5e2986a557375da4339fd556031358
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,32 @@
|
|
1
|
-
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## Unreleased
|
4
|
+
|
5
|
+
|
6
|
+
## v0.10.0 - 2014-12-27
|
7
|
+
|
8
|
+
### Changed
|
9
|
+
|
10
|
+
- Rails 4.2.0 compatibility
|
11
|
+
- Confirmations controller now returns 400 or 404 HTTP status codes when
|
12
|
+
failing to find a valid resource for the token (or missing token).
|
13
|
+
- The `janus` instance is now accessible in Janus::TestHelper.
|
14
|
+
|
15
|
+
### Fixed
|
16
|
+
|
17
|
+
- Login failure when password wasn't set (invalid encrypted password).
|
18
|
+
|
19
|
+
|
20
|
+
## v0.9.1 - 2014-08-27
|
21
|
+
|
22
|
+
### Added
|
2
23
|
|
3
|
-
- Fixed compatibility with the latest Rails 4.0 and 4.1 releases that fixed a
|
4
|
-
bug with strong parameters. See 5b5a7e7
|
5
24
|
- `Janus::SessionsController#valid_host?(host)` to interrupt a blind redirection
|
6
25
|
when `params[:return_to]` is the current host. See b120010.
|
7
26
|
|
27
|
+
### Fixed
|
28
|
+
|
29
|
+
- Compatibility with the latest Rails 4.0 and 4.1 releases that fixed a
|
30
|
+
bug with strong parameters. See 5b5a7e7
|
31
|
+
|
8
32
|
Compare: https://github.com/ysbaddaden/janus/compare/v0.9.0...v0.9.1
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.0
|
data/janus.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_dependency 'addressable'
|
21
21
|
|
22
22
|
gem.add_development_dependency 'rails', '>= 3.0.0'
|
23
|
+
gem.add_development_dependency 'responders', '~> 2.0'
|
23
24
|
gem.add_development_dependency 'sqlite3'
|
24
25
|
gem.add_development_dependency 'bcrypt'
|
25
26
|
gem.add_development_dependency 'scrypt'
|
@@ -71,6 +71,10 @@ module Janus
|
|
71
71
|
route "janus :#{plural_name}, " + controllers.map { |ctrl| ":#{ctrl} => true" }.join(', ')
|
72
72
|
end
|
73
73
|
|
74
|
+
def delivery_method
|
75
|
+
Rails.version >= "4.2.0" ? "deliver_later" : "deliver"
|
76
|
+
end
|
77
|
+
|
74
78
|
private
|
75
79
|
def controllers
|
76
80
|
strategies & %w{session registration confirmation password}
|
@@ -2,7 +2,7 @@ class <%= class_name.pluralize %>::ConfirmationsController < Janus::Confirmation
|
|
2
2
|
respond_to :html
|
3
3
|
|
4
4
|
# def deliver_confirmation_instructions(<%= singular_name %>)
|
5
|
-
# <%= class_name %>Mailer.confirmation_instructions(<%= singular_name %>)
|
5
|
+
# <%= class_name %>Mailer.confirmation_instructions(<%= singular_name %>).<%= delivery_method %>
|
6
6
|
# end
|
7
7
|
|
8
8
|
# def after_resending_confirmation_instructions_url(<%= singular_name %>)
|
@@ -2,7 +2,7 @@ class <%= class_name.pluralize %>::PasswordsController < Janus::PasswordsControl
|
|
2
2
|
respond_to :html
|
3
3
|
|
4
4
|
# def deliver_reset_password_instructions(<%= singular_name %>)
|
5
|
-
# <%= class_name %>Mailer.reset_password_instructions(<%= singular_name %>)
|
5
|
+
# <%= class_name %>Mailer.reset_password_instructions(<%= singular_name %>).<%= delivery_method %>
|
6
6
|
# end
|
7
7
|
|
8
8
|
# def after_password_change_url(<%= singular_name %>)
|
@@ -2,7 +2,7 @@ class <%= class_name.pluralize %>::RegistrationsController < Janus::Registration
|
|
2
2
|
respond_to :html
|
3
3
|
|
4
4
|
# def deliver_confirmation_instructions(<%= singular_name %>)
|
5
|
-
# <%= class_name %>Mailer.confirmation_instructions(<%= singular_name %>)
|
5
|
+
# <%= class_name %>Mailer.confirmation_instructions(<%= singular_name %>).<%= delivery_method %>
|
6
6
|
# end
|
7
7
|
|
8
8
|
# def after_sign_up_url(<%= singular_name %>)
|
@@ -5,30 +5,15 @@ class Janus::ConfirmationsController < ApplicationController
|
|
5
5
|
|
6
6
|
helper JanusHelper
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
if resource
|
12
|
-
resource.confirm!
|
8
|
+
before_filter :load_resource_from_confirmation_token, :only => :show
|
9
|
+
before_filter :load_resource_from_authentication_params, :only => :create
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
redirect_to after_confirmation_url(resource),
|
17
|
-
:notice => t('flash.janus.confirmations.edit.confirmed')
|
18
|
-
end
|
19
|
-
|
20
|
-
format.any { head :ok }
|
21
|
-
end
|
22
|
-
else
|
23
|
-
respond_to do |format|
|
24
|
-
format.html do
|
25
|
-
self.resource = resource_class.new
|
26
|
-
resource.errors.add(:base, :invalid_token)
|
27
|
-
render 'new'
|
28
|
-
end
|
11
|
+
def show
|
12
|
+
resource.confirm!
|
29
13
|
|
30
|
-
|
31
|
-
|
14
|
+
respond_with_success do
|
15
|
+
redirect_to after_confirmation_url(resource),
|
16
|
+
notice: t('flash.janus.confirmations.edit.confirmed')
|
32
17
|
end
|
33
18
|
end
|
34
19
|
|
@@ -38,36 +23,19 @@ class Janus::ConfirmationsController < ApplicationController
|
|
38
23
|
end
|
39
24
|
|
40
25
|
def create
|
41
|
-
|
42
|
-
|
43
|
-
if resource
|
44
|
-
deliver_confirmation_instructions(resource)
|
45
|
-
|
46
|
-
respond_to do |format|
|
47
|
-
format.html do
|
48
|
-
redirect_to after_resending_confirmation_instructions_url(resource),
|
49
|
-
:notice => t('flash.janus.confirmations.create.email_sent')
|
50
|
-
end
|
26
|
+
deliver_confirmation_instructions(resource)
|
51
27
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
respond_to do |format|
|
56
|
-
format.html do
|
57
|
-
self.resource = resource_class.new
|
58
|
-
resource.errors.add(:base, :not_found)
|
59
|
-
render 'new'
|
60
|
-
end
|
61
|
-
|
62
|
-
format.any { head :not_found }
|
63
|
-
end
|
28
|
+
respond_with_success do
|
29
|
+
redirect_to after_resending_confirmation_instructions_url(resource),
|
30
|
+
notice: t('flash.janus.confirmations.create.email_sent')
|
64
31
|
end
|
65
32
|
end
|
66
33
|
|
67
34
|
# Simple wrapper for Mailer#confirmation_instructions.deliver to
|
68
35
|
# allow customization of the email (eg: to pass additional data).
|
69
36
|
def deliver_confirmation_instructions(resource)
|
70
|
-
mailer_class.confirmation_instructions(resource)
|
37
|
+
mail = mailer_class.confirmation_instructions(resource)
|
38
|
+
mail.respond_to?(:deliver_later) ? mail.deliver_later : mail.deliver
|
71
39
|
end
|
72
40
|
|
73
41
|
# Where to redirect after the instructions have been sent.
|
@@ -79,4 +47,17 @@ class Janus::ConfirmationsController < ApplicationController
|
|
79
47
|
def after_confirmation_url(resource)
|
80
48
|
root_url
|
81
49
|
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def load_resource_from_confirmation_token
|
54
|
+
token = params[resource_class.confirmation_key]
|
55
|
+
self.resource = resource_class.find_for_confirmation(token)
|
56
|
+
respond_with_failure(:invalid_token, :status => :bad_request) unless resource
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_resource_from_authentication_params
|
60
|
+
self.resource = resource_class.find_for_database_authentication(resource_authentication_params)
|
61
|
+
respond_with_failure(:not_found) unless resource
|
62
|
+
end
|
82
63
|
end
|
@@ -56,5 +56,29 @@ module Janus
|
|
56
56
|
def mailer_class
|
57
57
|
@mailer_class ||= (janus_scope.camelize + 'Mailer').constantize
|
58
58
|
end
|
59
|
+
|
60
|
+
def respond_with_success(&block)
|
61
|
+
respond_to do |format|
|
62
|
+
format.html(&block)
|
63
|
+
format.any { head :ok }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def respond_with_failure(error, options = {})
|
68
|
+
status = options[:status] || error
|
69
|
+
|
70
|
+
respond_to do |format|
|
71
|
+
format.html do
|
72
|
+
self.resource = initialize_resource
|
73
|
+
resource.errors.add(:base, error)
|
74
|
+
render 'new', status: status
|
75
|
+
end
|
76
|
+
format.any { head status }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def initialize_resource
|
81
|
+
resource_class.new
|
82
|
+
end
|
59
83
|
end
|
60
84
|
end
|
@@ -67,7 +67,8 @@ class Janus::PasswordsController < ApplicationController
|
|
67
67
|
# Simple wrapper for Mailer#reset_password_instructions.deliver to
|
68
68
|
# allow customization of the email (eg: to pass additional data).
|
69
69
|
def deliver_reset_password_instructions(resource)
|
70
|
-
mailer_class.reset_password_instructions(resource)
|
70
|
+
mail = mailer_class.reset_password_instructions(resource)
|
71
|
+
mail.respond_to?(:deliver_later) ? mail.deliver_later : mail.deliver
|
71
72
|
end
|
72
73
|
|
73
74
|
# Either redirects the user to after_password_change_url or to
|
@@ -48,7 +48,8 @@ class Janus::RegistrationsController < ApplicationController
|
|
48
48
|
# Simple wrapper for Mailer#confirmation_instructions.deliver to
|
49
49
|
# allow customization of the email (eg: to pass additional data).
|
50
50
|
def deliver_confirmation_instructions(resource)
|
51
|
-
mailer_class.confirmation_instructions(resource)
|
51
|
+
mail = mailer_class.confirmation_instructions(resource)
|
52
|
+
mail.respond_to?(:deliver_later) ? mail.deliver_later : mail.deliver
|
52
53
|
end
|
53
54
|
|
54
55
|
# Where to redirect after user has registered.
|
@@ -1,19 +1,18 @@
|
|
1
1
|
require 'addressable/uri'
|
2
2
|
|
3
|
-
# This controller is responsible for creating and destroying
|
4
|
-
# authenticated user sessions.
|
3
|
+
# This controller is responsible for creating and destroying user sessions.
|
5
4
|
#
|
6
5
|
# The creation uses the DatabaseAuthenticatable strategy, while the destruction
|
7
6
|
# simply destroys any session, whatever strategy it was created with. Janus
|
8
|
-
# hooks will be called,
|
9
|
-
#
|
7
|
+
# hooks will be called, allowing to destroy any Rememberable cookies as well as
|
8
|
+
# any user defined behavior.
|
10
9
|
#
|
11
10
|
class Janus::SessionsController < ApplicationController
|
12
11
|
include Janus::InternalHelpers
|
13
|
-
# include Janus::UrlHelpers
|
14
12
|
|
15
13
|
helper JanusHelper
|
16
|
-
|
14
|
+
|
15
|
+
before_filter :load_resource_from_authentication_params, :only => :create
|
17
16
|
|
18
17
|
def new
|
19
18
|
params[:return_to] ||= request.env["HTTP_REFERER"]
|
@@ -27,35 +26,17 @@ class Janus::SessionsController < ApplicationController
|
|
27
26
|
end
|
28
27
|
|
29
28
|
def create
|
30
|
-
|
31
|
-
|
32
|
-
if resource && resource.valid_password?(params[resource_name][:password])
|
29
|
+
if valid_resource?
|
33
30
|
janus.login(resource, :scope => janus_scope, :rememberable => params[:remember_me])
|
34
|
-
|
35
|
-
respond_to do |format|
|
36
|
-
format.html { redirect_after_sign_in(resource) }
|
37
|
-
format.any { head :ok }
|
38
|
-
end
|
31
|
+
respond_with_success { redirect_after_sign_in(resource) }
|
39
32
|
else
|
40
|
-
|
41
|
-
format.html do
|
42
|
-
self.resource ||= resource_class.new(resource_authentication_params)
|
43
|
-
resource.clean_up_passwords
|
44
|
-
resource.errors.add(:base, :not_found)
|
45
|
-
render "new", :status => :unauthorized
|
46
|
-
end
|
47
|
-
format.any { head :unauthorized }
|
48
|
-
end
|
33
|
+
respond_with_failure :unauthorized
|
49
34
|
end
|
50
35
|
end
|
51
36
|
|
52
37
|
def destroy
|
53
38
|
janus.logout(janus_scope)
|
54
|
-
|
55
|
-
respond_to do |format|
|
56
|
-
format.html { redirect_to after_sign_out_url(janus_scope) }
|
57
|
-
format.any { head :ok }
|
58
|
-
end
|
39
|
+
respond_with_success { redirect_to after_sign_out_url(janus_scope) }
|
59
40
|
end
|
60
41
|
|
61
42
|
# An overridable method that returns the default path to return the just
|
@@ -93,7 +74,7 @@ class Janus::SessionsController < ApplicationController
|
|
93
74
|
# actually returns URL to prevent infinite loops. We must for instance
|
94
75
|
# never return to new_sesssion_path.
|
95
76
|
#
|
96
|
-
# If you ever
|
77
|
+
# If you ever need to override this method, don't forget to call `super`.
|
97
78
|
# For instance:
|
98
79
|
#
|
99
80
|
# def never_return_to(scope)
|
@@ -103,8 +84,13 @@ class Janus::SessionsController < ApplicationController
|
|
103
84
|
def never_return_to(scope)
|
104
85
|
scope = Janus.scope_for(scope)
|
105
86
|
list = [new_session_path(scope)]
|
87
|
+
|
106
88
|
begin
|
107
|
-
list + [
|
89
|
+
list + [
|
90
|
+
destroy_session_path(scope),
|
91
|
+
new_password_path(scope),
|
92
|
+
edit_password_path(scope)
|
93
|
+
]
|
108
94
|
rescue NoMethodError
|
109
95
|
list
|
110
96
|
end
|
@@ -123,25 +109,41 @@ class Janus::SessionsController < ApplicationController
|
|
123
109
|
unless never_return_to(user).include?(return_to.path)
|
124
110
|
# path or same host redirection
|
125
111
|
if valid_host?(return_to.host || request.host)
|
126
|
-
redirect_to params[:return_to]
|
127
|
-
return
|
112
|
+
redirect_to params[:return_to] and return
|
128
113
|
end
|
129
114
|
|
130
115
|
# external host redirection
|
131
116
|
if valid_remote_host?(return_to.host)
|
132
|
-
if user.class.include?(Janus::Models::RemoteAuthenticatable)
|
133
|
-
|
134
|
-
return_to.query_values = query.merge(
|
135
|
-
user.class.remote_authentication_key => user.generate_remote_token!
|
136
|
-
)
|
137
|
-
end
|
138
|
-
|
139
|
-
redirect_to return_to.to_s
|
140
|
-
return
|
117
|
+
add_remote_authentication_key(return_to, user) if user.class.include?(Janus::Models::RemoteAuthenticatable)
|
118
|
+
redirect_to return_to.to_s and return
|
141
119
|
end
|
142
120
|
end
|
143
121
|
end
|
144
122
|
|
145
123
|
redirect_to after_sign_in_url(user)
|
146
124
|
end
|
125
|
+
|
126
|
+
def add_remote_authentication_key(return_to, user)
|
127
|
+
query = return_to.query_values || {}
|
128
|
+
return_to.query_values = query.merge(
|
129
|
+
user.class.remote_authentication_key => user.generate_remote_token!
|
130
|
+
)
|
131
|
+
end
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
def valid_resource?
|
136
|
+
resource && resource.valid_password?(params[resource_name][:password])
|
137
|
+
end
|
138
|
+
|
139
|
+
def initialize_resource
|
140
|
+
resource_class
|
141
|
+
.new(resource_authentication_params)
|
142
|
+
.tap(&:clean_up_passwords)
|
143
|
+
end
|
144
|
+
|
145
|
+
def load_resource_from_authentication_params
|
146
|
+
self.resource = resource_class.find_for_database_authentication(resource_authentication_params)
|
147
|
+
respond_with_failure :unauthorized unless resource
|
148
|
+
end
|
147
149
|
end
|
@@ -57,8 +57,10 @@ module Janus
|
|
57
57
|
when :bcrypt
|
58
58
|
::BCrypt::Password.new(encrypted_password) == salted_password(password)
|
59
59
|
when :scrypt
|
60
|
-
::SCrypt::Password.new(encrypted_password) == salted_password(password)
|
60
|
+
::SCrypt::Password.new(encrypted_password || "") == salted_password(password)
|
61
61
|
end
|
62
|
+
rescue BCrypt::Errors::InvalidHash, SCrypt::Errors::InvalidHash
|
63
|
+
false
|
62
64
|
end
|
63
65
|
|
64
66
|
# Digests a password using either bcrypt or scrypt (as configured by `config.encryptor`).
|
data/lib/janus/test_helper.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Janus
|
2
2
|
module TestHelper
|
3
|
+
attr_reader :janus
|
4
|
+
|
3
5
|
def self.included(klass)
|
4
6
|
klass.class_eval do
|
5
7
|
setup { @janus = Janus::Manager.new(request, cookies) }
|
@@ -7,23 +9,25 @@ module Janus
|
|
7
9
|
end
|
8
10
|
|
9
11
|
def sign_in(user, options = {})
|
10
|
-
|
12
|
+
janus.login(user, options)
|
11
13
|
end
|
12
14
|
|
13
15
|
def sign_out(user_or_scope = nil)
|
14
16
|
if user_or_scope
|
15
|
-
|
17
|
+
janus.logout(Janus.scope_for(user_or_scope))
|
16
18
|
else
|
17
|
-
|
19
|
+
janus.logout
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
def assert_authenticated(scope)
|
22
|
-
assert
|
24
|
+
assert janus.authenticated?(scope), "Expected #{scope} to be authenticated."
|
23
25
|
end
|
24
26
|
|
25
|
-
def
|
26
|
-
|
27
|
+
def refute_authenticated(scope)
|
28
|
+
refute janus.authenticated?(scope), "Expected #{scope} to not be authenticated."
|
27
29
|
end
|
30
|
+
|
31
|
+
alias_method :assert_not_authenticated, :refute_authenticated
|
28
32
|
end
|
29
33
|
end
|
@@ -4,7 +4,8 @@ class Janus::MailerTest < ActionMailer::TestCase
|
|
4
4
|
test "reset_password_instructions" do
|
5
5
|
users(:julien).generate_reset_password_token!
|
6
6
|
|
7
|
-
mail = UserMailer.reset_password_instructions(users(:julien))
|
7
|
+
mail = UserMailer.reset_password_instructions(users(:julien))
|
8
|
+
mail.respond_to?(:deliver_now) ? mail.deliver_now : mail.deliver
|
8
9
|
assert_equal [users(:julien).email], mail.to
|
9
10
|
assert !mail.subject.blank?
|
10
11
|
|
@@ -15,7 +15,7 @@ class Users::ConfirmationsControllerTest < ActionController::TestCase
|
|
15
15
|
test "should not get show without token" do
|
16
16
|
assert_no_difference('User.count(:confirmed_at)') do
|
17
17
|
get :show
|
18
|
-
assert_response :
|
18
|
+
assert_response :bad_request
|
19
19
|
assert_template 'new'
|
20
20
|
assert_select '#error_explanation'
|
21
21
|
end
|
@@ -24,7 +24,7 @@ class Users::ConfirmationsControllerTest < ActionController::TestCase
|
|
24
24
|
test "should not get show with blank token" do
|
25
25
|
assert_no_difference('User.count(:confirmed_at)') do
|
26
26
|
get :show, :token => ""
|
27
|
-
assert_response :
|
27
|
+
assert_response :bad_request
|
28
28
|
assert_template 'new'
|
29
29
|
assert_select '#error_explanation'
|
30
30
|
end
|
@@ -35,7 +35,7 @@ class Users::ConfirmationsControllerTest < ActionController::TestCase
|
|
35
35
|
|
36
36
|
assert_no_difference('User.count(:confirmed_at)') do
|
37
37
|
get :show, :token => "aiorujfqptezjsmdguspfofkn"
|
38
|
-
assert_response :
|
38
|
+
assert_response :bad_request
|
39
39
|
assert_template 'new'
|
40
40
|
assert_select '#error_explanation'
|
41
41
|
end
|
@@ -59,9 +59,9 @@ class Users::ConfirmationsControllerTest < ActionController::TestCase
|
|
59
59
|
test "should not create" do
|
60
60
|
assert_no_email do
|
61
61
|
post :create, :user => { :email => 'nobody@example.com' }
|
62
|
+
assert_response :not_found
|
62
63
|
end
|
63
64
|
|
64
|
-
assert_response :ok
|
65
65
|
assert_template 'new'
|
66
66
|
assert_select '#error_explanation'
|
67
67
|
end
|
@@ -99,8 +99,8 @@ class Users::PasswordsControllerTest < ActionController::TestCase
|
|
99
99
|
|
100
100
|
users(:julien).reload
|
101
101
|
|
102
|
-
|
103
|
-
|
102
|
+
refute_nil users(:julien).reset_password_token
|
103
|
+
refute_nil users(:julien).reset_password_sent_at
|
104
104
|
assert !users(:julien).valid_password?(@attributes[:password])
|
105
105
|
end
|
106
106
|
|
@@ -19,7 +19,7 @@ class Users::SessionsControllerTest < ActionController::TestCase
|
|
19
19
|
assert_response :ok
|
20
20
|
assert_select '#user_email', 1
|
21
21
|
assert_select '#user_password', 1
|
22
|
-
assert_select
|
22
|
+
assert_select "input[name=return_to][value='/some/path']", 1
|
23
23
|
end
|
24
24
|
|
25
25
|
test "new should pass return_to" do
|
@@ -27,7 +27,7 @@ class Users::SessionsControllerTest < ActionController::TestCase
|
|
27
27
|
assert_response :ok
|
28
28
|
assert_select '#user_email', 1
|
29
29
|
assert_select '#user_password', 1
|
30
|
-
assert_select
|
30
|
+
assert_select "input[name=return_to][value='" + root_path + "']", 1
|
31
31
|
end
|
32
32
|
|
33
33
|
test "should create" do
|
@@ -68,7 +68,7 @@ class Users::SessionsControllerTest < ActionController::TestCase
|
|
68
68
|
assert_select "#user_email[value='" + users(:julien).email + "']"
|
69
69
|
assert_select "#user_password[value='secret']", 0
|
70
70
|
assert_select '#error_explanation'
|
71
|
-
|
71
|
+
refute_authenticated(:user)
|
72
72
|
end
|
73
73
|
|
74
74
|
test "should fail to create with bad password" do
|
@@ -78,7 +78,7 @@ class Users::SessionsControllerTest < ActionController::TestCase
|
|
78
78
|
assert_select "#user_email[value='" + users(:martha).email + "']"
|
79
79
|
assert_select "#user_password[value='force me in']", 0
|
80
80
|
assert_select '#error_explanation'
|
81
|
-
|
81
|
+
refute_authenticated(:user)
|
82
82
|
end
|
83
83
|
|
84
84
|
test "should fail to create with unknown user" do
|
@@ -88,7 +88,7 @@ class Users::SessionsControllerTest < ActionController::TestCase
|
|
88
88
|
assert_select "#user_email[value='nobody@localhost']"
|
89
89
|
assert_select "#user_password[value='secret']", 0
|
90
90
|
assert_select '#error_explanation'
|
91
|
-
|
91
|
+
refute_authenticated(:user)
|
92
92
|
end
|
93
93
|
|
94
94
|
test "should destroy" do
|
@@ -96,12 +96,12 @@ class Users::SessionsControllerTest < ActionController::TestCase
|
|
96
96
|
|
97
97
|
get :destroy
|
98
98
|
assert_redirected_to root_url
|
99
|
-
|
99
|
+
refute_authenticated(:user)
|
100
100
|
end
|
101
101
|
|
102
102
|
test "destroy should silently logout anonymous" do
|
103
103
|
get :destroy
|
104
104
|
assert_redirected_to root_url
|
105
|
-
|
105
|
+
refute_authenticated(:user)
|
106
106
|
end
|
107
107
|
end
|
@@ -14,7 +14,7 @@ class Users::RememberableTest < ActionDispatch::IntegrationTest
|
|
14
14
|
|
15
15
|
sign_out :user
|
16
16
|
visit root_url
|
17
|
-
|
17
|
+
refute_authenticated
|
18
18
|
end
|
19
19
|
|
20
20
|
test "registration should remember user" do
|
@@ -27,6 +27,6 @@ class Users::RememberableTest < ActionDispatch::IntegrationTest
|
|
27
27
|
|
28
28
|
sign_out :user
|
29
29
|
visit root_url
|
30
|
-
|
30
|
+
refute_authenticated
|
31
31
|
end
|
32
32
|
end
|
@@ -6,7 +6,7 @@ class Users::RemoteTest < ActionDispatch::IntegrationTest
|
|
6
6
|
test "service login" do
|
7
7
|
# user visits a remote site
|
8
8
|
visit blog_url(:host => 'test.host')
|
9
|
-
|
9
|
+
refute_authenticated
|
10
10
|
|
11
11
|
# user clicks the sign in link
|
12
12
|
click_link 'sign_in'
|
@@ -31,7 +31,7 @@ class Users::RemoteTest < ActionDispatch::IntegrationTest
|
|
31
31
|
|
32
32
|
# user visits a remote site
|
33
33
|
visit blog_url(:host => 'test.host')
|
34
|
-
|
34
|
+
refute_authenticated
|
35
35
|
|
36
36
|
# user clicks the sign in link of remote site which should redirect her back
|
37
37
|
click_link 'sign_in'
|
@@ -53,7 +53,7 @@ class Users::RemoteTest < ActionDispatch::IntegrationTest
|
|
53
53
|
visit root_url(:host => 'test.host')
|
54
54
|
|
55
55
|
# session should have been invalidated
|
56
|
-
|
56
|
+
refute_authenticated
|
57
57
|
end
|
58
58
|
|
59
59
|
test "session invalidation should not reset the user session_token" do
|
@@ -64,7 +64,7 @@ class Users::RemoteTest < ActionDispatch::IntegrationTest
|
|
64
64
|
sign_in users(:julien)
|
65
65
|
|
66
66
|
visit root_url(:host => 'test.host')
|
67
|
-
|
67
|
+
refute_authenticated
|
68
68
|
|
69
69
|
visit root_url
|
70
70
|
assert_authenticated
|
@@ -15,7 +15,7 @@ class Users::TokenAuthenticatableTest < ActionDispatch::IntegrationTest
|
|
15
15
|
|
16
16
|
test "should not sign user with invalid token" do
|
17
17
|
visit root_url(:auth_token => 'unknown token')
|
18
|
-
|
18
|
+
refute_authenticated
|
19
19
|
end
|
20
20
|
|
21
21
|
test "should reuse token" do
|
@@ -36,7 +36,7 @@ class Users::TokenAuthenticatableTest < ActionDispatch::IntegrationTest
|
|
36
36
|
sign_out :user
|
37
37
|
|
38
38
|
visit root_url(:auth_token => token)
|
39
|
-
|
39
|
+
refute_authenticated
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -6,7 +6,7 @@ class Users::TrackableTest < ActionDispatch::IntegrationTest
|
|
6
6
|
test "should track user" do
|
7
7
|
current_sign_in_at = users(:julien).reload.current_sign_in_at
|
8
8
|
sign_in users(:julien)
|
9
|
-
|
9
|
+
refute_equal current_sign_in_at, users(:julien).reload.current_sign_in_at
|
10
10
|
end
|
11
11
|
|
12
12
|
test "remote authentication should not track user" do
|
@@ -39,5 +39,8 @@ module RailsApp
|
|
39
39
|
|
40
40
|
# Configure sensitive parameters which will be filtered from the log file.
|
41
41
|
config.filter_parameters += [:current_password, :password, :password_confirmation]
|
42
|
+
|
43
|
+
# GlobalId chokes on app names with underscores
|
44
|
+
config.global_id.app = "rails-app" if config.respond_to?(:global_id)
|
42
45
|
end
|
43
46
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
ENV["RAILS_ENV"] = "test"
|
2
2
|
|
3
|
+
begin
|
4
|
+
require 'codeclimate-test-reporter'
|
5
|
+
CodeClimate::TestReporter.start
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
|
3
9
|
require File.expand_path('../rails_app/config/environment', __FILE__)
|
4
10
|
require 'rails/test_help'
|
5
11
|
require 'capybara/rails'
|
6
12
|
require 'minitest/mock'
|
13
|
+
require 'minitest/pride'
|
7
14
|
|
8
15
|
ActiveRecord::Migration.verbose = false
|
9
16
|
ActiveRecord::Migrator.migrate(Rails.root.join('db', 'migrate').to_s)
|
@@ -102,7 +109,7 @@ class ActionDispatch::IntegrationTest
|
|
102
109
|
assert has_selector?("a#my_page"), "Expected user to be authenticated."
|
103
110
|
end
|
104
111
|
|
105
|
-
def
|
112
|
+
def refute_authenticated
|
106
113
|
assert has_selector?("a#sign_in"), "Expected user to not be authenticated."
|
107
114
|
end
|
108
115
|
|
@@ -7,8 +7,8 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
7
7
|
|
8
8
|
test "generate_confirmation_token" do
|
9
9
|
@user.generate_confirmation_token
|
10
|
-
|
11
|
-
|
10
|
+
refute_nil @user.confirmation_token
|
11
|
+
refute_nil @user.confirmation_sent_at
|
12
12
|
assert_nil @user.confirmed_at
|
13
13
|
|
14
14
|
@user.reload
|
@@ -22,7 +22,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
22
22
|
@user.confirm!
|
23
23
|
assert_nil @user.confirmation_token
|
24
24
|
assert_nil @user.confirmation_sent_at
|
25
|
-
|
25
|
+
refute_nil @user.confirmed_at
|
26
26
|
end
|
27
27
|
|
28
28
|
test "find_for_confirmation" do
|
@@ -7,8 +7,8 @@ class RememberableTest < ActiveSupport::TestCase
|
|
7
7
|
|
8
8
|
test "remember_token" do
|
9
9
|
@user.remember_me!
|
10
|
-
|
11
|
-
|
10
|
+
refute_nil @user.remember_token
|
11
|
+
refute_nil @user.remember_created_at
|
12
12
|
|
13
13
|
@user.forget_me!
|
14
14
|
assert_nil @user.remember_token
|
@@ -19,7 +19,7 @@ class RememberableTest < ActiveSupport::TestCase
|
|
19
19
|
@user.remember_me!
|
20
20
|
token = @user.remember_token
|
21
21
|
@user.remember_me!
|
22
|
-
|
22
|
+
refute_equal token, @user.remember_token
|
23
23
|
end
|
24
24
|
|
25
25
|
test "find_for_remember_authentication" do
|
@@ -4,6 +4,6 @@ class RemoteTokenTest < ActiveSupport::TestCase
|
|
4
4
|
test "should create" do
|
5
5
|
remote_token = RemoteToken.create(:user => users(:julien))
|
6
6
|
assert remote_token.persisted?, remote_token.errors.to_xml
|
7
|
-
|
7
|
+
refute_nil remote_token.token
|
8
8
|
end
|
9
9
|
end
|
@@ -8,8 +8,8 @@ class ResetPasswordTest < ActiveSupport::TestCase
|
|
8
8
|
test "generate reset password token" do
|
9
9
|
assert @user.generate_reset_password_token!
|
10
10
|
assert @user.persisted?
|
11
|
-
|
12
|
-
|
11
|
+
refute_nil @user.reset_password_token
|
12
|
+
refute_nil @user.reset_password_sent_at
|
13
13
|
end
|
14
14
|
|
15
15
|
test "reset password" do
|
@@ -25,8 +25,8 @@ class ResetPasswordTest < ActiveSupport::TestCase
|
|
25
25
|
@user.generate_reset_password_token!
|
26
26
|
user = User.find_for_password_reset(@user.reset_password_token)
|
27
27
|
assert_equal @user, user
|
28
|
-
|
29
|
-
|
28
|
+
refute_nil user.reset_password_token
|
29
|
+
refute_nil user.reset_password_sent_at
|
30
30
|
end
|
31
31
|
|
32
32
|
test "should not find user with bad tokens" do
|
data/test/unit/trackable_test.rb
CHANGED
@@ -7,15 +7,15 @@ class TrackableTest < ActiveSupport::TestCase
|
|
7
7
|
|
8
8
|
assert_nil users(:julien).last_sign_in_at
|
9
9
|
assert_nil users(:julien).last_sign_in_ip
|
10
|
-
|
10
|
+
refute_nil users(:julien).current_sign_in_at
|
11
11
|
assert_equal '127.0.0.1', users(:julien).current_sign_in_ip
|
12
12
|
|
13
13
|
users(:julien).track!('127.0.0.2')
|
14
14
|
users(:julien).reload
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
refute_nil users(:julien).last_sign_in_at
|
17
|
+
refute_nil users(:julien).last_sign_in_ip
|
18
|
+
refute_nil users(:julien).current_sign_in_at
|
19
19
|
assert_equal '127.0.0.2', users(:julien).current_sign_in_ip
|
20
20
|
end
|
21
21
|
end
|
data/test/unit/user_test.rb
CHANGED
@@ -7,6 +7,7 @@ class UserTest < ActiveSupport::TestCase
|
|
7
7
|
|
8
8
|
test "valid_password?" do
|
9
9
|
user = User.new(:password => "azerty")
|
10
|
+
refute user.valid_password?("secret")
|
10
11
|
assert user.valid_password?("azerty")
|
11
12
|
refute user.valid_password?("secret")
|
12
13
|
|
@@ -22,6 +23,16 @@ class UserTest < ActiveSupport::TestCase
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
26
|
+
test "valid_password? without encrypted password" do
|
27
|
+
refute User.new.valid_password?("")
|
28
|
+
refute User.new.valid_password?("secret")
|
29
|
+
|
30
|
+
with_encryptor :scrypt do
|
31
|
+
refute User.new.valid_password?("")
|
32
|
+
refute User.new.valid_password?("some lame guessing")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
25
36
|
test "should validate current_password on update" do
|
26
37
|
@user.update_attributes(:email => 'julien@example.fr', :current_password => 'secret')
|
27
38
|
assert @user.persisted?, @user.errors.to_xml
|
@@ -33,7 +44,7 @@ class UserTest < ActiveSupport::TestCase
|
|
33
44
|
test "password" do
|
34
45
|
user = User.new(:password => "my pwd")
|
35
46
|
assert_equal "my pwd", user.password
|
36
|
-
|
47
|
+
refute_nil user.encrypted_password
|
37
48
|
end
|
38
49
|
|
39
50
|
test "should confirm password" do
|
@@ -46,12 +57,12 @@ class UserTest < ActiveSupport::TestCase
|
|
46
57
|
|
47
58
|
test "clean_up_passwords" do
|
48
59
|
user = User.new(:email => 'julien@example.com', :password => 'abc', :password_confirmation => 'def')
|
49
|
-
|
50
|
-
|
51
|
-
|
60
|
+
refute_nil user.email
|
61
|
+
refute_nil user.password
|
62
|
+
refute_nil user.password_confirmation
|
52
63
|
|
53
64
|
user.clean_up_passwords
|
54
|
-
|
65
|
+
refute_nil user.email
|
55
66
|
assert_nil user.password
|
56
67
|
assert_nil user.password_confirmation
|
57
68
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: janus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Portalier
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
KVqCN//9bevjMk5OiMi9X3Wu/GtVWDwC6OTWFWKd54KgbuWlakO8LC1SMmStnCIF
|
31
31
|
W4qpyMWMZMcB4ZN/0mUVzY5xwrislBtsmQVUSw==
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2014-
|
33
|
+
date: 2014-12-27 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: addressable
|
@@ -60,6 +60,20 @@ dependencies:
|
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: 3.0.0
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: responders
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '2.0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '2.0'
|
63
77
|
- !ruby/object:Gem::Dependency
|
64
78
|
name: sqlite3
|
65
79
|
requirement: !ruby/object:Gem::Requirement
|
metadata.gz.sig
CHANGED
Binary file
|