Skip to content

Commit 076bfd3

Browse files
authored
Merge pull request #684 from epaew/feature/adopt_api_controller
Use cookies only when available
2 parents 049a348 + 7345d23 commit 076bfd3

File tree

8 files changed

+93
-4
lines changed

8 files changed

+93
-4
lines changed

lib/authlogic/controller_adapters/rails_adapter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def authenticate_with_http_basic(&block)
1414
# Returns a `ActionDispatch::Cookies::CookieJar`. See the AC guide
1515
# http://guides.rubyonrails.org/action_controller_overview.html#cookies
1616
def cookies
17-
controller.send(:cookies)
17+
controller.respond_to?(:cookies, true) ? controller.send(:cookies) : nil
1818
end
1919

2020
def cookie_domain

lib/authlogic/session/base.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,10 @@ def self.#{method}(*filter_list, &block)
415415
before_save :set_last_request_at
416416

417417
after_save :reset_perishable_token!
418-
after_save :save_cookie
418+
after_save :save_cookie, if: :cookie_enabled?
419419
after_save :update_session
420420

421-
after_destroy :destroy_cookie
421+
after_destroy :destroy_cookie, if: :cookie_enabled?
422422
after_destroy :update_session
423423

424424
# `validate` callbacks, in deliberate order. For example,
@@ -1623,12 +1623,18 @@ def cookie_key
16231623
# @api private
16241624
# @return ::Authlogic::CookieCredentials or if no cookie is found, nil
16251625
def cookie_credentials
1626+
return unless cookie_enabled?
1627+
16261628
cookie_value = cookie_jar[cookie_key]
16271629
unless cookie_value.nil?
16281630
::Authlogic::CookieCredentials.parse(cookie_value)
16291631
end
16301632
end
16311633

1634+
def cookie_enabled?
1635+
!controller.cookies.nil?
1636+
end
1637+
16321638
def cookie_jar
16331639
if self.class.encrypt_cookie
16341640
controller.cookies.encrypted

lib/authlogic/test_case.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require File.dirname(__FILE__) + "/test_case/rails_request_adapter"
4+
require File.dirname(__FILE__) + "/test_case/mock_api_controller"
45
require File.dirname(__FILE__) + "/test_case/mock_cookie_jar"
56
require File.dirname(__FILE__) + "/test_case/mock_controller"
67
require File.dirname(__FILE__) + "/test_case/mock_logger"
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

lib/authlogic/test_case/mock_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def params
3939
end
4040

4141
def request
42-
@request ||= MockRequest.new(controller)
42+
@request ||= MockRequest.new(self)
4343
end
4444

4545
def request_content_type

lib/authlogic/test_case/mock_request.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ def initialize(controller)
99
self.controller = controller
1010
end
1111

12+
def format
13+
controller.request_content_type if controller.respond_to? :request_content_type
14+
end
15+
1216
def ip
1317
controller&.respond_to?(:env) &&
1418
controller.env.is_a?(Hash) &&

test/adapter_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require "test_helper"
4+
require "authlogic/controller_adapters/rails_adapter"
45

56
module Authlogic
67
module ControllerAdapters
@@ -19,5 +20,15 @@ def controller.an_arbitrary_method
1920
assert_equal "bar", adapter.an_arbitrary_method
2021
end
2122
end
23+
24+
class RailsAdapterTest < ActiveSupport::TestCase
25+
def test_api_controller
26+
controller = MockAPIController.new
27+
adapter = Authlogic::ControllerAdapters::RailsAdapter.new(controller)
28+
29+
assert_equal controller, adapter.controller
30+
assert_nil adapter.cookies
31+
end
32+
end
2233
end
2334
end

test/session_test/persistence_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require "test_helper"
4+
require "authlogic/controller_adapters/rails_adapter"
45

56
module SessionTest
67
class PersistenceTest < ActiveSupport::TestCase
@@ -17,6 +18,20 @@ def test_find
1718
assert session
1819
end
1920

21+
def test_find_in_api
22+
@controller = Authlogic::TestCase::MockAPIController.new
23+
UserSession.controller =
24+
Authlogic::ControllerAdapters::RailsAdapter.new(@controller)
25+
26+
aaron = users(:aaron)
27+
refute UserSession.find
28+
29+
UserSession.single_access_allowed_request_types = ["application/json"]
30+
set_params_for(aaron)
31+
set_request_content_type("application/json")
32+
assert UserSession.find
33+
end
34+
2035
def test_persisting
2136
# tested thoroughly in test_find
2237
end

0 commit comments

Comments
 (0)