rubycas-client 2.3.8 → 2.3.9.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.simplecov +7 -0
- data/.travis.yml +2 -0
- data/Gemfile +18 -5
- data/Gemfile.lock +46 -13
- data/Guardfile +11 -0
- data/History.txt +22 -0
- data/README.rdoc +2 -2
- data/Rakefile +0 -12
- data/VERSION +1 -1
- data/lib/casclient.rb +1 -1
- data/lib/casclient/client.rb +75 -70
- data/lib/casclient/frameworks/rails/cas_proxy_callback_controller.rb +6 -2
- data/lib/casclient/frameworks/rails/filter.rb +4 -1
- data/lib/casclient/responses.rb +64 -57
- data/lib/casclient/tickets/storage.rb +29 -20
- data/lib/casclient/tickets/storage/active_record_ticket_store.rb +11 -6
- data/rubycas-client.gemspec +50 -17
- data/spec/.gitignore +1 -0
- data/spec/casclient/client_spec.rb +93 -0
- data/spec/casclient/frameworks/rails/filter_spec.rb +27 -36
- data/spec/casclient/tickets/storage/active_record_ticket_store_spec.rb +6 -0
- data/spec/casclient/tickets/storage_spec.rb +44 -0
- data/spec/casclient/validation_response_spec.rb +97 -3
- data/spec/database.yml +7 -0
- data/spec/spec_helper.rb +31 -8
- data/spec/support/action_controller_helpers.rb +30 -0
- data/spec/support/active_record_helpers.rb +48 -0
- data/spec/support/local_hash_ticket_store.rb +48 -0
- data/spec/support/local_hash_ticket_store_spec.rb +5 -0
- data/spec/support/shared_examples_for_ticket_stores.rb +137 -0
- metadata +119 -30
data/rubycas-client.gemspec
CHANGED
@@ -5,21 +5,23 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "rubycas-client"
|
8
|
-
s.version = "2.3.
|
8
|
+
s.version = "2.3.9.rc1"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Matt Zukowski", "Matt Walker", "Matt Campbell"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2012-03-24"
|
13
13
|
s.extra_rdoc_files = [
|
14
14
|
"LICENSE.txt",
|
15
15
|
"README.rdoc"
|
16
16
|
]
|
17
17
|
s.files = [
|
18
18
|
".rspec",
|
19
|
+
".simplecov",
|
19
20
|
".travis.yml",
|
20
21
|
"CHANGELOG.txt",
|
21
22
|
"Gemfile",
|
22
23
|
"Gemfile.lock",
|
24
|
+
"Guardfile",
|
23
25
|
"History.txt",
|
24
26
|
"LICENSE.txt",
|
25
27
|
"README.rdoc",
|
@@ -63,15 +65,25 @@ Gem::Specification.new do |s|
|
|
63
65
|
"rails_generators/active_record_ticket_store/templates/README",
|
64
66
|
"rails_generators/active_record_ticket_store/templates/migration.rb",
|
65
67
|
"rubycas-client.gemspec",
|
68
|
+
"spec/.gitignore",
|
69
|
+
"spec/casclient/client_spec.rb",
|
66
70
|
"spec/casclient/frameworks/rails/filter_spec.rb",
|
71
|
+
"spec/casclient/tickets/storage/active_record_ticket_store_spec.rb",
|
72
|
+
"spec/casclient/tickets/storage_spec.rb",
|
67
73
|
"spec/casclient/validation_response_spec.rb",
|
68
|
-
"spec/
|
74
|
+
"spec/database.yml",
|
75
|
+
"spec/spec_helper.rb",
|
76
|
+
"spec/support/action_controller_helpers.rb",
|
77
|
+
"spec/support/active_record_helpers.rb",
|
78
|
+
"spec/support/local_hash_ticket_store.rb",
|
79
|
+
"spec/support/local_hash_ticket_store_spec.rb",
|
80
|
+
"spec/support/shared_examples_for_ticket_stores.rb"
|
69
81
|
]
|
70
82
|
s.homepage = "http://github.com/rubycas/rubycas-client"
|
71
83
|
s.licenses = ["MIT"]
|
72
84
|
s.rdoc_options = ["--main", "README.rdoc"]
|
73
85
|
s.require_paths = ["lib"]
|
74
|
-
s.rubygems_version = "1.8.
|
86
|
+
s.rubygems_version = "1.8.11"
|
75
87
|
s.summary = "Client library for the Central Authentication Service (CAS) protocol."
|
76
88
|
|
77
89
|
if s.respond_to? :specification_version then
|
@@ -79,32 +91,53 @@ Gem::Specification.new do |s|
|
|
79
91
|
|
80
92
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
81
93
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
82
|
-
s.add_development_dependency(%q<json>, ["
|
83
|
-
s.add_development_dependency(%q<rspec>, ["
|
94
|
+
s.add_development_dependency(%q<json>, [">= 0"])
|
95
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
84
96
|
s.add_development_dependency(%q<bundler>, [">= 1.0"])
|
85
|
-
s.add_development_dependency(%q<jeweler>, ["
|
97
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
86
98
|
s.add_development_dependency(%q<actionpack>, [">= 0"])
|
99
|
+
s.add_development_dependency(%q<activerecord>, [">= 0"])
|
87
100
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
88
|
-
s.add_development_dependency(%q<
|
101
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
102
|
+
s.add_development_dependency(%q<guard>, [">= 0"])
|
103
|
+
s.add_development_dependency(%q<guard-rspec>, [">= 0"])
|
104
|
+
s.add_development_dependency(%q<database_cleaner>, [">= 0"])
|
105
|
+
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
106
|
+
s.add_development_dependency(%q<jruby-openssl>, [">= 0"])
|
107
|
+
s.add_development_dependency(%q<activerecord-jdbcsqlite3-adapter>, [">= 0"])
|
89
108
|
else
|
90
109
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
91
|
-
s.add_dependency(%q<json>, ["
|
92
|
-
s.add_dependency(%q<rspec>, ["
|
110
|
+
s.add_dependency(%q<json>, [">= 0"])
|
111
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
93
112
|
s.add_dependency(%q<bundler>, [">= 1.0"])
|
94
|
-
s.add_dependency(%q<jeweler>, ["
|
113
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
95
114
|
s.add_dependency(%q<actionpack>, [">= 0"])
|
115
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
96
116
|
s.add_dependency(%q<rake>, [">= 0"])
|
97
|
-
s.add_dependency(%q<
|
117
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
118
|
+
s.add_dependency(%q<guard>, [">= 0"])
|
119
|
+
s.add_dependency(%q<guard-rspec>, [">= 0"])
|
120
|
+
s.add_dependency(%q<database_cleaner>, [">= 0"])
|
121
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
122
|
+
s.add_dependency(%q<jruby-openssl>, [">= 0"])
|
123
|
+
s.add_dependency(%q<activerecord-jdbcsqlite3-adapter>, [">= 0"])
|
98
124
|
end
|
99
125
|
else
|
100
126
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
101
|
-
s.add_dependency(%q<json>, ["
|
102
|
-
s.add_dependency(%q<rspec>, ["
|
127
|
+
s.add_dependency(%q<json>, [">= 0"])
|
128
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
103
129
|
s.add_dependency(%q<bundler>, [">= 1.0"])
|
104
|
-
s.add_dependency(%q<jeweler>, ["
|
130
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
105
131
|
s.add_dependency(%q<actionpack>, [">= 0"])
|
132
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
106
133
|
s.add_dependency(%q<rake>, [">= 0"])
|
107
|
-
s.add_dependency(%q<
|
134
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
135
|
+
s.add_dependency(%q<guard>, [">= 0"])
|
136
|
+
s.add_dependency(%q<guard-rspec>, [">= 0"])
|
137
|
+
s.add_dependency(%q<database_cleaner>, [">= 0"])
|
138
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
139
|
+
s.add_dependency(%q<jruby-openssl>, [">= 0"])
|
140
|
+
s.add_dependency(%q<activerecord-jdbcsqlite3-adapter>, [">= 0"])
|
108
141
|
end
|
109
142
|
end
|
110
143
|
|
data/spec/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
test.*.db
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CASClient::Client do
|
4
|
+
let(:client) { CASClient::Client.new(:login_url => login_url, :cas_base_url => '')}
|
5
|
+
let(:login_url) { "http://localhost:3443/"}
|
6
|
+
let(:uri) { URI.parse(login_url) }
|
7
|
+
let(:session) { double('session', :use_ssl= => true, :verify_mode= => true) }
|
8
|
+
|
9
|
+
context "https connection" do
|
10
|
+
let(:proxy) { double('proxy', :new => session) }
|
11
|
+
|
12
|
+
before :each do
|
13
|
+
Net::HTTP.stub :Proxy => proxy
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sets up the session with the login url host and port" do
|
17
|
+
proxy.should_receive(:new).with('localhost', 3443).and_return(session)
|
18
|
+
client.send(:https_connection, uri)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sets up the proxy with the known proxy host and port" do
|
22
|
+
client = CASClient::Client.new(:login_url => login_url, :cas_base_url => '', :proxy_host => 'foo', :proxy_port => 1234)
|
23
|
+
Net::HTTP.should_receive(:Proxy).with('foo', 1234).and_return(proxy)
|
24
|
+
client.send(:https_connection, uri)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "cas server requests" do
|
29
|
+
let(:response) { double('response', :body => 'HTTP BODY', :code => '200') }
|
30
|
+
let(:connection) { double('connection', :get => response, :post => response, :request => response) }
|
31
|
+
|
32
|
+
before :each do
|
33
|
+
client.stub(:https_connection).and_return(session)
|
34
|
+
session.stub(:start).and_yield(connection)
|
35
|
+
end
|
36
|
+
|
37
|
+
context "cas server is up" do
|
38
|
+
it "returns false if the server cannot be connected to" do
|
39
|
+
connection.stub(:get).and_raise(Errno::ECONNREFUSED)
|
40
|
+
client.cas_server_is_up?.should be_false
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns false if the request was not a success" do
|
44
|
+
response.stub :kind_of? => false
|
45
|
+
client.cas_server_is_up?.should be_false
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns true when the server is running" do
|
49
|
+
response.stub :kind_of? => true
|
50
|
+
client.cas_server_is_up?.should be_true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "request login ticket" do
|
55
|
+
it "raises an exception when the request was not a success" do
|
56
|
+
session.stub(:post).with("/Ticket", ";").and_return(response)
|
57
|
+
response.stub :kind_of? => false
|
58
|
+
lambda {
|
59
|
+
client.request_login_ticket
|
60
|
+
}.should raise_error(CASClient::CASException)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns the response body when the request is a success" do
|
64
|
+
session.stub(:post).with("/Ticket", ";").and_return(response)
|
65
|
+
response.stub :kind_of? => true
|
66
|
+
client.request_login_ticket.should == "HTTP BODY"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "request cas response" do
|
71
|
+
let(:validation_response) { double('validation_response') }
|
72
|
+
|
73
|
+
it "should raise an exception when the request is not a success or 422" do
|
74
|
+
response.stub :kind_of? => false
|
75
|
+
lambda {
|
76
|
+
client.send(:request_cas_response, uri, CASClient::ValidationResponse)
|
77
|
+
}.should raise_error(RuntimeError)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should return a ValidationResponse object when the request is a success or 422" do
|
81
|
+
CASClient::ValidationResponse.stub(:new).and_return(validation_response)
|
82
|
+
response.stub :kind_of? => true
|
83
|
+
client.send(:request_cas_response, uri, CASClient::ValidationResponse).should == validation_response
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "submit data to cas" do
|
88
|
+
it "should return an HTTPResponse" do
|
89
|
+
client.send(:submit_data_to_cas, uri, {}).should == response
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -4,32 +4,6 @@ require 'casclient/frameworks/rails/filter'
|
|
4
4
|
|
5
5
|
describe CASClient::Frameworks::Rails::Filter do
|
6
6
|
|
7
|
-
def controller_with_session(request = nil, session={})
|
8
|
-
|
9
|
-
query_parameters = {:ticket => "bogusticket", :renew => false}
|
10
|
-
parameters = query_parameters.dup
|
11
|
-
|
12
|
-
#TODO this really need to be replaced with a "real" rails controller
|
13
|
-
request ||= mock_post_request
|
14
|
-
request.stub(:query_parameters) {query_parameters}
|
15
|
-
request.stub(:path_parameters) {{}}
|
16
|
-
controller = double("Controller")
|
17
|
-
controller.stub(:session) {session}
|
18
|
-
controller.stub(:request) {request}
|
19
|
-
controller.stub(:url_for) {"bogusurl"}
|
20
|
-
controller.stub(:query_parameters) {query_parameters}
|
21
|
-
controller.stub(:path_parameters) {{}}
|
22
|
-
controller.stub(:parameters) {parameters}
|
23
|
-
controller.stub(:params) {parameters}
|
24
|
-
controller
|
25
|
-
end
|
26
|
-
|
27
|
-
def mock_post_request
|
28
|
-
mock_request = ActionController::Request.new({})
|
29
|
-
mock_request.stub(:post?) {true}
|
30
|
-
mock_request
|
31
|
-
end
|
32
|
-
|
33
7
|
before(:each) do
|
34
8
|
CASClient::Frameworks::Rails::Filter.configure(
|
35
9
|
:cas_base_url => 'http://test.local/',
|
@@ -42,7 +16,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
42
16
|
context "faking user without attributes" do
|
43
17
|
before { CASClient::Frameworks::Rails::Filter.fake('tester@test.com') }
|
44
18
|
it 'should set the session user' do
|
45
|
-
CASClient::Frameworks::Rails::Filter.filter(
|
19
|
+
CASClient::Frameworks::Rails::Filter.filter(mock_controller_with_session(nil, subject))
|
46
20
|
subject.should eq({:cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com'})
|
47
21
|
end
|
48
22
|
after { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
|
@@ -51,7 +25,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
51
25
|
context "faking user with attributes" do
|
52
26
|
before { CASClient::Frameworks::Rails::Filter.fake('tester@test.com', {:test => 'stuff', :this => 'that'}) }
|
53
27
|
it 'should set the session user and attributes' do
|
54
|
-
CASClient::Frameworks::Rails::Filter.filter(
|
28
|
+
CASClient::Frameworks::Rails::Filter.filter(mock_controller_with_session(nil, subject))
|
55
29
|
subject.should eq({ :cas_user => 'tester@test.com', :casfilteruser => 'tester@test.com', :cas_extra_attributes => {:test => 'stuff', :this => 'that' }})
|
56
30
|
end
|
57
31
|
after { CASClient::Frameworks::Rails::Filter.fake(nil,nil) }
|
@@ -76,7 +50,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
76
50
|
CASClient::Client.any_instance.stub(:request_cas_response).and_return(response)
|
77
51
|
CASClient::Client.any_instance.stub(:retrieve_proxy_granting_ticket).and_return(pgt)
|
78
52
|
|
79
|
-
controller =
|
53
|
+
controller = mock_controller_with_session()
|
80
54
|
CASClient::Frameworks::Rails::Filter.filter(controller).should eq(true)
|
81
55
|
end
|
82
56
|
end
|
@@ -92,7 +66,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
92
66
|
CASClient::Client.any_instance.stub(:request_cas_response).and_return(response)
|
93
67
|
CASClient::Frameworks::Rails::Filter.stub(:unauthorized!) {"bogusresponse"}
|
94
68
|
|
95
|
-
controller =
|
69
|
+
controller = mock_controller_with_session()
|
96
70
|
CASClient::Frameworks::Rails::Filter.filter(controller).should eq(false)
|
97
71
|
end
|
98
72
|
end
|
@@ -103,7 +77,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
103
77
|
|
104
78
|
CASClient::Frameworks::Rails::Filter.stub(:unauthorized!) {"bogusresponse"}
|
105
79
|
|
106
|
-
controller =
|
80
|
+
controller = mock_controller_with_session()
|
107
81
|
controller.stub(:params) {{}}
|
108
82
|
CASClient::Frameworks::Rails::Filter.filter(controller).should eq(false)
|
109
83
|
end
|
@@ -116,7 +90,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
116
90
|
CASClient::Frameworks::Rails::Filter.stub(:unauthorized!) {"bogusresponse"}
|
117
91
|
|
118
92
|
CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = false
|
119
|
-
controller =
|
93
|
+
controller = mock_controller_with_session()
|
120
94
|
controller.session[:cas_sent_to_gateway] = true
|
121
95
|
controller.stub(:params) {{}}
|
122
96
|
CASClient::Frameworks::Rails::Filter.filter(controller).should eq(false)
|
@@ -127,7 +101,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
127
101
|
it "should return failure from filter" do
|
128
102
|
|
129
103
|
CASClient::Frameworks::Rails::Filter.config[:use_gatewaying] = true
|
130
|
-
controller =
|
104
|
+
controller = mock_controller_with_session()
|
131
105
|
controller.session[:cas_sent_to_gateway] = true
|
132
106
|
controller.stub(:params) {{}}
|
133
107
|
CASClient::Frameworks::Rails::Filter.filter(controller).should eq(true)
|
@@ -151,7 +125,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
151
125
|
CASClient::Client.any_instance.stub(:request_cas_response).and_return(response)
|
152
126
|
CASClient::Client.any_instance.stub(:retrieve_proxy_granting_ticket).and_raise CASClient::CASException
|
153
127
|
|
154
|
-
controller =
|
128
|
+
controller = mock_controller_with_session()
|
155
129
|
expect { CASClient::Frameworks::Rails::Filter.filter(controller) }.to raise_error(CASClient::CASException)
|
156
130
|
end
|
157
131
|
end
|
@@ -161,7 +135,7 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
161
135
|
|
162
136
|
CASClient::Client.any_instance.stub(:request_cas_response).and_raise "Some exception"
|
163
137
|
|
164
|
-
controller =
|
138
|
+
controller = mock_controller_with_session()
|
165
139
|
expect { CASClient::Frameworks::Rails::Filter.filter(controller) }.to raise_error(RuntimeError)
|
166
140
|
end
|
167
141
|
end
|
@@ -177,9 +151,26 @@ describe CASClient::Frameworks::Rails::Filter do
|
|
177
151
|
|
178
152
|
subject[:cas_last_valid_ticket] = 'bogusticket'
|
179
153
|
subject[:cas_last_valid_ticket_service] = 'bogusurl'
|
180
|
-
controller =
|
154
|
+
controller = mock_controller_with_session(mock_post_request(), subject)
|
181
155
|
CASClient::Frameworks::Rails::Filter.filter(controller).should eq(true)
|
182
156
|
end
|
183
157
|
end
|
184
158
|
end
|
159
|
+
|
160
|
+
context "controller request is missing format" do
|
161
|
+
context "#unauthorized!" do
|
162
|
+
it 'should not crash' do
|
163
|
+
request = double('mock request')
|
164
|
+
request.stub(:format).and_return(nil)
|
165
|
+
|
166
|
+
controller = mock_controller_with_session(request)
|
167
|
+
|
168
|
+
CASClient::Frameworks::Rails::Filter.
|
169
|
+
should_receive(:redirect_to_cas_for_authentication).
|
170
|
+
with(controller)
|
171
|
+
|
172
|
+
CASClient::Frameworks::Rails::Filter.unauthorized!(controller)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
185
176
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/local_hash_ticket_store'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
describe CASClient::Tickets::Storage::AbstractTicketStore do
|
6
|
+
describe "#store_service_session_lookup" do
|
7
|
+
it "should raise an exception" do
|
8
|
+
expect { subject.store_service_session_lookup("service_ticket", mock_controller_with_session) }.to raise_exception 'Implement this in a subclass!'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
describe "#cleanup_service_session_lookup" do
|
12
|
+
it "should raise an exception" do
|
13
|
+
expect { subject.cleanup_service_session_lookup("service_ticket") }.to raise_exception 'Implement this in a subclass!'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
describe "#save_pgt_iou" do
|
17
|
+
it "should raise an exception" do
|
18
|
+
expect { subject.save_pgt_iou("pgt_iou", "pgt") }.to raise_exception 'Implement this in a subclass!'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
describe "#retrieve_pgt" do
|
22
|
+
it "should raise an exception" do
|
23
|
+
expect { subject.retrieve_pgt("pgt_iou") }.to raise_exception 'Implement this in a subclass!'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
describe "#get_session_for_service_ticket" do
|
27
|
+
it "should raise an exception" do
|
28
|
+
expect { subject.get_session_for_service_ticket("service_ticket") }.to raise_exception 'Implement this in a subclass!'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe CASClient::Tickets::Storage::LocalDirTicketStore do
|
34
|
+
let(:dir) {File.join(SPEC_TMP_DIR, "local_dir_ticket_store")}
|
35
|
+
before do
|
36
|
+
FileUtils.mkdir_p(File.join(dir, "sessions"))
|
37
|
+
end
|
38
|
+
after do
|
39
|
+
FileUtils.remove_dir(dir)
|
40
|
+
end
|
41
|
+
it_should_behave_like "a ticket store" do
|
42
|
+
let(:ticket_store) {described_class.new(:storage_dir => dir)}
|
43
|
+
end
|
44
|
+
end
|
@@ -2,6 +2,72 @@ require 'spec_helper'
|
|
2
2
|
require 'casclient/responses.rb'
|
3
3
|
|
4
4
|
describe CASClient::ValidationResponse do
|
5
|
+
context "when parsing extra attributes as raw" do
|
6
|
+
let(:response_text) do
|
7
|
+
<<RESPONSE_TEXT
|
8
|
+
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
|
9
|
+
<cas:authenticationSuccess>
|
10
|
+
<cas:attributes>
|
11
|
+
<cas:name>Jimmy Bob</cas:name>
|
12
|
+
<cas:status><![CDATA[stuff
|
13
|
+
]]></cas:status>
|
14
|
+
<cas:yaml><![CDATA[--- true
|
15
|
+
]]></cas:yaml>
|
16
|
+
<cas:json><![CDATA[{"id":10529}]]></cas:json>
|
17
|
+
</cas:attributes>
|
18
|
+
</cas:authenticationSuccess>
|
19
|
+
</cas:serviceResponse>
|
20
|
+
RESPONSE_TEXT
|
21
|
+
end
|
22
|
+
|
23
|
+
subject { CASClient::ValidationResponse.new response_text, :encode_extra_attributes_as => :raw }
|
24
|
+
|
25
|
+
it "sets text attributes to their string value" do
|
26
|
+
subject.extra_attributes["name"].should == "Jimmy Bob"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "preserves whitespace for CDATA" do
|
30
|
+
subject.extra_attributes["status"].should == "stuff\n"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "passes yaml through as is" do
|
34
|
+
subject.extra_attributes["yaml"].should == "--- true\n"
|
35
|
+
end
|
36
|
+
it "passes json through as is" do
|
37
|
+
subject.extra_attributes["json"].should == "{\"id\":10529}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when parsing extra attributes as yaml" do
|
42
|
+
let(:response_text) do
|
43
|
+
<<RESPONSE_TEXT
|
44
|
+
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
|
45
|
+
<cas:authenticationSuccess>
|
46
|
+
<cas:attributes>
|
47
|
+
<cas:name>Jimmy Bob</cas:name>
|
48
|
+
<cas:status><![CDATA[stuff
|
49
|
+
]]></cas:status>
|
50
|
+
<cas:truthy><![CDATA[--- true
|
51
|
+
]]></cas:truthy>
|
52
|
+
<cas:falsy><![CDATA[#{false.to_yaml}]]></cas:falsy>
|
53
|
+
</cas:attributes>
|
54
|
+
</cas:authenticationSuccess>
|
55
|
+
</cas:serviceResponse>
|
56
|
+
RESPONSE_TEXT
|
57
|
+
end
|
58
|
+
|
59
|
+
subject { CASClient::ValidationResponse.new response_text, :encode_extra_attributes_as => :yaml }
|
60
|
+
|
61
|
+
it "sets text attributes to their string value" do
|
62
|
+
subject.extra_attributes["name"].should == "Jimmy Bob"
|
63
|
+
end
|
64
|
+
|
65
|
+
it "sets the value of boolean attributes to their boolean value" do
|
66
|
+
subject.extra_attributes["falsy"].should == false
|
67
|
+
subject.extra_attributes["truthy"].should == true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
5
71
|
context "when parsing extra attributes as JSON" do
|
6
72
|
let(:response_text) do
|
7
73
|
<<RESPONSE_TEXT
|
@@ -12,16 +78,20 @@ describe CASClient::ValidationResponse do
|
|
12
78
|
<cas:last_name>92.5</cas:last_name>
|
13
79
|
<cas:mobile_phone></cas:mobile_phone>
|
14
80
|
<cas:global_roles><![CDATA[]]></cas:global_roles>
|
15
|
-
<cas:foo_data
|
16
|
-
<cas:food_data
|
81
|
+
<cas:foo_data><![CDATA[[{"id":10529}]]]></cas:foo_data>
|
82
|
+
<cas:food_data><![CDATA[{"id":10529}]]></cas:food_data>
|
17
83
|
<cas:allegedly_yaml>- 10</cas:allegedly_yaml>
|
84
|
+
<cas:truthy><![CDATA[--- true
|
85
|
+
]]></cas:truthy>
|
86
|
+
<cas:falsy><![CDATA[--- false
|
87
|
+
]]></cas:falsy>
|
18
88
|
</cas:attributes>
|
19
89
|
</cas:authenticationSuccess>
|
20
90
|
</cas:serviceResponse>
|
21
91
|
RESPONSE_TEXT
|
22
92
|
end
|
23
93
|
|
24
|
-
|
94
|
+
subject { CASClient::ValidationResponse.new response_text, :encode_extra_attributes_as => :json }
|
25
95
|
|
26
96
|
it "sets the value of non-CDATA escaped empty attribute to nil" do
|
27
97
|
subject.extra_attributes["mobile_phone"].should be_nil
|
@@ -51,4 +121,28 @@ RESPONSE_TEXT
|
|
51
121
|
subject.extra_attributes["allegedly_yaml"].should == '- 10'
|
52
122
|
end
|
53
123
|
end
|
124
|
+
|
125
|
+
context "When parsing extra attributes from xml attributes" do
|
126
|
+
let(:response_text) do
|
127
|
+
<<RESPONSE_TEXT
|
128
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
129
|
+
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
|
130
|
+
<cas:authenticationSuccess>
|
131
|
+
<cas:user>myuser</cas:user>
|
132
|
+
<cas:attribute name="username" value="myuser"/>
|
133
|
+
<cas:attribute name="name" value="My User"/>
|
134
|
+
<cas:attribute name="email" value="myuser@mail.example.com"/>
|
135
|
+
</cas:authenticationSuccess>
|
136
|
+
</cas:serviceResponse>
|
137
|
+
RESPONSE_TEXT
|
138
|
+
end
|
139
|
+
|
140
|
+
subject { CASClient::ValidationResponse.new response_text }
|
141
|
+
|
142
|
+
it "sets attributes for other type of format" do
|
143
|
+
expected = {"username" => "myuser", "name" => 'My User', "email" => 'myuser@mail.example.com'}
|
144
|
+
subject.user.should == 'myuser'
|
145
|
+
subject.extra_attributes.should == expected
|
146
|
+
end
|
147
|
+
end
|
54
148
|
end
|