sorcery 0.8.6 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sorcery might be problematic. Click here for more details.

Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.travis.yml +75 -14
  4. data/CHANGELOG.md +23 -1
  5. data/Gemfile +1 -0
  6. data/README.md +137 -86
  7. data/gemfiles/active_record-rails40.gemfile +7 -0
  8. data/gemfiles/active_record-rails41.gemfile +3 -2
  9. data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
  10. data/gemfiles/mongo_mapper-rails41.gemfile +2 -1
  11. data/gemfiles/mongoid-rails40.gemfile +9 -0
  12. data/gemfiles/mongoid-rails41.gemfile +3 -5
  13. data/gemfiles/mongoid3-rails32.gemfile +9 -0
  14. data/lib/generators/sorcery/USAGE +1 -1
  15. data/lib/generators/sorcery/install_generator.rb +19 -5
  16. data/lib/generators/sorcery/templates/initializer.rb +34 -9
  17. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -1
  18. data/lib/generators/sorcery/templates/migration/core.rb +2 -2
  19. data/lib/generators/sorcery/templates/migration/external.rb +3 -1
  20. data/lib/sorcery.rb +75 -43
  21. data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
  22. data/lib/sorcery/adapters/base_adapter.rb +30 -0
  23. data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
  24. data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
  25. data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
  26. data/lib/sorcery/controller.rb +5 -64
  27. data/lib/sorcery/controller/config.rb +65 -0
  28. data/lib/sorcery/controller/submodules/activity_logging.rb +16 -21
  29. data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
  30. data/lib/sorcery/controller/submodules/external.rb +8 -28
  31. data/lib/sorcery/controller/submodules/remember_me.rb +4 -4
  32. data/lib/sorcery/controller/submodules/session_timeout.rb +10 -6
  33. data/lib/sorcery/model.rb +43 -175
  34. data/lib/sorcery/model/config.rb +96 -0
  35. data/lib/sorcery/model/submodules/activity_logging.rb +29 -36
  36. data/lib/sorcery/model/submodules/brute_force_protection.rb +21 -37
  37. data/lib/sorcery/model/submodules/external.rb +53 -9
  38. data/lib/sorcery/model/submodules/remember_me.rb +12 -31
  39. data/lib/sorcery/model/submodules/reset_password.rb +21 -39
  40. data/lib/sorcery/model/submodules/user_activation.rb +21 -63
  41. data/lib/sorcery/model/temporary_token.rb +4 -4
  42. data/lib/sorcery/providers/base.rb +11 -0
  43. data/lib/sorcery/providers/facebook.rb +1 -1
  44. data/lib/sorcery/providers/github.rb +1 -1
  45. data/lib/sorcery/providers/google.rb +1 -1
  46. data/lib/sorcery/providers/heroku.rb +57 -0
  47. data/lib/sorcery/providers/jira.rb +77 -0
  48. data/lib/sorcery/providers/linkedin.rb +1 -1
  49. data/lib/sorcery/providers/liveid.rb +1 -1
  50. data/lib/sorcery/providers/salesforce.rb +50 -0
  51. data/lib/sorcery/providers/twitter.rb +1 -1
  52. data/lib/sorcery/providers/vk.rb +6 -4
  53. data/lib/sorcery/providers/xing.rb +1 -1
  54. data/lib/sorcery/test_helpers/internal.rb +7 -3
  55. data/lib/sorcery/test_helpers/rails/controller.rb +5 -1
  56. data/lib/sorcery/version.rb +3 -0
  57. data/sorcery.gemspec +6 -2
  58. data/spec/active_record/user_activity_logging_spec.rb +9 -0
  59. data/spec/controllers/controller_activity_logging_spec.rb +124 -0
  60. data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
  61. data/spec/{active_record → controllers}/controller_http_basic_auth_spec.rb +14 -11
  62. data/spec/{active_record → controllers}/controller_oauth2_spec.rb +128 -56
  63. data/spec/{active_record → controllers}/controller_oauth_spec.rb +94 -70
  64. data/spec/{active_record → controllers}/controller_remember_me_spec.rb +32 -12
  65. data/spec/{active_record → controllers}/controller_session_timeout_spec.rb +15 -5
  66. data/spec/{shared_examples/controller_shared_examples.rb → controllers/controller_spec.rb} +34 -19
  67. data/spec/{datamapper → data_mapper}/user_activation_spec.rb +1 -1
  68. data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
  69. data/spec/{datamapper → data_mapper}/user_brute_force_protection_spec.rb +1 -1
  70. data/spec/{datamapper → data_mapper}/user_oauth_spec.rb +1 -1
  71. data/spec/{datamapper → data_mapper}/user_remember_me_spec.rb +1 -1
  72. data/spec/{datamapper → data_mapper}/user_reset_password_spec.rb +1 -1
  73. data/spec/{datamapper → data_mapper}/user_spec.rb +1 -1
  74. data/spec/mongoid/user_spec.rb +13 -0
  75. data/spec/orm/active_record.rb +12 -0
  76. data/spec/orm/{datamapper.rb → data_mapper.rb} +16 -2
  77. data/spec/orm/mongo_mapper.rb +0 -1
  78. data/spec/orm/mongoid.rb +4 -0
  79. data/spec/rails_app/app/controllers/sorcery_controller.rb +62 -1
  80. data/spec/rails_app/app/{datamapper → data_mapper}/authentication.rb +0 -0
  81. data/spec/rails_app/app/{datamapper → data_mapper}/user.rb +0 -0
  82. data/spec/rails_app/app/mongo_mapper/user.rb +2 -0
  83. data/spec/rails_app/config/routes.rb +9 -0
  84. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +2 -2
  85. data/spec/shared_examples/user_activation_shared_examples.rb +7 -7
  86. data/spec/shared_examples/user_activity_logging_shared_examples.rb +73 -5
  87. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +127 -9
  88. data/spec/shared_examples/user_oauth_shared_examples.rb +3 -6
  89. data/spec/shared_examples/user_remember_me_shared_examples.rb +6 -3
  90. data/spec/shared_examples/user_reset_password_shared_examples.rb +10 -10
  91. data/spec/shared_examples/user_shared_examples.rb +117 -30
  92. data/spec/spec_helper.rb +7 -22
  93. metadata +36 -58
  94. data/Gemfile.rails4 +0 -22
  95. data/VERSION +0 -1
  96. data/lib/sorcery/model/adapters/active_record.rb +0 -54
  97. data/lib/sorcery/model/adapters/datamapper.rb +0 -123
  98. data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -60
  99. data/lib/sorcery/model/adapters/mongoid.rb +0 -88
  100. data/lib/sorcery/test_helpers/rails.rb +0 -7
  101. data/spec/active_record/controller_activity_logging_spec.rb +0 -29
  102. data/spec/active_record/controller_brute_force_protection_spec.rb +0 -158
  103. data/spec/active_record/controller_spec.rb +0 -8
  104. data/spec/active_record/integration_spec.rb +0 -23
  105. data/spec/datamapper/controller_activity_logging_spec.rb +0 -17
  106. data/spec/datamapper/controller_spec.rb +0 -8
  107. data/spec/datamapper/user_activity_logging_spec.rb +0 -9
  108. data/spec/mongo_mapper/controller_spec.rb +0 -8
  109. data/spec/mongoid/controller_activity_logging_spec.rb +0 -16
  110. data/spec/mongoid/controller_spec.rb +0 -8
  111. data/spec/rails_app/public/404.html +0 -26
  112. data/spec/rails_app/public/422.html +0 -26
  113. data/spec/rails_app/public/500.html +0 -26
  114. data/spec/rails_app/public/favicon.ico +0 -0
  115. data/spec/rails_app/public/images/rails.png +0 -0
  116. data/spec/rails_app/public/javascripts/application.js +0 -2
  117. data/spec/rails_app/public/javascripts/controls.js +0 -965
  118. data/spec/rails_app/public/javascripts/dragdrop.js +0 -974
  119. data/spec/rails_app/public/javascripts/effects.js +0 -1123
  120. data/spec/rails_app/public/javascripts/prototype.js +0 -6001
  121. data/spec/rails_app/public/javascripts/rails.js +0 -175
  122. data/spec/rails_app/public/robots.txt +0 -5
  123. data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
  124. data/spec/shared_examples/controller_activity_logging_shared_examples.rb +0 -125
  125. data/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -52
  126. data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -62
@@ -0,0 +1,30 @@
1
+ module Sorcery
2
+ module Adapters
3
+ class BaseAdapter
4
+ def initialize(model)
5
+ @model = model
6
+ end
7
+
8
+ def self.from(klass)
9
+ @klass = klass
10
+ self
11
+ end
12
+
13
+ def self.delete_all
14
+ @klass.delete_all
15
+ end
16
+
17
+ def self.find(id)
18
+ find_by_id(id)
19
+ end
20
+
21
+ def increment(field)
22
+ @model.increment(field)
23
+ end
24
+
25
+ def update_attribute(name, value)
26
+ update_attributes(name => value)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,176 @@
1
+ module Sorcery
2
+ module Adapters
3
+ class DataMapperAdapter < BaseAdapter
4
+ module Wrapper
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ sorcery_adapter.verify_submodules_compatibility!
9
+ end
10
+
11
+ def sorcery_adapter
12
+ @sorcery_adapter ||= Sorcery::Adapters::DataMapperAdapter.new(self)
13
+ end
14
+
15
+ module ClassMethods
16
+ def sorcery_adapter
17
+ Sorcery::Adapters::DataMapperAdapter.from(self)
18
+ end
19
+ end
20
+ end
21
+
22
+ def increment(attr)
23
+ @model[attr] ||= 0
24
+ @model[attr] += 1
25
+ @model
26
+ end
27
+
28
+ def update_attributes(attrs)
29
+ attrs.each do |name, value|
30
+ value = value.utc if value.is_a?(ActiveSupport::TimeWithZone)
31
+ @model.send(:"#{name}=", value)
32
+ end
33
+ @model.class.get(@model.id).update(attrs)
34
+ end
35
+
36
+ def update_attribute(name, value)
37
+ update_attributes(name => value)
38
+ end
39
+
40
+ def save(options = {})
41
+ if options.key?(:validate) && !options[:validate]
42
+ @model.save!
43
+ else
44
+ @model.save
45
+ end
46
+ end
47
+
48
+ class << self
49
+ def define_field(name, type, options={})
50
+ @klass.property name, type, options.slice(:length, :default)
51
+
52
+ # Workaround local timezone retrieval problem NOTE dm-core issue #193
53
+ if type == Time
54
+ @klass.send(:alias_method, "orig_#{name}", name)
55
+ @klass.send :define_method, name do
56
+ t = send("orig_#{name}")
57
+ t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
58
+ end
59
+ end
60
+ end
61
+
62
+ def define_callback(time, event, method_name, options={})
63
+ event = :valid? if event == :validation
64
+ condition = options[:if]
65
+
66
+ user_klass = @klass
67
+
68
+ block = Proc.new do |record|
69
+ if condition.nil?
70
+ send(method_name)
71
+ elsif condition.respond_to?(:call)
72
+ send(method_name) if condition.call(self)
73
+ elsif condition.is_a? Symbol
74
+ send(method_name) if send(condition)
75
+ end
76
+ end
77
+
78
+ @klass.send(time, event, &block)
79
+ end
80
+
81
+ def find(id)
82
+ @klass.get(id)
83
+ end
84
+
85
+ def delete_all
86
+ @klass.destroy
87
+ end
88
+
89
+ # NOTE
90
+ # DM Adapter dependent
91
+ # DM creates MySQL tables case insensitive by default
92
+ # http://datamapper.lighthouseapp.com/projects/20609-datamapper/tickets/1105
93
+ def find_by_credentials(credentials)
94
+ credential = credentials[0].dup
95
+ credential.downcase! if @klass.sorcery_config.downcase_username_before_authenticating
96
+ @klass.sorcery_config.username_attribute_names.each do |name|
97
+ @user = @klass.first(name => credential)
98
+ break if @user
99
+ end
100
+ !!@user ? @klass.get(@user.id) : nil
101
+ end
102
+
103
+ def find_by_oauth_credentials(provider, uid)
104
+ @user_config = ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
105
+ user = @klass.first(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid)
106
+ !!user ? @klass.get(user.id) : nil
107
+ end
108
+
109
+ def find_by_token(token_attr_name, token)
110
+ @klass.first(token_attr_name => token)
111
+ end
112
+
113
+ def find_by_id(id)
114
+ @klass.get(id)
115
+ rescue ::DataMapper::ObjectNotFoundError
116
+ nil
117
+ end
118
+
119
+ def find_by_activation_token(token)
120
+ user = @klass.first(@klass.sorcery_config.activation_token_attribute_name => token)
121
+ !!user ? @klass.get(user.id) : nil
122
+ end
123
+
124
+ def find_by_remember_me_token(token)
125
+ user = @klass.first(@klass.sorcery_config.remember_me_token_attribute_name => token)
126
+ !!user ? @klass.get(user.id) : nil
127
+ end
128
+
129
+ def find_by_username(username)
130
+ user = nil
131
+ @klass.sorcery_config.username_attribute_names.each do |name|
132
+ user = @klass.first(name => username)
133
+ break if user
134
+ end
135
+ !!user ? @klass.get(user.id) : nil
136
+ end
137
+
138
+ def transaction(&blk)
139
+ @klass.tap(&blk)
140
+ end
141
+
142
+ def find_by_sorcery_token(token_attr_name, token)
143
+ user = @klass.first(token_attr_name => token)
144
+ !!user ? @klass.get(user.id) : nil
145
+ end
146
+
147
+ def find_by_email(email)
148
+ user = @klass.first(@klass.sorcery_config.email_attribute_name => email)
149
+ !!user ? @klass.get(user.id) : nil
150
+ end
151
+
152
+ # NOTE
153
+ # DM Adapter dependent
154
+ def get_current_users
155
+ unless @klass.repository.adapter.is_a?(::DataMapper::Adapters::MysqlAdapter)
156
+ raise 'Unsupported DataMapper Adapter'
157
+ end
158
+ config = @klass.sorcery_config
159
+ ret = @klass.all(config.last_logout_at_attribute_name => nil) |
160
+ @klass.all(config.last_activity_at_attribute_name.gt => config.last_logout_at_attribute_name)
161
+ ret = ret.all(config.last_activity_at_attribute_name.not => nil)
162
+ ret = ret.all(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc)
163
+ ret
164
+ end
165
+
166
+ def verify_submodules_compatibility!
167
+ active_submodules = [::Sorcery::Controller::Config.submodules].flatten
168
+
169
+ if active_submodules.include?(:activity_logging) && !repository.adapter.is_a?(::DataMapper::Adapters::MysqlAdapter)
170
+ raise "DataMapper adapter compatibility error, please check documentation"
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,110 @@
1
+ module Sorcery
2
+ module Adapters
3
+ class MongoMapperAdapter < BaseAdapter
4
+ module Wrapper
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ extend Sorcery::Model
9
+ end
10
+
11
+ def sorcery_adapter
12
+ @sorcery_adapter ||= Sorcery::Adapters::MongoMapperAdapter.new(self)
13
+ end
14
+
15
+ module ClassMethods
16
+ def sorcery_adapter
17
+ Sorcery::Adapters::MongoMapperAdapter.from(self)
18
+ end
19
+ end
20
+ end
21
+
22
+ def increment(attr)
23
+ @model[attr] ||= 0
24
+ @model[attr] += 1
25
+ @model.class.increment(@model.id, attr => 1)
26
+ end
27
+
28
+ def save(options = {})
29
+ if options.delete(:raise_on_failure) && options[:validate] != false
30
+ @model.save! options
31
+ else
32
+ @model.save options
33
+ end
34
+ end
35
+
36
+ def update_attributes(attrs)
37
+ @model.update_attributes(attrs)
38
+ end
39
+
40
+ class << self
41
+ def define_field(name, type, options={})
42
+ @klass.key name, type, options.slice(:default)
43
+ end
44
+
45
+ def define_callback(time, event, method_name, options={})
46
+ @klass.send "#{time}_#{event}", method_name, options.slice(:if)
47
+ end
48
+
49
+ def credential_regex(credential)
50
+ return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@klass.sorcery_config.downcase_username_before_authenticating)
51
+ return credential
52
+ end
53
+
54
+ def find_by_credentials(credentials)
55
+ user = nil
56
+ @klass.sorcery_config.username_attribute_names.each do |attribute|
57
+ user = @klass.where(attribute => credential_regex(credentials[0])).first
58
+ break if user
59
+ end
60
+ user
61
+ end
62
+
63
+ def find_by_oauth_credentials(provider, uid)
64
+ @user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
65
+ @klass.where(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid).first
66
+ end
67
+
68
+ def find_by_id(id)
69
+ @klass.find(id)
70
+ end
71
+
72
+ def find_by_username(username)
73
+ if @klass.sorcery_config.downcase_username_before_authenticating
74
+ username = username.downcase
75
+ end
76
+
77
+ @klass.sorcery_config.username_attribute_names.each do |attribute|
78
+ result = @klass.where(attribute => username).first
79
+ return result if result
80
+ end
81
+ end
82
+
83
+ def find_by_activation_token(token)
84
+ @klass.where(@klass.sorcery_config.activation_token_attribute_name => token).first
85
+ end
86
+
87
+ def find_by_email(email)
88
+ @klass.where(@klass.sorcery_config.email_attribute_name => email).first
89
+ end
90
+
91
+ def find_by_token(token_attr_name, token)
92
+ @klass.where(token_attr_name => token).first
93
+ end
94
+
95
+ def transaction(&blk)
96
+ @klass.tap(&blk)
97
+ end
98
+
99
+ def find_by_sorcery_token(token_attr_name, token)
100
+ @klass.where(token_attr_name => token).first
101
+ end
102
+
103
+ def get_current_users
104
+ raise "this method is unavailable for MongoMapper"
105
+ end
106
+
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,97 @@
1
+ module Sorcery
2
+ module Adapters
3
+ class MongoidAdapter < BaseAdapter
4
+ def increment(attr)
5
+ mongoid_4? ? @model.inc(attr => 1) : @model.inc(attr, 1)
6
+ end
7
+
8
+ def update_attributes(attrs)
9
+ attrs.each do |name, value|
10
+ attrs[name] = value.utc if value.is_a?(ActiveSupport::TimeWithZone)
11
+ @model.send(:"#{name}=", value)
12
+ end
13
+ @model.class.where(:_id => @model.id).update_all(attrs)
14
+ end
15
+
16
+ def update_attribute(name, value)
17
+ update_attributes(name => value)
18
+ end
19
+
20
+ def save(options = {})
21
+ mthd = options.delete(:raise_on_failure) ? :save! : :save
22
+ @model.send(mthd, options)
23
+ end
24
+
25
+ def mongoid_4?
26
+ Gem::Version.new(::Mongoid::VERSION) >= Gem::Version.new("4.0.0.alpha")
27
+ end
28
+
29
+ class << self
30
+
31
+ def define_field(name, type, options={})
32
+ @klass.field name, options.slice(:default).merge(type: type)
33
+ end
34
+
35
+ def define_callback(time, event, method_name, options={})
36
+ @klass.send "#{time}_#{event}", method_name, options.slice(:if)
37
+ end
38
+
39
+ def credential_regex(credential)
40
+ return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@klass.sorcery_config.downcase_username_before_authenticating)
41
+ credential
42
+ end
43
+
44
+ def find_by_credentials(credentials)
45
+ @klass.sorcery_config.username_attribute_names.each do |attribute|
46
+ @user = @klass.where(attribute => credential_regex(credentials[0])).first
47
+ break if @user
48
+ end
49
+ @user
50
+ end
51
+
52
+ def find_by_oauth_credentials(provider, uid)
53
+ @user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
54
+ @klass.where(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid).first
55
+ end
56
+
57
+ def find_by_activation_token(token)
58
+ @klass.where(@klass.sorcery_config.activation_token_attribute_name => token).first
59
+ end
60
+
61
+ def find_by_remember_me_token(token)
62
+ @klass.where(@klass.sorcery_config.remember_me_token_attribute_name => token).first
63
+ end
64
+
65
+ def transaction(&blk)
66
+ tap(&blk)
67
+ end
68
+
69
+ def find_by_id(id)
70
+ @klass.find(id)
71
+ rescue ::Mongoid::Errors::DocumentNotFound
72
+ nil
73
+ end
74
+
75
+ def find_by_username(username)
76
+ query = @klass.sorcery_config.username_attribute_names.map {|name| {name => username}}
77
+ @klass.any_of(*query).first
78
+ end
79
+
80
+ def find_by_token(token_attr_name, token)
81
+ @klass.where(token_attr_name => token).first
82
+ end
83
+
84
+ def find_by_email(email)
85
+ @klass.where(@klass.sorcery_config.email_attribute_name => email).first
86
+ end
87
+
88
+ def get_current_users
89
+ config = @klass.sorcery_config
90
+ @klass.where(config.last_activity_at_attribute_name.ne => nil) \
91
+ .where("this.#{config.last_logout_at_attribute_name} == null || this.#{config.last_activity_at_attribute_name} > this.#{config.last_logout_at_attribute_name}") \
92
+ .where(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc).order_by([:_id,:asc])
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -103,7 +103,7 @@ module Sorcery
103
103
  # @param [<User-Model>] user the user instance.
104
104
  # @return - do not depend on the return value.
105
105
  def auto_login(user, should_remember = false)
106
- session[:user_id] = user.id
106
+ session[:user_id] = user.id.to_s
107
107
  @current_user = user
108
108
  end
109
109
 
@@ -126,7 +126,9 @@ module Sorcery
126
126
  end
127
127
 
128
128
  def login_from_session
129
- @current_user = (user_class.find_by_id(session[:user_id]) if session[:user_id]) || nil
129
+ @current_user = if session[:user_id]
130
+ user_class.sorcery_adapter.find_by_id(session[:user_id])
131
+ end
130
132
  end
131
133
 
132
134
  def after_login!(user, credentials = [])
@@ -151,66 +153,5 @@ module Sorcery
151
153
 
152
154
  end
153
155
 
154
- module Config
155
- class << self
156
- attr_accessor :submodules,
157
- :user_class, # what class to use as the user class.
158
- :not_authenticated_action, # what controller action to call for non-authenticated users.
159
-
160
- :save_return_to_url, # when a non logged in user tries to enter a page that requires
161
- # login, save the URL he wanted to reach,
162
- # and send him there after login.
163
-
164
- :cookie_domain, # set domain option for cookies
165
-
166
- :login_sources,
167
- :after_login,
168
- :after_failed_login,
169
- :before_logout,
170
- :after_logout
171
-
172
- def init!
173
- @defaults = {
174
- :@user_class => nil,
175
- :@submodules => [],
176
- :@not_authenticated_action => :not_authenticated,
177
- :@login_sources => [],
178
- :@after_login => [],
179
- :@after_failed_login => [],
180
- :@before_logout => [],
181
- :@after_logout => [],
182
- :@save_return_to_url => true,
183
- :@cookie_domain => nil
184
- }
185
- end
186
-
187
- # Resets all configuration options to their default values.
188
- def reset!
189
- @defaults.each do |k,v|
190
- instance_variable_set(k,v)
191
- end
192
- end
193
-
194
- def update!
195
- @defaults.each do |k,v|
196
- instance_variable_set(k,v) if !instance_variable_defined?(k)
197
- end
198
- end
199
-
200
- def user_config(&blk)
201
- block_given? ? @user_config = blk : @user_config
202
- end
203
-
204
- def configure(&blk)
205
- @configure_blk = blk
206
- end
207
-
208
- def configure!
209
- @configure_blk.call(self) if @configure_blk
210
- end
211
- end
212
- init!
213
- reset!
214
- end
215
- end
156
+ end
216
157
  end