authlogic-nicho 6.5

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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/lib/authlogic/acts_as_authentic/base.rb +116 -0
  3. data/lib/authlogic/acts_as_authentic/email.rb +30 -0
  4. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +85 -0
  5. data/lib/authlogic/acts_as_authentic/login.rb +63 -0
  6. data/lib/authlogic/acts_as_authentic/magic_columns.rb +38 -0
  7. data/lib/authlogic/acts_as_authentic/password.rb +357 -0
  8. data/lib/authlogic/acts_as_authentic/perishable_token.rb +122 -0
  9. data/lib/authlogic/acts_as_authentic/persistence_token.rb +70 -0
  10. data/lib/authlogic/acts_as_authentic/queries/case_sensitivity.rb +53 -0
  11. data/lib/authlogic/acts_as_authentic/queries/find_with_case.rb +83 -0
  12. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +186 -0
  13. data/lib/authlogic/acts_as_authentic/single_access_token.rb +83 -0
  14. data/lib/authlogic/config.rb +43 -0
  15. data/lib/authlogic/controller_adapters/abstract_adapter.rb +119 -0
  16. data/lib/authlogic/controller_adapters/rack_adapter.rb +72 -0
  17. data/lib/authlogic/controller_adapters/rails_adapter.rb +47 -0
  18. data/lib/authlogic/controller_adapters/sinatra_adapter.rb +67 -0
  19. data/lib/authlogic/cookie_credentials.rb +63 -0
  20. data/lib/authlogic/crypto_providers/bcrypt.rb +113 -0
  21. data/lib/authlogic/crypto_providers/md5/v2.rb +35 -0
  22. data/lib/authlogic/crypto_providers/md5.rb +36 -0
  23. data/lib/authlogic/crypto_providers/scrypt.rb +92 -0
  24. data/lib/authlogic/crypto_providers/sha1/v2.rb +41 -0
  25. data/lib/authlogic/crypto_providers/sha1.rb +42 -0
  26. data/lib/authlogic/crypto_providers/sha256/v2.rb +58 -0
  27. data/lib/authlogic/crypto_providers/sha256.rb +59 -0
  28. data/lib/authlogic/crypto_providers/sha512/v2.rb +39 -0
  29. data/lib/authlogic/crypto_providers/sha512.rb +38 -0
  30. data/lib/authlogic/crypto_providers.rb +87 -0
  31. data/lib/authlogic/errors.rb +50 -0
  32. data/lib/authlogic/i18n/translator.rb +18 -0
  33. data/lib/authlogic/i18n.rb +100 -0
  34. data/lib/authlogic/random.rb +18 -0
  35. data/lib/authlogic/session/base.rb +2207 -0
  36. data/lib/authlogic/session/magic_column/assigns_last_request_at.rb +46 -0
  37. data/lib/authlogic/test_case/mock_api_controller.rb +52 -0
  38. data/lib/authlogic/test_case/mock_controller.rb +58 -0
  39. data/lib/authlogic/test_case/mock_cookie_jar.rb +109 -0
  40. data/lib/authlogic/test_case/mock_logger.rb +12 -0
  41. data/lib/authlogic/test_case/mock_request.rb +35 -0
  42. data/lib/authlogic/test_case/rails_request_adapter.rb +39 -0
  43. data/lib/authlogic/test_case.rb +215 -0
  44. data/lib/authlogic/version.rb +22 -0
  45. data/lib/authlogic.rb +44 -0
  46. metadata +382 -0
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ module Session
5
+ module MagicColumn
6
+ # Assigns the current time to the `last_request_at` attribute.
7
+ #
8
+ # 1. The `last_request_at` column must exist
9
+ # 2. Assignment can be disabled on a per-controller basis
10
+ # 3. Assignment will not happen more often than `last_request_at_threshold`
11
+ # seconds.
12
+ #
13
+ # - current_time - a `Time`
14
+ # - record - eg. a `User`
15
+ # - controller - an `Authlogic::ControllerAdapters::AbstractAdapter`
16
+ # - last_request_at_threshold - integer - seconds
17
+ #
18
+ # @api private
19
+ class AssignsLastRequestAt
20
+ def initialize(current_time, record, controller, last_request_at_threshold)
21
+ @current_time = current_time
22
+ @record = record
23
+ @controller = controller
24
+ @last_request_at_threshold = last_request_at_threshold
25
+ end
26
+
27
+ def assign
28
+ return unless assign?
29
+ @record.last_request_at = @current_time
30
+ end
31
+
32
+ private
33
+
34
+ # @api private
35
+ def assign?
36
+ @record &&
37
+ @record.class.column_names.include?("last_request_at") &&
38
+ @controller.last_request_update_allowed? && (
39
+ @record.last_request_at.blank? ||
40
+ @last_request_at_threshold.to_i.seconds.ago >= @record.last_request_at
41
+ )
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ module TestCase
5
+ # Basically acts like an API controller but doesn't do anything.
6
+ # Authlogic can interact with this, do it's thing and then you can look at
7
+ # the controller object to see if anything changed.
8
+ class MockAPIController < ControllerAdapters::AbstractAdapter
9
+ attr_writer :request_content_type
10
+
11
+ def initialize
12
+ end
13
+
14
+ # Expected API controller has no cookies method.
15
+ undef :cookies
16
+
17
+ def cookie_domain
18
+ nil
19
+ end
20
+
21
+ def logger
22
+ @logger ||= MockLogger.new
23
+ end
24
+
25
+ def params
26
+ @params ||= {}
27
+ end
28
+
29
+ def request
30
+ @request ||= MockRequest.new(self)
31
+ end
32
+
33
+ def request_content_type
34
+ @request_content_type ||= "text/html"
35
+ end
36
+
37
+ def session
38
+ @session ||= {}
39
+ end
40
+
41
+ # If method is defined, it causes below behavior...
42
+ # controller = Authlogic::ControllerAdapters::RailsAdapter.new(
43
+ # Authlogic::TestCase::MockAPIController.new
44
+ # )
45
+ # controller.responds_to_single_access_allowed? #=> true
46
+ # controller.single_access_allowed?
47
+ # #=> NoMethodError: undefined method `single_access_allowed?' for nil:NilClass
48
+ #
49
+ undef :single_access_allowed?
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ module TestCase
5
+ # Basically acts like a controller but doesn't do anything. Authlogic can interact
6
+ # with this, do it's thing and then you can look at the controller object to see if
7
+ # anything changed.
8
+ class MockController < ControllerAdapters::AbstractAdapter
9
+ attr_accessor :http_user, :http_password, :realm
10
+ attr_writer :request_content_type
11
+
12
+ def initialize
13
+ end
14
+
15
+ def authenticate_with_http_basic
16
+ yield http_user, http_password
17
+ end
18
+
19
+ def authenticate_or_request_with_http_basic(realm = "DefaultRealm")
20
+ self.realm = realm
21
+ @http_auth_requested = true
22
+ yield http_user, http_password
23
+ end
24
+
25
+ def cookies
26
+ @cookies ||= MockCookieJar.new
27
+ end
28
+
29
+ def cookie_domain
30
+ nil
31
+ end
32
+
33
+ def logger
34
+ @logger ||= MockLogger.new
35
+ end
36
+
37
+ def params
38
+ @params ||= {}
39
+ end
40
+
41
+ def request
42
+ @request ||= MockRequest.new(self)
43
+ end
44
+
45
+ def request_content_type
46
+ @request_content_type ||= "text/html"
47
+ end
48
+
49
+ def session
50
+ @session ||= {}
51
+ end
52
+
53
+ def http_auth_requested?
54
+ @http_auth_requested ||= false
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ module TestCase
5
+ # A mock of `ActionDispatch::Cookies::CookieJar`.
6
+ # See action_dispatch/middleware/cookies.rb
7
+ class MockCookieJar < Hash # :nodoc:
8
+ attr_accessor :set_cookies
9
+
10
+ def [](key)
11
+ hash = super
12
+ hash && hash[:value]
13
+ end
14
+
15
+ # @param options - "the cookie's value [usually a string] or a hash of
16
+ # options as documented above [in action_dispatch/middleware/cookies.rb]"
17
+ def []=(key, options)
18
+ opt = cookie_options_to_hash(options)
19
+ (@set_cookies ||= {})[key.to_s] = opt
20
+ super(key, opt)
21
+ end
22
+
23
+ def delete(key, _options = {})
24
+ super(key)
25
+ end
26
+
27
+ def signed
28
+ @signed ||= MockSignedCookieJar.new(self)
29
+ end
30
+
31
+ def encrypted
32
+ @encrypted ||= MockEncryptedCookieJar.new(self)
33
+ end
34
+
35
+ private
36
+
37
+ # @api private
38
+ def cookie_options_to_hash(options)
39
+ if options.is_a?(Hash)
40
+ options
41
+ else
42
+ { value: options }
43
+ end
44
+ end
45
+ end
46
+
47
+ # A mock of `ActionDispatch::Cookies::SignedKeyRotatingCookieJar`
48
+ #
49
+ # > .. a jar that'll automatically generate a signed representation of
50
+ # > cookie value and verify it when reading from the cookie again.
51
+ # > actionpack/lib/action_dispatch/middleware/cookies.rb
52
+ class MockSignedCookieJar < MockCookieJar
53
+ attr_reader :parent_jar # helper for testing
54
+
55
+ def initialize(parent_jar)
56
+ @parent_jar = parent_jar
57
+ parent_jar.each { |k, v| self[k] = v }
58
+ end
59
+
60
+ def [](val)
61
+ signed_message = @parent_jar[val]
62
+ if signed_message
63
+ payload, signature = signed_message.split("--")
64
+ raise "Invalid signature" unless Digest::SHA1.hexdigest(payload) == signature
65
+ payload
66
+ end
67
+ end
68
+
69
+ def []=(key, options)
70
+ opt = cookie_options_to_hash(options)
71
+ opt[:value] = "#{opt[:value]}--#{Digest::SHA1.hexdigest opt[:value]}"
72
+ @parent_jar[key] = opt
73
+ end
74
+ end
75
+
76
+ # Which ActionDispatch class is this a mock of?
77
+ # TODO: Document as with other mocks above.
78
+ class MockEncryptedCookieJar < MockCookieJar
79
+ attr_reader :parent_jar # helper for testing
80
+
81
+ def initialize(parent_jar)
82
+ @parent_jar = parent_jar
83
+ parent_jar.each { |k, v| self[k] = v }
84
+ end
85
+
86
+ def [](val)
87
+ encrypted_message = @parent_jar[val]
88
+ if encrypted_message
89
+ self.class.decrypt(encrypted_message)
90
+ end
91
+ end
92
+
93
+ def []=(key, options)
94
+ opt = cookie_options_to_hash(options)
95
+ opt[:value] = self.class.encrypt(opt[:value])
96
+ @parent_jar[key] = opt
97
+ end
98
+
99
+ # simple caesar cipher for testing
100
+ def self.encrypt(str)
101
+ str.unpack("U*").map(&:succ).pack("U*")
102
+ end
103
+
104
+ def self.decrypt(str)
105
+ str.unpack("U*").map(&:pred).pack("U*")
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ module TestCase
5
+ # Simple class to replace real loggers, so that we can raise any errors being logged.
6
+ class MockLogger
7
+ def error(message)
8
+ raise message
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ module TestCase
5
+ class MockRequest # :nodoc:
6
+ attr_accessor :controller
7
+
8
+ def initialize(controller)
9
+ self.controller = controller
10
+ end
11
+
12
+ def env
13
+ @env ||= {
14
+ ControllerAdapters::AbstractAdapter::ENV_SESSION_OPTIONS => {}
15
+ }
16
+ end
17
+
18
+ def format
19
+ controller.request_content_type if controller.respond_to? :request_content_type
20
+ end
21
+
22
+ def ip
23
+ controller&.respond_to?(:env) &&
24
+ controller.env.is_a?(Hash) &&
25
+ controller.env["REMOTE_ADDR"] ||
26
+ "1.1.1.1"
27
+ end
28
+
29
+ private
30
+
31
+ def method_missing(*args, &block)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ module TestCase
5
+ # Adapts authlogic to work with the @request object when testing. This way Authlogic
6
+ # can set cookies and what not before a request is made, ultimately letting you log in
7
+ # users in functional tests.
8
+ class RailsRequestAdapter < ControllerAdapters::AbstractAdapter
9
+ def authenticate_with_http_basic(&block)
10
+ end
11
+
12
+ def cookies
13
+ new_cookies = MockCookieJar.new
14
+ super.each do |key, value|
15
+ new_cookies[key] = cookie_value(value)
16
+ end
17
+ new_cookies
18
+ end
19
+
20
+ def cookie_domain
21
+ nil
22
+ end
23
+
24
+ def request
25
+ @request ||= MockRequest.new(controller)
26
+ end
27
+
28
+ def request_content_type
29
+ request.format.to_s
30
+ end
31
+
32
+ private
33
+
34
+ def cookie_value(value)
35
+ value.is_a?(Hash) ? value[:value] : value
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,215 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.dirname(__FILE__) + "/test_case/rails_request_adapter"
4
+ require File.dirname(__FILE__) + "/test_case/mock_api_controller"
5
+ require File.dirname(__FILE__) + "/test_case/mock_cookie_jar"
6
+ require File.dirname(__FILE__) + "/test_case/mock_controller"
7
+ require File.dirname(__FILE__) + "/test_case/mock_logger"
8
+ require File.dirname(__FILE__) + "/test_case/mock_request"
9
+
10
+ # :nodoc:
11
+ module Authlogic
12
+ # This module is a collection of methods and classes that help you easily test
13
+ # Authlogic. In fact, I use these same tools to test the internals of
14
+ # Authlogic.
15
+ #
16
+ # === The quick and dirty
17
+ #
18
+ # require "authlogic/test_case" # include at the top of test_helper.rb
19
+ # setup :activate_authlogic # run before tests are executed
20
+ # UserSession.create(users(:whomever)) # logs a user in
21
+ #
22
+ # For a more detailed explanation, see below.
23
+ #
24
+ # === Setting up
25
+ #
26
+ # Authlogic comes with some simple testing tools. To get these, you need to
27
+ # first require Authlogic's TestCase. If you are doing this in a rails app,
28
+ # you would require this file at the top of your test_helper.rb file:
29
+ #
30
+ # require "authlogic/test_case"
31
+ #
32
+ # If you are using Test::Unit::TestCase, the standard testing library that
33
+ # comes with ruby, then you can skip this next part. If you are not, you need
34
+ # to include the Authlogic::TestCase into your testing suite as follows:
35
+ #
36
+ # include Authlogic::TestCase
37
+ #
38
+ # Now that everything is ready to go, let's move onto actually testing. Here
39
+ # is the basic idea behind testing:
40
+ #
41
+ # Authlogic requires a "connection" to your controller to activate it. In the
42
+ # same manner that ActiveRecord requires a connection to your database. It
43
+ # can't do anything until it gets connected. That being said, Authlogic will
44
+ # raise an Authlogic::Session::Activation::NotActivatedError any time you try
45
+ # to instantiate an object without a "connection". So before you do anything
46
+ # with Authlogic, you need to activate / connect Authlogic. Let's walk through
47
+ # how to do this in tests:
48
+ #
49
+ # === Fixtures / Factories
50
+ #
51
+ # Creating users via fixtures / factories is easy. Here's an example of a
52
+ # fixture:
53
+ #
54
+ # ben:
55
+ # email: whatever@whatever.com
56
+ # password_salt: <%= salt = Authlogic::Random.hex_token %>
57
+ # crypted_password: <%= Authlogic::CryptoProviders::SCrypt.encrypt("benrocks" + salt) %>
58
+ # persistence_token: <%= Authlogic::Random.hex_token %>
59
+ # single_access_token: <%= Authlogic::Random.friendly_token %>
60
+ # perishable_token: <%= Authlogic::Random.friendly_token %>
61
+ #
62
+ # Notice the crypted_password value. Just supplement that with whatever crypto
63
+ # provider you are using, if you are not using the default.
64
+ #
65
+ # === Functional tests
66
+ #
67
+ # Activating Authlogic isn't a problem here, because making a request will
68
+ # activate Authlogic for you. The problem is logging users in so they can
69
+ # access restricted areas. Solving this is simple, just do this:
70
+ #
71
+ # setup :activate_authlogic
72
+ #
73
+ # For those of you unfamiliar with TestUnit, the setup method basically just
74
+ # executes a method before any test is ran. It is essentially "setting up"
75
+ # your tests.
76
+ #
77
+ # Once you have done this, just log users in like usual:
78
+ #
79
+ # UserSession.create(users(:whomever))
80
+ # # access my restricted area here
81
+ #
82
+ # Do this before you make your request and it will act as if that user is
83
+ # logged in.
84
+ #
85
+ # === Integration tests
86
+ #
87
+ # Again, just like functional tests, you don't have to do anything. As soon as
88
+ # you make a request, Authlogic will be connected. If you want to activate
89
+ # Authlogic before making a request follow the same steps described in the
90
+ # "functional tests" section above. It works in the same manner.
91
+ #
92
+ # === Unit tests
93
+ #
94
+ # The only time you need to do any trickiness here is if you want to test
95
+ # Authlogic models. Maybe you added some custom code or methods in your
96
+ # Authlogic models. Maybe you are writing a plugin or a library that extends
97
+ # Authlogic.
98
+ #
99
+ # That being said, in this environment there is no controller. So you need to
100
+ # use a "mock" controller. Something that looks like a controller, acts like a
101
+ # controller, but isn't a "real" controller. You are essentially connecting
102
+ # Authlogic to your "mock" controller, then you can test off of the mock
103
+ # controller to make sure everything is functioning properly.
104
+ #
105
+ # I use a mock controller to test Authlogic myself. It's part of the Authlogic
106
+ # library that you can easily use. It's as simple as functional and
107
+ # integration tests. Just do the following:
108
+ #
109
+ # setup :activate_authlogic
110
+ #
111
+ # You also get a controller method that you can test off of. For example:
112
+ #
113
+ # ben = users(:ben)
114
+ # assert_nil controller.session["user_credentials"]
115
+ # assert UserSession.create(ben)
116
+ # assert_equal controller.session["user_credentials"], ben.persistence_token
117
+ #
118
+ # See how I am checking that Authlogic is interacting with the controller
119
+ # properly? That's the idea here.
120
+ #
121
+ # === Testing with Rails 5
122
+ #
123
+ # Rails 5 has [deprecated classic controller tests](https://goo.gl/4zmt6y).
124
+ # Controller tests now inherit from `ActionDispatch::IntegrationTest` making
125
+ # them plain old integration tests now. You have two options for testing
126
+ # AuthLogic in Rails 5:
127
+ #
128
+ # * Add the `rails-controller-testing` gem to bring back the original
129
+ # controller testing usage
130
+ # * Go full steam ahead with integration testing and actually log a user in
131
+ # by submitting a form in the integration test.
132
+ #
133
+ # Naturally DHH recommends the second method and this is
134
+ # [what he does in his own tests](https://goo.gl/Ar6p0u). This is useful
135
+ # for testing not only AuthLogic itself (submitting login credentials to a
136
+ # UserSessionsController, for example) but any controller action that is
137
+ # behind a login wall. Add a helper method and use that before testing your
138
+ # actual controller action:
139
+ #
140
+ # # test/test_helper.rb
141
+ # def login(user)
142
+ # post user_sessions_url, :params => { :email => user.email, :password => 'password' }
143
+ # end
144
+ #
145
+ # # test/controllers/posts_controller_test.rb
146
+ # test "#create requires a user to be logged in
147
+ # post posts_url, :params => { :body => 'Lorem ipsum' }
148
+ #
149
+ # assert_redirected_to new_user_session_url
150
+ # end
151
+ #
152
+ # test "#create lets a logged in user create a new post" do
153
+ # login(users(:admin))
154
+ #
155
+ # assert_difference 'Posts.count' do
156
+ # post posts_url, :params => { :body => 'Lorem ipsum' }
157
+ # end
158
+ #
159
+ # assert_redirected_to posts_url
160
+ # end
161
+ #
162
+ # You still have access to the `session` helper in an integration test and so
163
+ # you can still test to see if a user is logged in. A couple of helper methods
164
+ # might look like:
165
+ #
166
+ # # test/test_helper.rb
167
+ # def assert_logged_in
168
+ # assert session[:user_credentials].present?
169
+ # end
170
+ #
171
+ # def assert_not_logged_in
172
+ # assert session[:user_credentials].blank?
173
+ # end
174
+ #
175
+ # # test/user_sessions_controller_test.rb
176
+ # test "#create logs in a user" do
177
+ # login(users(:admin))
178
+ #
179
+ # assert_logged_in
180
+ # end
181
+ module TestCase
182
+ def initialize(*args)
183
+ @request = nil
184
+ super
185
+ end
186
+
187
+ # Activates authlogic so that you can use it in your tests. You should call
188
+ # this method in your test's setup. Ex:
189
+ #
190
+ # setup :activate_authlogic
191
+ def activate_authlogic
192
+ if @request && !@request.respond_to?(:params)
193
+ class <<@request
194
+ alias_method :params, :parameters
195
+ end
196
+ end
197
+
198
+ Authlogic::Session::Base.controller = @request &&
199
+ Authlogic::TestCase::RailsRequestAdapter.new(@request) ||
200
+ controller
201
+ end
202
+
203
+ # The Authlogic::TestCase::MockController object passed to Authlogic to
204
+ # activate it. You can access this in your test. See the module description
205
+ # for an example.
206
+ def controller
207
+ @controller ||= Authlogic::TestCase::MockController.new
208
+ end
209
+ end
210
+
211
+ # TODO: Why are these lines inside the `Authlogic` module? Should be outside?
212
+ ::Test::Unit::TestCase.send(:include, TestCase) if defined?(::Test::Unit::TestCase)
213
+ ::MiniTest::Unit::TestCase.send(:include, TestCase) if defined?(::MiniTest::Unit::TestCase)
214
+ ::MiniTest::Test.send(:include, TestCase) if defined?(::MiniTest::Test)
215
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubygems"
4
+
5
+ # :nodoc:
6
+ module Authlogic
7
+ # Returns a `::Gem::Version`, the version number of the authlogic gem.
8
+ #
9
+ # It is preferable for a library to provide a `gem_version` method, rather
10
+ # than a `VERSION` string, because `::Gem::Version` is easier to use in a
11
+ # comparison.
12
+ #
13
+ # We cannot return a frozen `Version`, because rubygems will try to modify it.
14
+ # https://github.com/binarylogic/authlogic/pull/590
15
+ #
16
+ # Added in 4.0.0
17
+ #
18
+ # @api public
19
+ def self.gem_version
20
+ ::Gem::Version.new("6.5")
21
+ end
22
+ end
data/lib/authlogic.rb ADDED
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Authlogic uses ActiveSupport's core extensions like `strip_heredoc` and
4
+ # `squish`. ActiveRecord does not `require` these exensions, so we must.
5
+ #
6
+ # It's possible that we could save a few milliseconds by loading only the
7
+ # specific core extensions we need, but `all.rb` is simpler. We can revisit this
8
+ # decision if it becomes a problem.
9
+ require "active_support/all"
10
+
11
+ require "active_record"
12
+
13
+ path = File.dirname(__FILE__) + "/authlogic/"
14
+
15
+ [
16
+ "errors",
17
+ "i18n",
18
+ "random",
19
+ "config",
20
+
21
+ "controller_adapters/abstract_adapter",
22
+ "cookie_credentials",
23
+
24
+ "crypto_providers",
25
+
26
+ "acts_as_authentic/email",
27
+ "acts_as_authentic/logged_in_status",
28
+ "acts_as_authentic/login",
29
+ "acts_as_authentic/magic_columns",
30
+ "acts_as_authentic/password",
31
+ "acts_as_authentic/perishable_token",
32
+ "acts_as_authentic/persistence_token",
33
+ "acts_as_authentic/session_maintenance",
34
+ "acts_as_authentic/single_access_token",
35
+ "acts_as_authentic/base",
36
+
37
+ "session/magic_column/assigns_last_request_at",
38
+ "session/base"
39
+ ].each do |library|
40
+ require path + library
41
+ end
42
+
43
+ require path + "controller_adapters/rails_adapter" if defined?(Rails)
44
+ require path + "controller_adapters/sinatra_adapter" if defined?(Sinatra)