Skip to content

Commit bc93eec

Browse files
committed
CORE-359 refactoring session variables
1 parent a32b820 commit bc93eec

File tree

4 files changed

+79
-65
lines changed

4 files changed

+79
-65
lines changed

lib/casclient/client.rb

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,13 @@ def validate_service_ticket(st)
102102
h['pgtUrl'] = proxy_callback_url if proxy_callback_url
103103
uri.query = hash_to_query(h)
104104

105-
st.response = request_cas_response(uri, ValidationResponse)
105+
response = request_cas_response(uri, ValidationResponse)
106+
st.user = response.user
107+
st.extra_attributes = response.extra_attributes
108+
st.pgt_iou = response.pgt_iou
109+
st.success = response.is_success?
110+
st.failure_code = response.failure_code
111+
st.failure_message = response.failure_message
106112

107113
return st
108114
end
@@ -183,10 +189,15 @@ def request_proxy_ticket(pgt, target_service)
183189
h['targetService'] = target_service
184190
uri.query = hash_to_query(h)
185191

186-
pr = request_cas_response(uri, ProxyResponse)
192+
response = request_cas_response(uri, ProxyResponse)
187193

188-
pt = ProxyTicket.new(pr.proxy_ticket, target_service)
189-
pt.response = pr
194+
pt = ProxyTicket.new(response.proxy_ticket, target_service)
195+
pt.user = response.user
196+
pt.extra_attributes = response.extra_attributes
197+
pt.pgt_iou = response.pgt_iou
198+
pt.success = response.is_success?
199+
pt.failure_code = response.failure_code
200+
pt.failure_message = response.failure_message
190201

191202
return pt
192203
end

lib/casclient/frameworks/rails/filter.rb

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def filter(controller)
2323
end
2424

2525
last_st = controller.session[:cas_last_valid_ticket]
26+
last_st_service = controller.session[:cas_last_valid_ticket_service]
2627

2728
if single_sign_out(controller)
2829
controller.send(:render, :text => "CAS Single-Sign-Out request intercepted.")
@@ -31,17 +32,17 @@ def filter(controller)
3132

3233
st = read_ticket(controller)
3334

34-
is_new_session = true
35+
#is_new_session = true
3536

3637
if st && last_st &&
37-
last_st.ticket == st.ticket &&
38-
last_st.service == st.service
38+
last_st == st.ticket &&
39+
last_st_service == st.service
3940
# warn() rather than info() because we really shouldn't be re-validating the same ticket.
4041
# The only situation where this is acceptable is if the user manually does a refresh and
4142
# the same ticket happens to be in the URL.
4243
log.warn("Re-using previously validated ticket since the ticket id and service are the same.")
43-
st = last_st
44-
is_new_session = false
44+
#st = last_st
45+
return true
4546
elsif last_st &&
4647
!config[:authenticate_on_every_request] &&
4748
controller.session[client.username_session_key]
@@ -54,61 +55,70 @@ def filter(controller)
5455
# it will almost certainly break POST request, AJAX calls, etc.
5556
log.debug "Existing local CAS session detected for #{controller.session[client.username_session_key].inspect}. "+
5657
"Previous ticket #{last_st.ticket.inspect} will be re-used."
57-
st = last_st
58-
is_new_session = false
58+
#st = last_st
59+
return true
5960
end
6061

6162
if st
6263
client.validate_service_ticket(st) unless st.has_been_validated?
63-
vr = st.response
6464

6565
if st.is_valid?
66-
if is_new_session
67-
log.info("Ticket #{st.ticket.inspect} for service #{st.service.inspect} belonging to user #{vr.user.inspect} is VALID.")
68-
controller.session[client.username_session_key] = vr.user.dup
69-
controller.session[client.extra_attributes_session_key] = HashWithIndifferentAccess.new(vr.extra_attributes) if vr.extra_attributes
66+
#if is_new_session
67+
log.info("Ticket #{st.ticket.inspect} for service #{st.service.inspect} belonging to user #{st.user.inspect} is VALID.")
68+
controller.session[client.username_session_key] = st.user.dup
69+
controller.session[client.extra_attributes_session_key] = HashWithIndifferentAccess.new(st.extra_attributes) if st.extra_attributes
7070

71-
if vr.extra_attributes
72-
log.debug("Extra user attributes provided along with ticket #{st.ticket.inspect}: #{vr.extra_attributes.inspect}.")
71+
if st.extra_attributes
72+
log.debug("Extra user attributes provided along with ticket #{st.ticket.inspect}: #{st.extra_attributes.inspect}.")
7373
end
7474

7575
# RubyCAS-Client 1.x used :casfilteruser as it's username session key,
7676
# so we need to set this here to ensure compatibility with configurations
7777
# built around the old client.
78-
controller.session[:casfilteruser] = vr.user
78+
controller.session[:casfilteruser] = st.user
7979

8080
if config[:enable_single_sign_out]
81-
@@client.ticket_store.store_service_session_lookup(st, controller)
81+
client.ticket_store.store_service_session_lookup(st, controller)
8282
end
83-
end
83+
#end
8484

8585
# Store the ticket in the session to avoid re-validating the same service
8686
# ticket with the CAS server.
87-
controller.session[:cas_last_valid_ticket] = st
87+
controller.session[:cas_last_valid_ticket] = st.ticket
88+
controller.session[:cas_last_valid_ticket_service] = st.service
8889

89-
if vr.pgt_iou
90-
unless controller.session[:cas_pgt] && controller.session[:cas_pgt].ticket && controller.session[:cas_pgt].iou == vr.pgt_iou
90+
if st.pgt_iou
91+
unless controller.session[:cas_pgt] && controller.session[:cas_pgt].ticket && controller.session[:cas_pgt].iou == st.pgt_iou
9192
log.info("Receipt has a proxy-granting ticket IOU. Attempting to retrieve the proxy-granting ticket...")
92-
pgt = client.retrieve_proxy_granting_ticket(vr.pgt_iou)
93+
pgt = client.retrieve_proxy_granting_ticket(st.pgt_iou)
9394

9495
if pgt
9596
log.debug("Got PGT #{pgt.ticket.inspect} for PGT IOU #{pgt.iou.inspect}. This will be stored in the session.")
9697
controller.session[:cas_pgt] = pgt
9798
# For backwards compatibility with RubyCAS-Client 1.x configurations...
9899
controller.session[:casfilterpgt] = pgt
99100
else
100-
log.error("Failed to retrieve a PGT for PGT IOU #{vr.pgt_iou}!")
101+
log.error("Failed to retrieve a PGT for PGT IOU #{st.pgt_iou}!")
101102
end
102103
else
103-
log.info("PGT is present in session and PGT IOU #{vr.pgt_iou} matches the saved PGT IOU. Not retrieving new PGT.")
104+
log.info("PGT is present in session and PGT IOU #{st.pgt_iou} matches the saved PGT IOU. Not retrieving new PGT.")
104105
end
105106

106107
end
107108

109+
log.debug '################'
110+
log.debug '################'
111+
controller.session.each do |v|
112+
log.debug v.inspect
113+
end
114+
log.debug '################'
115+
log.debug '################'
116+
117+
108118
return true
109119
else
110-
log.warn("Ticket #{st.ticket.inspect} failed validation -- #{vr.failure_code}: #{vr.failure_message}")
111-
unauthorized!(controller, vr)
120+
log.warn("Ticket #{st.ticket.inspect} failed validation -- #{st.failure_code}: #{st.failure_message}")
121+
unauthorized!(controller, st)
112122
return false
113123
end
114124
else # no service ticket was present in the request

lib/casclient/tickets.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module CASClient
22
# Represents a CAS service ticket.
33
class ServiceTicket
44
attr_reader :ticket, :service, :renew
5-
attr_accessor :response
5+
attr_accessor :user, :extra_attributes, :pgt_iou, :success, :failure_code, :failure_message
66

77
def initialize(ticket, service, renew = false)
88
@ticket = ticket
@@ -11,11 +11,11 @@ def initialize(ticket, service, renew = false)
1111
end
1212

1313
def is_valid?
14-
response.is_success?
14+
success
1515
end
1616

1717
def has_been_validated?
18-
not response.nil?
18+
not user.nil?
1919
end
2020
end
2121

test/units/casclient/frameworks/rails/filter_test.rb

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,26 @@
2020
)
2121
end
2222

23+
context "fake user without attributes" do
24+
setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com') }
25+
should 'set the session user on #filter' do
26+
setup { Hash.new }
27+
CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil))
28+
topic
29+
end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com'
30+
teardown { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
31+
end
32+
33+
context "fake user with attributes" do
34+
setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com', {:test => 'stuff', :this => 'that'}) }
35+
should 'set the session user and attributes on #filter' do
36+
setup { Hash.new }
37+
CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil))
38+
topic
39+
end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com', :cas_extra_attributes => {:test => 'stuff', :this => 'that' }
40+
teardown { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
41+
end
42+
2343
context "new service ticket successfully" do
2444
should("return successfully from filter") do
2545
setup { Hash.new }
@@ -150,42 +170,15 @@
150170
mock_request = ActionController::Request.new({})
151171
mock(mock_request).post? {true}
152172

153-
pgt = CASClient::ProxyGrantingTicket.new(
154-
"PGT-1308586001r9573FAD5A8C62E134A4AA93273F226BD3F0C3A983DCCCD176",
155-
"PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B")
156-
157-
raw_text = "<cas:serviceResponse xmlns:cas=\"http://www.yale.edu/tp/cas\">
158-
<cas:authenticationSuccess>
159-
<cas:user>rich.yarger@vibes.com</cas:user>
160-
<cas:proxyGrantingTicket>PGTIOU-1308586001r29DC1F852C95930FE6694C1EFC64232A3359798893BC0B</cas:proxyGrantingTicket>
161-
</cas:authenticationSuccess>
162-
</cas:serviceResponse>"
163-
response = CASClient::ValidationResponse.new(raw_text)
164-
165-
any_instance_of(CASClient::Client, :request_cas_response => response)
166-
any_instance_of(CASClient::Client, :retrieve_proxy_granting_ticket => pgt)
173+
mock_client = CASClient::Client.new()
174+
mock(mock_client).request_cas_response().never
175+
mock(mock_client).retrieve_proxy_granting_ticket().never
176+
CASClient::Frameworks::Rails::Filter.send(:class_variable_set, :@@client, mock_client)
167177

168-
topic[:cas_last_valid_ticket] = CASClient::ServiceTicket.new("bogusticket",'bogusurl')
178+
topic[:cas_last_valid_ticket] = 'bogusticket'
179+
topic[:cas_last_valid_ticket_service] = 'bogusurl'
169180
controller = controller_with_session(topic,mock_request)
170181
CASClient::Frameworks::Rails::Filter.filter(controller)
171182
end.equals(true)
172183
end
173-
174-
context "fake user without attributes" do
175-
setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com') }
176-
should 'set the session user on #filter' do
177-
setup { Hash.new }
178-
CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil))
179-
topic
180-
end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com'
181-
end
182-
183-
context "fake user with attributes" do
184-
setup { CASClient::Frameworks::Rails::Filter.fake('tester@test.com', {:test => 'stuff', :this => 'that'}) }
185-
should 'set the session user and attributes on #filter' do
186-
setup { Hash.new }
187-
CASClient::Frameworks::Rails::Filter.filter(controller_with_session(topic,nil))
188-
topic
189-
end.equals :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com', :cas_extra_attributes => {:test => 'stuff', :this => 'that' }
190-
end
191184
end

0 commit comments

Comments
 (0)