janus 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/README.rdoc +144 -0
  2. data/lib/janus/config.rb +26 -0
  3. data/lib/janus/controllers/confirmations_controller.rb +56 -0
  4. data/lib/janus/controllers/helpers.rb +54 -0
  5. data/lib/janus/controllers/internal_helpers.rb +33 -0
  6. data/lib/janus/controllers/passwords_controller.rb +60 -0
  7. data/lib/janus/controllers/registrations_controller.rb +55 -0
  8. data/lib/janus/controllers/sessions_controller.rb +94 -0
  9. data/lib/janus/controllers/url_helpers.rb +61 -0
  10. data/lib/janus/helper.rb +11 -0
  11. data/lib/janus/hooks/rememberable.rb +20 -0
  12. data/lib/janus/hooks/remote_authenticatable.rb +27 -0
  13. data/lib/janus/hooks/trackable.rb +3 -0
  14. data/lib/janus/hooks.rb +58 -0
  15. data/lib/janus/mailer.rb +13 -0
  16. data/lib/janus/manager.rb +97 -0
  17. data/lib/janus/models/base.rb +31 -0
  18. data/lib/janus/models/confirmable.rb +45 -0
  19. data/lib/janus/models/database_authenticatable.rb +98 -0
  20. data/lib/janus/models/rememberable.rb +54 -0
  21. data/lib/janus/models/remote_authenticatable.rb +99 -0
  22. data/lib/janus/models/remote_token.rb +17 -0
  23. data/lib/janus/models/trackable.rb +37 -0
  24. data/lib/janus/routes.rb +78 -0
  25. data/lib/janus/strategies/base.rb +40 -0
  26. data/lib/janus/strategies/database_authenticatable.rb +20 -0
  27. data/lib/janus/strategies/rememberable.rb +52 -0
  28. data/lib/janus/strategies/remote_authenticatable.rb +28 -0
  29. data/lib/janus/strategies.rb +33 -0
  30. data/lib/janus/test_helper.rb +25 -0
  31. data/lib/janus.rb +60 -0
  32. data/test/functional/home_controller_test.rb +8 -0
  33. data/test/functional/janus/mailer_test.rb +14 -0
  34. data/test/functional/janus/manager_test.rb +94 -0
  35. data/test/functional/users/confirmations_controller_test.rb +59 -0
  36. data/test/functional/users/passwords_controller_test.rb +101 -0
  37. data/test/functional/users/registrations_controller_test.rb +112 -0
  38. data/test/functional/users/sessions_controller_test.rb +100 -0
  39. data/test/functional/users_controller_test.rb +22 -0
  40. data/test/integration/users/rememberable_test.rb +32 -0
  41. data/test/integration/users/remote_test.rb +72 -0
  42. data/test/integration/users/sessions_test.rb +18 -0
  43. data/test/integration/users/trackable_test.rb +22 -0
  44. data/test/rails_app/app/controllers/application_controller.rb +9 -0
  45. data/test/rails_app/app/controllers/blogs_controller.rb +6 -0
  46. data/test/rails_app/app/controllers/home_controller.rb +4 -0
  47. data/test/rails_app/app/controllers/users/confirmations_controller.rb +3 -0
  48. data/test/rails_app/app/controllers/users/passwords_controller.rb +3 -0
  49. data/test/rails_app/app/controllers/users/registrations_controller.rb +7 -0
  50. data/test/rails_app/app/controllers/users/sessions_controller.rb +11 -0
  51. data/test/rails_app/app/controllers/users_controller.rb +9 -0
  52. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  53. data/test/rails_app/app/mailers/janus_mailer.rb +2 -0
  54. data/test/rails_app/app/models/remote_token.rb +6 -0
  55. data/test/rails_app/app/models/user.rb +8 -0
  56. data/test/rails_app/config/application.rb +42 -0
  57. data/test/rails_app/config/boot.rb +6 -0
  58. data/test/rails_app/config/environment.rb +5 -0
  59. data/test/rails_app/config/environments/development.rb +26 -0
  60. data/test/rails_app/config/environments/production.rb +49 -0
  61. data/test/rails_app/config/environments/test.rb +36 -0
  62. data/test/rails_app/config/initializers/janus.rb +11 -0
  63. data/test/rails_app/config/initializers/secret_token.rb +7 -0
  64. data/test/rails_app/config/initializers/session_store.rb +8 -0
  65. data/test/rails_app/config/routes.rb +12 -0
  66. data/test/rails_app/db/migrate/20110323153820_create_users.rb +34 -0
  67. data/test/rails_app/db/migrate/20110331153546_create_remote_tokens.rb +15 -0
  68. data/test/rails_app/db/schema.rb +45 -0
  69. data/test/rails_app/db/seeds.rb +7 -0
  70. data/test/test_helper.rb +103 -0
  71. data/test/unit/confirmable_test.rb +36 -0
  72. data/test/unit/janus_test.rb +27 -0
  73. data/test/unit/rememberable_test.rb +50 -0
  74. data/test/unit/remote_authenticatable_test.rb +37 -0
  75. data/test/unit/remote_token_test.rb +9 -0
  76. data/test/unit/reset_password_test.rb +45 -0
  77. data/test/unit/trackable_test.rb +21 -0
  78. data/test/unit/user_test.rb +60 -0
  79. metadata +232 -0
data/README.rdoc ADDED
@@ -0,0 +1,144 @@
1
+ = Janus
2
+
3
+ Janus is an authentication engine for Ruby on Rails 3 and is an alternative
4
+ to the Warden + Devise combo, without the Rack middleware. The whole project
5
+ is inspired by the Warden and Devise API but shall eventually be quite
6
+ different since everything happens within ActionDispatch and not at the Rack
7
+ level.
8
+
9
+ The main difference for now is the cross domain authentication --which allows
10
+ a user to single sign in and out across top level domains-- which required
11
+ a finer grained control over setting and unsetting a user than Warden provides.
12
+ Janus uses +login+ and +logout+ to actually sign the user in and out, while
13
+ +set_user+ and +unset_user+ will manually set the session, without dispatching
14
+ the +after_login+ and +after_logout+ hooks.
15
+
16
+ == Features
17
+
18
+ - DatabaseAuthenticatable
19
+ - RemoteAuthenticatable
20
+ - Confirmable
21
+ - Rememberable
22
+ - Trackable
23
+
24
+ Note: login through Janus::Manager#set_user won't track the user.
25
+
26
+ - authentication system with strategies and hooks
27
+ - scoped authentications with parallel authentication
28
+ - database authentication with password encryption, validation and remember me strategy
29
+ - remote authentication for cross domain sign in / sign out
30
+ - controllers: sessions, registrations, confirmations, passwords and their routes
31
+ - route generation for above controllers
32
+ - trackable hook
33
+
34
+ == TODO
35
+
36
+ - generators (janus:install, janus)
37
+ - rename RemoteAuthenticatable to something like CrossDomainAuthenticatable(?)
38
+
39
+ == Install
40
+
41
+ There is no automated way to install Janus yet, since generators are missing.
42
+ Please remember that Janus is only compatible with Rails 3.
43
+
44
+ First add the gem to your Gemfile:
45
+
46
+ $ gem 'janus', :git => git://github.com/ysbaddaden/janus.git
47
+
48
+ Configure your user models by including all or a selection of the Janus::Models
49
+ modules:
50
+
51
+ class User < ActiveRecord::Base
52
+ include Janus::Models::Base
53
+ include Janus::Models::DatabaseAuthenticatable
54
+ include Janus::Models::RemoteAuthenticatable
55
+ include Janus::Models::Confirmable
56
+ include Janus::Models::Rememberable
57
+ include Janus::Models::Trackable
58
+ end
59
+
60
+ class Admin < ActiveRecord::Base
61
+ include Janus::Models::Base
62
+ include Janus::Models::DatabaseAuthenticatable
63
+ include Janus::Models::RemoteAuthenticatable
64
+ end
65
+
66
+ Configure your routes:
67
+
68
+ Name::Application.routes.map do
69
+ janus :users, :session => true, :registration => true, :password => true, :confirmation => true
70
+ janus :admins, :session => true
71
+
72
+ root :to => "home#index"
73
+ end
74
+
75
+ Create the required controllers:
76
+
77
+ class Users::SessionsController < Janus::SessionsController
78
+ respond_to :html
79
+ end
80
+
81
+ class Users::RegistrationsController < Janus::RegistrationsController
82
+ respond_to :html
83
+ end
84
+
85
+ class Users::PasswordsController < Janus::PasswordsController
86
+ respond_to :html
87
+ end
88
+
89
+ class Users::ConfirmationssController < Janus::ConfirmationssController
90
+ respond_to :html
91
+ end
92
+
93
+ class Admins::SessionsController < Janus::SessionsController
94
+ respond_to :html
95
+ end
96
+
97
+ Copy the views from test/rails_app to your application:
98
+
99
+ mkdir name/app/views/users/
100
+ cp -r janus/test/rails_app/app/views/users/sessions name/app/views/users/
101
+ cp -r janus/test/rails_app/app/views/users/registrations name/app/views/users/
102
+ cp -r janus/test/rails_app/app/views/users/confirmations name/app/views/users/
103
+ cp -r janus/test/rails_app/app/views/users/registrations name/app/views/users/
104
+
105
+ mkdir name/app/views/admins/
106
+ cp -r janus/test/rails_app/app/views/users/sessions name/app/views/users/
107
+
108
+ Have a look to the test app in <tt>test/rails_app</tt> for additional help:
109
+
110
+ app/controllers/application_controller.rb
111
+ app/controller/users/confirmations_controller.rb
112
+ app/controller/users/passwords_controller.rb
113
+ app/controller/users/registrations_controller.rb
114
+ app/controller/users/sessions_controller.rb
115
+ app/mailers/janus_mailer.rb
116
+ app/models/remote_token.rb
117
+ app/models/user.rb
118
+ app/views/janus_mailer/confirmation_instructions.html.erb
119
+ app/views/janus_mailer/confirmation_instructions.text.erb
120
+ app/views/janus_mailer/reset_password_instructions.html.erb
121
+ app/views/janus_mailer/reset_password_instructions.text.erb
122
+ app/views/users/confirmations/new.html.erb
123
+ app/views/users/passwords/new.html.erb
124
+ app/views/users/passwords/edit.html.erb
125
+ app/views/users/registrations/new.html.erb
126
+ app/views/users/registrations/edit.html.erb
127
+ app/views/users/sessions/new.html.erb
128
+ config/initializers/janus.rb
129
+ config/locales/janus.en.yml
130
+ config/routes.rb
131
+ db/migrate/*.rb
132
+
133
+ == License
134
+
135
+ Janus is distributed under the MIT-License.
136
+
137
+ == Authors
138
+
139
+ Most of the API and some code like password encryption is copied from
140
+ Devise: http://github.com/plataformatec/devise.git and Warden:
141
+ http://github.com/hassox/warden
142
+
143
+ - Julien Portalier <ysbaddaden@gmail.com>
144
+
@@ -0,0 +1,26 @@
1
+ require 'active_support/time'
2
+
3
+ module Janus
4
+ module Config
5
+ mattr_accessor :contact_email
6
+
7
+ # DatabaseAuthenticatable
8
+ mattr_accessor :authentication_keys, :stretches, :pepper
9
+ self.authentication_keys = [:email]
10
+ self.stretches = 10
11
+
12
+ # Confirmable
13
+ mattr_accessor :confirmation_key
14
+ self.confirmation_key = :confirm_token
15
+
16
+ # Rememberable
17
+ mattr_accessor :remember_for, :extend_remember_period, :remember_across_browsers
18
+ self.remember_for = 2.weeks
19
+ self.extend_remember_period = false
20
+ # self.remember_across_browsers = false
21
+
22
+ # RemoteAuthenticatable
23
+ mattr_accessor :remote_authentication_key
24
+ self.remote_authentication_key = :remote_token
25
+ end
26
+ end
@@ -0,0 +1,56 @@
1
+ class Janus::ConfirmationsController < ApplicationController
2
+ include Janus::InternalHelpers
3
+
4
+ helper JanusHelper
5
+
6
+ def show
7
+ self.resource = resource_class.find_for_confirmation(params[resource_class.confirmation_key])
8
+
9
+ if resource
10
+ resource.confirm!
11
+
12
+ respond_to do |format|
13
+ format.html { redirect_to root_url, :notice => t('flash.janus.confirmations.edit.confirmed') }
14
+ format.any { head :ok }
15
+ end
16
+ else
17
+ respond_to do |format|
18
+ format.html do
19
+ self.resource = resource_class.new
20
+ resource.errors.add(:base, :invalid_token)
21
+ render 'new'
22
+ end
23
+
24
+ format.any { head :bad_request }
25
+ end
26
+ end
27
+ end
28
+
29
+ def new
30
+ self.resource = resource_class.new
31
+ respond_with(resource)
32
+ end
33
+
34
+ def create
35
+ self.resource = resource_class.find_for_database_authentication(params[resource_name])
36
+
37
+ if resource
38
+ JanusMailer.confirmation_instructions(resource).deliver
39
+
40
+ respond_to do |format|
41
+ format.html { redirect_to root_url, :notice => t('flash.janus.confirmations.create.email_sent') }
42
+ format.any { head :ok }
43
+ end
44
+ else
45
+ respond_to do |format|
46
+ format.html do
47
+ self.resource = resource_class.new
48
+ resource.errors.add(:base, :not_found)
49
+ render 'new'
50
+ end
51
+
52
+ format.any { head :not_found }
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,54 @@
1
+ module Janus
2
+ module Helpers
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :signed_in?
7
+
8
+ rescue_from Janus::NotAuthenticated do |exception|
9
+ respond_to do |format|
10
+ format.html { redirect_to send("new_#{exception.scope}_session_url") }
11
+ format.any { head :unauthorized }
12
+ end
13
+ end
14
+ end
15
+
16
+ def janus
17
+ @janus ||= Janus::Manager.new(request, cookies)
18
+ end
19
+
20
+ def handle_unverified_requests
21
+ janus.logout
22
+ end
23
+
24
+ def signed_in?(scope)
25
+ janus.authenticate?(scope)
26
+ end
27
+
28
+ module ClassMethods
29
+ def janus(*scopes)
30
+ scopes.each do |scope|
31
+ class_eval <<-EOV
32
+ helper_method :#{scope}_signed_in?, :current_#{scope}, :#{scope}_session
33
+
34
+ def authenticate_#{scope}!
35
+ janus.authenticate!(:#{scope})
36
+ end
37
+
38
+ def current_#{scope}
39
+ @current_#{scope} ||= janus.authenticate(:#{scope})
40
+ end
41
+
42
+ def #{scope}_signed_in?
43
+ janus.authenticate?(:#{scope})
44
+ end
45
+
46
+ def #{scope}_session
47
+ janus.session(:#{scope}) if #{scope}_signed_in?
48
+ end
49
+ EOV
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,33 @@
1
+ module Janus
2
+ module InternalHelpers
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :janus_scope, :resource, :resource_class, :resource_name
7
+ end
8
+
9
+ def authenticate!
10
+ send("authenticate_#{janus_scope}!")
11
+ end
12
+
13
+ def janus_scope
14
+ @janus_scope ||= self.class.name.split('::', 2).first.underscore.singularize
15
+ end
16
+
17
+ def resource
18
+ instance_variable_get(:"@#{janus_scope}")
19
+ end
20
+
21
+ def resource=(value)
22
+ instance_variable_set(:"@#{janus_scope}", value)
23
+ end
24
+
25
+ def resource_class
26
+ @resource_class ||= janus_scope.camelize.constantize
27
+ end
28
+
29
+ def resource_name
30
+ janus_scope
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,60 @@
1
+ class Janus::PasswordsController < ApplicationController
2
+ include Janus::InternalHelpers
3
+
4
+ helper JanusHelper
5
+
6
+ def new
7
+ self.resource = resource_class.new
8
+ end
9
+
10
+ def create
11
+ self.resource = resource_class.find_for_database_authentication(params[resource_name])
12
+
13
+ if resource
14
+ resource.generate_reset_password_token!
15
+ JanusMailer.reset_password_instructions(resource).deliver
16
+
17
+ respond_to do |format|
18
+ format.html { redirect_to root_url, :notice => t('flash.janus.passwords.create.email_sent') }
19
+ format.any { head :ok }
20
+ end
21
+ else
22
+ respond_to do |format|
23
+ format.html do
24
+ self.resource = resource_class.new
25
+ resource.errors.add(:base, :not_found)
26
+ render "new"
27
+ end
28
+ format.any { head :precondition_failed }
29
+ end
30
+ end
31
+ end
32
+
33
+ def edit
34
+ self.resource = resource_class.find_for_password_reset(params[:token])
35
+ redirect_to root_url, :alert => t('flash.janus.passwords.edit.alert') unless resource
36
+ end
37
+
38
+ def update
39
+ self.resource = resource_class.find_for_password_reset(params[resource_name][:reset_password_token])
40
+
41
+ if resource
42
+ if resource.reset_password!(params[resource_name])
43
+ respond_to do |format|
44
+ format.html { redirect_to root_url, :notice => t('flash.janus.passwords.update.password_updated') }
45
+ format.any { head :ok }
46
+ end
47
+ else
48
+ respond_to do |format|
49
+ format.html { render 'edit' }
50
+ format.any { head :precondition_failed }
51
+ end
52
+ end
53
+ else
54
+ respond_to do |format|
55
+ format.html { redirect_to root_url, :alert => t('flash.janus.passwords.update.invalid_token') }
56
+ format.any { head :precondition_failed }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,55 @@
1
+ class Janus::RegistrationsController < ApplicationController
2
+ include Janus::InternalHelpers
3
+
4
+ helper JanusHelper
5
+
6
+ before_filter :authenticate!, :except => [:new, :create]
7
+ skip_before_filter :authenticate!, :only => [:new, :create]
8
+
9
+ def new
10
+ self.resource = resource_class.new
11
+ respond_with(resource)
12
+ end
13
+
14
+ def edit
15
+ self.resource = send("current_#{janus_scope}")
16
+ respond_with(resource)
17
+ end
18
+
19
+ def create
20
+ self.resource = resource_class.new(params[resource_name])
21
+
22
+ if resource.save
23
+ janus.login(resource, :scope => janus_scope, :rememberable => true)
24
+ JanusMailer.confirmation_instructions(resource).deliver if resource.respond_to?(:confirm!)
25
+ else
26
+ resource.clean_up_passwords
27
+ end
28
+
29
+ respond_with(resource, :location => after_sign_up_url(resource))
30
+ end
31
+
32
+ def update
33
+ params[resource_name].each do |key, value|
34
+ params[resource_name].delete(key) if value.blank? && [:password, :password_confirmation].include?(key.to_sym)
35
+ end
36
+
37
+ self.resource = send("current_#{janus_scope}")
38
+ resource.current_password = ""
39
+ resource.clean_up_passwords unless resource.update_attributes(params[resource_name])
40
+ respond_with(resource, :location => after_sign_up_url(resource))
41
+ end
42
+
43
+ def destroy
44
+ self.resource = send("current_#{janus_scope}")
45
+ janus.unset_user(janus_scope) if resource.destroy
46
+
47
+ respond_with(resource) do |format|
48
+ format.html { redirect_to root_url }
49
+ end
50
+ end
51
+
52
+ def after_sign_up_url(user)
53
+ user
54
+ end
55
+ end
@@ -0,0 +1,94 @@
1
+ require 'addressable/uri'
2
+
3
+ class Janus::SessionsController < ApplicationController
4
+ include Janus::InternalHelpers
5
+ # include Janus::UrlHelpers
6
+
7
+ helper JanusHelper
8
+ # skip_before_filter :authenticate_user!
9
+
10
+ def new
11
+ params[:return_to] ||= request.env["HTTP_REFERER"]
12
+
13
+ if signed_in?(janus_scope)
14
+ redirect_after_sign_in(send("current_#{janus_scope}"))
15
+ else
16
+ self.resource = resource_class.new
17
+ respond_with(resource)
18
+ end
19
+ end
20
+
21
+ def create
22
+ self.resource = resource_class.find_for_database_authentication(params[resource_name])
23
+
24
+ if resource && resource.valid_password?(params[resource_name][:password])
25
+ janus.login(resource, :scope => janus_scope, :rememberable => params[:remember_me])
26
+
27
+ respond_to do |format|
28
+ format.html { redirect_after_sign_in(resource) }
29
+ format.any { head :ok }
30
+ end
31
+ else
32
+ respond_to do |format|
33
+ format.html do
34
+ self.resource ||= resource_class.new(params[resource_name])
35
+ resource.clean_up_passwords
36
+ resource.errors.add(:base, :not_found)
37
+
38
+ render "new", :status => :unauthorized
39
+ end
40
+ format.any { head :unauthorized }
41
+ end
42
+ end
43
+ end
44
+
45
+ def destroy
46
+ janus.logout(janus_scope)
47
+
48
+ respond_to do |format|
49
+ format.html { redirect_to after_sign_out_url(janus_scope) }
50
+ format.any { head :ok }
51
+ end
52
+ end
53
+
54
+ def after_sign_in_url(user)
55
+ user
56
+ end
57
+
58
+ def after_sign_out_url(scope)
59
+ root_url
60
+ end
61
+
62
+ # Returns true if remote host is known and redirect with an auth_token should
63
+ # be allowed or not. It must be overwritten by child class since it always
64
+ # returns true by default.
65
+ def valid_remote_host?(host)
66
+ true
67
+ end
68
+
69
+ # Either redirects the user to after_sign_in_url or to
70
+ # <tt>params[:return_to]</tt>. If return_to is an absolute URL, and not just
71
+ # a path, valid_remote_host? will be invoked to check if we should redirect
72
+ # to this URL or not --which is moslty of use for RemoteAuthenticatable to
73
+ # securize auth tokens from unknown domains.
74
+ def redirect_after_sign_in(user)
75
+ unless params[:return_to].blank?
76
+ return_to = Addressable::URI.parse(params[:return_to])
77
+
78
+ if return_to.host.nil? || return_to.host == request.host
79
+ redirect_to params[:return_to]
80
+ return
81
+ elsif valid_remote_host?(return_to.host)
82
+ if user.class.include?(Janus::Models::RemoteAuthenticatable)
83
+ query = return_to.query_values || {}
84
+ return_to.query_values = query.merge(user.class.remote_authentication_key => user.generate_remote_token!)
85
+ end
86
+
87
+ redirect_to return_to.to_s
88
+ return
89
+ end
90
+ end
91
+
92
+ redirect_to after_sign_in_url(user)
93
+ end
94
+ end
@@ -0,0 +1,61 @@
1
+ module Janus
2
+ module UrlHelpers
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :session_url, :session_path, :new_session_url, :new_session_path, :destroy_session_url, :destroy_session_path,
7
+ :registration_url, :registration_path, :new_registration_url, :new_registration_path, :edit_registration_url, :edit_registration_path,
8
+ :confirmation_url, :confirmation_path, :new_confirmation_url, :new_confirmation_path,
9
+ :password_url, :password_path, :new_password_url, :new_password_path, :edit_password_url, :edit_password_path
10
+ end
11
+
12
+ [:url, :path].each do |suffix|
13
+ define_method("new_session_#{suffix}") do |scope, *args|
14
+ send("new_#{scope}_session_#{suffix}", *args)
15
+ end
16
+
17
+ define_method("session_#{suffix}") do |scope, *args|
18
+ send("#{scope}_session_#{suffix}", *args)
19
+ end
20
+
21
+ define_method("destroy_session_#{suffix}") do |scope, *args|
22
+ send("destroy_#{scope}_session_#{suffix}", *args)
23
+ end
24
+
25
+
26
+ define_method("registration_#{suffix}") do |scope, *args|
27
+ send("#{scope}_registration_#{suffix}", *args)
28
+ end
29
+
30
+ define_method("new_registration_#{suffix}") do |scope, *args|
31
+ send("new_#{scope}_registration_#{suffix}", *args)
32
+ end
33
+
34
+ define_method("edit_registration_#{suffix}") do |scope, *args|
35
+ send("edit_#{scope}_registration_#{suffix}", *args)
36
+ end
37
+
38
+
39
+ define_method("confirmation_#{suffix}") do |scope, *args|
40
+ send("#{scope}_confirmation_#{suffix}", *args)
41
+ end
42
+
43
+ define_method("new_confirmation_#{suffix}") do |scope, *args|
44
+ send("new_#{scope}_confirmation_#{suffix}", *args)
45
+ end
46
+
47
+
48
+ define_method("password_#{suffix}") do |scope, *args|
49
+ send("#{scope}_password_#{suffix}", *args)
50
+ end
51
+
52
+ define_method("new_password_#{suffix}") do |scope, *args|
53
+ send("new_#{scope}_password_#{suffix}", *args)
54
+ end
55
+
56
+ define_method("edit_password_#{suffix}") do |scope, *args|
57
+ send("edit_#{scope}_password_#{suffix}", *args)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,11 @@
1
+ module JanusHelper
2
+ def janus_error_messages
3
+ return "" if resource.errors.empty?
4
+
5
+ content_tag :div, :id => 'error_explanation' do
6
+ content_tag :ul do
7
+ resource.errors.full_messages.map { |message| content_tag :li, message }.join.html_safe
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ Janus::Manager.after_login do |user, manager, options|
2
+ if options[:rememberable] && user.respond_to?(:remember_me!)
3
+ user.remember_me!
4
+
5
+ remember_cookie_name = Janus::Strategies::Rememberable.remember_cookie_name(options[:scope])
6
+ manager.cookies[remember_cookie_name] = {
7
+ :value => user.remember_token,
8
+ :expires => user.class.remember_for.from_now
9
+ }
10
+ end
11
+ end
12
+
13
+ Janus::Manager.after_logout do |user, manager, options|
14
+ if user.respond_to?(:forget_me!)
15
+ user.forget_me!
16
+
17
+ remember_cookie_name = Janus::Strategies::Rememberable.remember_cookie_name(options[:scope])
18
+ manager.cookies.delete(remember_cookie_name)
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ Janus::Manager.after_login do |user, manager, options|
2
+ if user.respond_to?(:generate_session_token!)
3
+ user.generate_session_token! if user.session_token.nil?
4
+
5
+ session = manager.session(options[:scope])
6
+ session[:session_token] = user.session_token
7
+ end
8
+ end
9
+
10
+ Janus::Manager.after_authenticate do |user, manager, options|
11
+ if user.respond_to?(:session_token)
12
+ session = manager.session(options[:scope])
13
+ session[:session_token] = user.session_token
14
+ end
15
+ end
16
+
17
+ Janus::Manager.after_logout do |user, manager, options|
18
+ user.destroy_session_token! if user.respond_to?(:destroy_session_token!)
19
+ end
20
+
21
+ Janus::Manager.after_fetch do |user, manager, options|
22
+ if user.respond_to?(:session_token)
23
+ scope = options[:scope]
24
+ session = manager.session(scope)
25
+ manager.unset_user(scope) unless session[:session_token] == user.session_token
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ Janus::Manager.after_login do |user, manager, options|
2
+ user.track!(manager.request.remote_ip) if user.respond_to?(:track!)
3
+ end