rubycas-client 2.3.8 → 2.3.9.rc1
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.
- 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/.simplecov
ADDED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,13 +1,26 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
3
|
group :development do
|
4
|
-
gem "json"
|
5
|
-
gem "rspec"
|
4
|
+
gem "json"
|
5
|
+
gem "rspec"
|
6
6
|
gem "bundler", ">= 1.0"
|
7
|
-
gem "jeweler"
|
8
|
-
gem "actionpack"
|
7
|
+
gem "jeweler"
|
8
|
+
gem "actionpack", :require => 'action_pack'
|
9
|
+
gem "activerecord", :require => 'active_record'
|
9
10
|
gem "rake"
|
10
|
-
gem "
|
11
|
+
gem "simplecov", :require => false
|
12
|
+
gem "guard"
|
13
|
+
gem "guard-rspec"
|
14
|
+
gem "database_cleaner"
|
15
|
+
|
16
|
+
platforms :ruby do
|
17
|
+
gem "sqlite3"
|
18
|
+
end
|
19
|
+
|
20
|
+
platforms :jruby do
|
21
|
+
gem "jruby-openssl"
|
22
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
23
|
+
end
|
11
24
|
end
|
12
25
|
|
13
26
|
gem "activesupport", :require => "active_support"
|
data/Gemfile.lock
CHANGED
@@ -4,35 +4,68 @@ GEM
|
|
4
4
|
actionpack (2.3.11)
|
5
5
|
activesupport (= 2.3.11)
|
6
6
|
rack (~> 1.1.0)
|
7
|
+
activerecord (2.3.11)
|
8
|
+
activesupport (= 2.3.11)
|
9
|
+
activerecord-jdbc-adapter (1.2.2)
|
10
|
+
activerecord-jdbcsqlite3-adapter (1.2.2)
|
11
|
+
activerecord-jdbc-adapter (~> 1.2.2)
|
12
|
+
jdbc-sqlite3 (~> 3.7.2)
|
7
13
|
activesupport (2.3.11)
|
14
|
+
bouncy-castle-java (1.5.0146.1)
|
15
|
+
database_cleaner (0.7.1)
|
8
16
|
diff-lcs (1.1.3)
|
17
|
+
ffi (1.0.11)
|
18
|
+
ffi (1.0.11-java)
|
9
19
|
git (1.2.5)
|
20
|
+
guard (1.0.0)
|
21
|
+
ffi (>= 0.5.0)
|
22
|
+
thor (~> 0.14.6)
|
23
|
+
guard-rspec (0.6.0)
|
24
|
+
guard (>= 0.10.0)
|
25
|
+
jdbc-sqlite3 (3.7.2)
|
10
26
|
jeweler (1.6.4)
|
11
27
|
bundler (~> 1.0)
|
12
28
|
git (>= 1.2.5)
|
13
29
|
rake
|
14
|
-
|
30
|
+
jruby-openssl (0.7.5)
|
31
|
+
bouncy-castle-java (>= 1.5.0146.1)
|
32
|
+
json (1.6.5)
|
33
|
+
json (1.6.5-java)
|
34
|
+
multi_json (1.0.4)
|
15
35
|
rack (1.1.2)
|
16
36
|
rake (0.9.2.2)
|
17
|
-
|
18
|
-
|
19
|
-
rspec-
|
20
|
-
rspec-
|
21
|
-
|
22
|
-
rspec-
|
23
|
-
rspec-expectations (2.7.0)
|
37
|
+
rspec (2.8.0)
|
38
|
+
rspec-core (~> 2.8.0)
|
39
|
+
rspec-expectations (~> 2.8.0)
|
40
|
+
rspec-mocks (~> 2.8.0)
|
41
|
+
rspec-core (2.8.0)
|
42
|
+
rspec-expectations (2.8.0)
|
24
43
|
diff-lcs (~> 1.1.2)
|
25
|
-
rspec-mocks (2.
|
44
|
+
rspec-mocks (2.8.0)
|
45
|
+
simplecov (0.5.4)
|
46
|
+
multi_json (~> 1.0.3)
|
47
|
+
simplecov-html (~> 0.5.3)
|
48
|
+
simplecov-html (0.5.3)
|
49
|
+
sqlite3 (1.3.5)
|
50
|
+
thor (0.14.6)
|
26
51
|
|
27
52
|
PLATFORMS
|
53
|
+
java
|
28
54
|
ruby
|
29
55
|
|
30
56
|
DEPENDENCIES
|
31
57
|
actionpack
|
58
|
+
activerecord
|
59
|
+
activerecord-jdbcsqlite3-adapter
|
32
60
|
activesupport
|
33
61
|
bundler (>= 1.0)
|
34
|
-
|
35
|
-
|
62
|
+
database_cleaner
|
63
|
+
guard
|
64
|
+
guard-rspec
|
65
|
+
jeweler
|
66
|
+
jruby-openssl
|
67
|
+
json
|
36
68
|
rake
|
37
|
-
|
38
|
-
|
69
|
+
rspec
|
70
|
+
simplecov
|
71
|
+
sqlite3
|
data/Guardfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :version => 2, :cli => '-c -f doc' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
watch(%r{^spec/support/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
9
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
10
|
+
end
|
11
|
+
|
data/History.txt
CHANGED
@@ -1,5 +1,27 @@
|
|
1
1
|
= RubyCAS-Client Changelog
|
2
2
|
|
3
|
+
== Version 2.3.9rc1 :: 2012-03-24
|
4
|
+
|
5
|
+
* Bug Fixes
|
6
|
+
* Fixed issue that caused Single Sign Out to fail (@bryanlarsen and @soorajb)
|
7
|
+
* Fixed issue in Filter#unauthorized! (@mscottford)
|
8
|
+
* Fixed #38, boolean values are now preserved in extra attribute yaml
|
9
|
+
parsing
|
10
|
+
|
11
|
+
* New functionality
|
12
|
+
* Tweak the CasProxyCallbackController so it can be used with
|
13
|
+
rubycas-client-rails in Rails 3 (@bryanlarsen)
|
14
|
+
* Add support for calling the CAS Server through an HTTP proxy (@shevaun)
|
15
|
+
* Add support for specifying the service url to be added to the
|
16
|
+
logout url (@dyson)
|
17
|
+
* add support for extra attributes as xml attributes (@bhenderson)
|
18
|
+
* Add :raw mode to extra attribute parsing
|
19
|
+
|
20
|
+
* Other
|
21
|
+
* Made writing and running rspec tests much easier
|
22
|
+
* Added tests for Ticket Stores
|
23
|
+
* Official support for jruby 1.6
|
24
|
+
|
3
25
|
== Version 2.3.8 :: 2011-12-19
|
4
26
|
|
5
27
|
* Bug Fixes
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= RubyCAS-Client
|
1
|
+
= RubyCAS-Client
|
2
2
|
|
3
3
|
Authors:: Matt Zukowski <matt AT roughest DOT net> and Matt Campbell <matt AT soupmatt DOT com>; inspired by code by Ola Bini <ola.bini AT ki DOT se> and Matt Walker <mwalker AT tamu DOT edu>
|
4
4
|
Copyright:: Portions contributed by Matt Zukowski are copyright (c) 2009 Urbacon Ltd.
|
@@ -8,7 +8,7 @@ License:: MIT License
|
|
8
8
|
Websites:: http://github.com/rubycas/rubycas-client
|
9
9
|
http://github.com/rubycas/rubycas-client/wiki
|
10
10
|
http://rubydoc.info/github/rubycas/rubycas-client/master/frames
|
11
|
-
|
11
|
+
Build Status:: {<img src="http://travis-ci.org/rubycas/rubycas-client.png" />}[http://travis-ci.org/rubycas/rubycas-client]
|
12
12
|
|
13
13
|
=== RubyCAS-Client is a Ruby client library for Yale's Central Authentication Service (CAS) protocol.
|
14
14
|
|
data/Rakefile
CHANGED
@@ -24,18 +24,6 @@ Jeweler::Tasks.new do |gem|
|
|
24
24
|
end
|
25
25
|
Jeweler::RubygemsDotOrgTasks.new
|
26
26
|
|
27
|
-
begin
|
28
|
-
require 'rcov/rcovtask'
|
29
|
-
Rcov::RcovTask.new do |test|
|
30
|
-
test.libs << 'test'
|
31
|
-
test.pattern = 'test/**/test_*.rb'
|
32
|
-
test.verbose = true
|
33
|
-
test.rcov_opts << '--exclude "gems/*"'
|
34
|
-
end
|
35
|
-
rescue LoadError
|
36
|
-
puts "Hiding rcov tasks because rcov is not available"
|
37
|
-
end
|
38
|
-
|
39
27
|
begin
|
40
28
|
require 'rspec/core/rake_task'
|
41
29
|
desc 'Run RSpecs to confirm that all functionality is working as expected'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.9.rc1
|
data/lib/casclient.rb
CHANGED
@@ -56,7 +56,7 @@ module CASClient
|
|
56
56
|
# Log using the appropriate method if we have a logger
|
57
57
|
# if we dont' have a logger, gracefully ignore.
|
58
58
|
def method_missing(name, *args)
|
59
|
-
if
|
59
|
+
if !@real_logger.nil? && @real_logger.respond_to?(name)
|
60
60
|
@real_logger.send(name, *args)
|
61
61
|
end
|
62
62
|
end
|
data/lib/casclient/client.rb
CHANGED
@@ -4,27 +4,28 @@ module CASClient
|
|
4
4
|
attr_reader :cas_base_url, :cas_destination_logout_param_name
|
5
5
|
attr_reader :log, :username_session_key, :extra_attributes_session_key
|
6
6
|
attr_reader :ticket_store
|
7
|
+
attr_reader :proxy_host, :proxy_port
|
7
8
|
attr_writer :login_url, :validate_url, :proxy_url, :logout_url, :service_url
|
8
9
|
attr_accessor :proxy_callback_url, :proxy_retrieval_url
|
9
|
-
|
10
|
+
|
10
11
|
def initialize(conf = nil)
|
11
12
|
configure(conf) if conf
|
12
13
|
end
|
13
|
-
|
14
|
+
|
14
15
|
def configure(conf)
|
15
16
|
#TODO: raise error if conf contains unrecognized cas options (this would help detect user typos in the config)
|
16
17
|
|
17
18
|
raise ArgumentError, "Missing :cas_base_url parameter!" unless conf[:cas_base_url]
|
18
|
-
|
19
|
+
|
19
20
|
if conf.has_key?("encode_extra_attributes_as")
|
20
21
|
unless (conf[:encode_extra_attributes_as] == :json || conf[:encode_extra_attributes_as] == :yaml)
|
21
22
|
raise ArgumentError, "Unkown Value for :encode_extra_attributes_as parameter! Allowed options are json or yaml - #{conf[:encode_extra_attributes_as]}"
|
22
23
|
end
|
23
24
|
end
|
24
|
-
|
25
|
-
@cas_base_url = conf[:cas_base_url].gsub(/\/$/, '')
|
25
|
+
|
26
|
+
@cas_base_url = conf[:cas_base_url].gsub(/\/$/, '')
|
26
27
|
@cas_destination_logout_param_name = conf[:cas_destination_logout_param_name]
|
27
|
-
|
28
|
+
|
28
29
|
@login_url = conf[:login_url]
|
29
30
|
@logout_url = conf[:logout_url]
|
30
31
|
@validate_url = conf[:validate_url]
|
@@ -32,7 +33,11 @@ module CASClient
|
|
32
33
|
@service_url = conf[:service_url]
|
33
34
|
@force_ssl_verification = conf[:force_ssl_verification]
|
34
35
|
@proxy_callback_url = conf[:proxy_callback_url]
|
35
|
-
|
36
|
+
|
37
|
+
#proxy server settings
|
38
|
+
@proxy_host = conf[:proxy_host]
|
39
|
+
@proxy_port = conf[:proxy_port]
|
40
|
+
|
36
41
|
@username_session_key = conf[:username_session_key] || :cas_user
|
37
42
|
@extra_attributes_session_key = conf[:extra_attributes_session_key] || :cas_extra_attributes
|
38
43
|
@ticket_store_class = case conf[:ticket_store]
|
@@ -45,13 +50,13 @@ module CASClient
|
|
45
50
|
end
|
46
51
|
@ticket_store = @ticket_store_class.new conf[:ticket_store_config]
|
47
52
|
raise CASException, "The Ticket Store is not a subclass of AbstractTicketStore, it is a #{@ticket_store_class}" unless @ticket_store.kind_of? CASClient::Tickets::Storage::AbstractTicketStore
|
48
|
-
|
53
|
+
|
49
54
|
@log = CASClient::LoggerWrapper.new
|
50
55
|
@log.set_real_logger(conf[:logger]) if conf[:logger]
|
51
56
|
@ticket_store.log = @log
|
52
57
|
@conf_options = conf
|
53
58
|
end
|
54
|
-
|
59
|
+
|
55
60
|
def cas_destination_logout_param_name
|
56
61
|
@cas_destination_logout_param_name || "destination"
|
57
62
|
end
|
@@ -59,11 +64,11 @@ module CASClient
|
|
59
64
|
def login_url
|
60
65
|
@login_url || (cas_base_url + "/login")
|
61
66
|
end
|
62
|
-
|
67
|
+
|
63
68
|
def validate_url
|
64
69
|
@validate_url || (cas_base_url + "/proxyValidate")
|
65
70
|
end
|
66
|
-
|
71
|
+
|
67
72
|
# Returns the CAS server's logout url.
|
68
73
|
#
|
69
74
|
# If a logout_url has not been explicitly configured,
|
@@ -72,39 +77,40 @@ module CASClient
|
|
72
77
|
# destination_url:: Set this if you want the user to be
|
73
78
|
# able to immediately log back in. Generally
|
74
79
|
# you'll want to use something like <tt>request.referer</tt>.
|
75
|
-
# Note that the above behaviour describes RubyCAS-Server
|
80
|
+
# Note that the above behaviour describes RubyCAS-Server
|
76
81
|
# -- other CAS server implementations might use this
|
77
82
|
# parameter differently (or not at all).
|
78
83
|
# follow_url:: This satisfies section 2.3.1 of the CAS protocol spec.
|
79
84
|
# See http://www.ja-sig.org/products/cas/overview/protocol
|
80
|
-
def logout_url(destination_url = nil, follow_url = nil)
|
85
|
+
def logout_url(destination_url = nil, follow_url = nil, service_url = nil)
|
81
86
|
url = @logout_url || (cas_base_url + "/logout")
|
82
|
-
|
87
|
+
uri = URI.parse(url)
|
88
|
+
service_url = (service_url if service_url) || @service_url
|
89
|
+
h = uri.query ? query_to_hash(uri.query) : {}
|
90
|
+
|
83
91
|
if destination_url
|
84
92
|
# if present, remove the 'ticket' parameter from the destination_url
|
85
93
|
duri = URI.parse(destination_url)
|
86
|
-
|
87
|
-
|
88
|
-
duri.query = hash_to_query(
|
94
|
+
dh = duri.query ? query_to_hash(duri.query) : {}
|
95
|
+
dh.delete('ticket')
|
96
|
+
duri.query = hash_to_query(dh)
|
89
97
|
destination_url = duri.to_s.gsub(/\?$/, '')
|
90
|
-
end
|
91
|
-
|
92
|
-
if destination_url || follow_url
|
93
|
-
uri = URI.parse(url)
|
94
|
-
h = uri.query ? query_to_hash(uri.query) : {}
|
95
98
|
h[cas_destination_logout_param_name] = destination_url if destination_url
|
99
|
+
h['gateway'] = 'true'
|
100
|
+
elsif follow_url
|
96
101
|
h['url'] = follow_url if follow_url
|
97
|
-
|
98
|
-
uri.to_s
|
102
|
+
h['service'] = service_url
|
99
103
|
else
|
100
|
-
|
104
|
+
h['service'] = service_url
|
101
105
|
end
|
106
|
+
uri.query = hash_to_query(h)
|
107
|
+
uri.to_s
|
102
108
|
end
|
103
|
-
|
109
|
+
|
104
110
|
def proxy_url
|
105
111
|
@proxy_url || (cas_base_url + "/proxy")
|
106
112
|
end
|
107
|
-
|
113
|
+
|
108
114
|
def validate_service_ticket(st)
|
109
115
|
uri = URI.parse(validate_url)
|
110
116
|
h = uri.query ? query_to_hash(uri.query) : {}
|
@@ -113,7 +119,7 @@ module CASClient
|
|
113
119
|
h['renew'] = "1" if st.renew
|
114
120
|
h['pgtUrl'] = proxy_callback_url if proxy_callback_url
|
115
121
|
uri.query = hash_to_query(h)
|
116
|
-
|
122
|
+
|
117
123
|
response = request_cas_response(uri, ValidationResponse)
|
118
124
|
st.user = response.user
|
119
125
|
st.extra_attributes = response.extra_attributes
|
@@ -121,22 +127,20 @@ module CASClient
|
|
121
127
|
st.success = response.is_success?
|
122
128
|
st.failure_code = response.failure_code
|
123
129
|
st.failure_message = response.failure_message
|
124
|
-
|
130
|
+
|
125
131
|
return st
|
126
132
|
end
|
127
133
|
alias validate_proxy_ticket validate_service_ticket
|
128
|
-
|
134
|
+
|
129
135
|
# Returns true if the configured CAS server is up and responding;
|
130
136
|
# false otherwise.
|
131
137
|
def cas_server_is_up?
|
132
138
|
uri = URI.parse(login_url)
|
133
|
-
|
139
|
+
|
134
140
|
log.debug "Checking if CAS server at URI '#{uri}' is up..."
|
135
|
-
|
136
|
-
https =
|
137
|
-
|
138
|
-
https.verify_mode = (@force_ssl_verification ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE)
|
139
|
-
|
141
|
+
|
142
|
+
https = https_connection(uri)
|
143
|
+
|
140
144
|
begin
|
141
145
|
raw_res = https.start do |conn|
|
142
146
|
conn.get("#{uri.path}?#{uri.query}")
|
@@ -145,22 +149,22 @@ module CASClient
|
|
145
149
|
log.warn "CAS server did not respond! (#{e.inspect})"
|
146
150
|
return false
|
147
151
|
end
|
148
|
-
|
152
|
+
|
149
153
|
log.debug "CAS server responded with #{raw_res.inspect}:\n#{raw_res.body}"
|
150
|
-
|
154
|
+
|
151
155
|
return raw_res.kind_of?(Net::HTTPSuccess)
|
152
156
|
end
|
153
|
-
|
154
|
-
# Requests a login using the given credentials for the given service;
|
157
|
+
|
158
|
+
# Requests a login using the given credentials for the given service;
|
155
159
|
# returns a LoginResponse object.
|
156
160
|
def login_to_service(credentials, service)
|
157
161
|
lt = request_login_ticket
|
158
|
-
|
162
|
+
|
159
163
|
data = credentials.merge(
|
160
164
|
:lt => lt,
|
161
|
-
:service => service
|
165
|
+
:service => service
|
162
166
|
)
|
163
|
-
|
167
|
+
|
164
168
|
res = submit_data_to_cas(login_url, data)
|
165
169
|
response = CASClient::LoginResponse.new(res)
|
166
170
|
|
@@ -170,7 +174,7 @@ module CASClient
|
|
170
174
|
|
171
175
|
return response
|
172
176
|
end
|
173
|
-
|
177
|
+
|
174
178
|
# Requests a login ticket from the CAS server for use in a login request;
|
175
179
|
# returns a LoginTicket object.
|
176
180
|
#
|
@@ -178,18 +182,16 @@ module CASClient
|
|
178
182
|
# tickets in this manner is not part of the official CAS spec.
|
179
183
|
def request_login_ticket
|
180
184
|
uri = URI.parse(login_url+'Ticket')
|
181
|
-
https =
|
182
|
-
https.use_ssl = (uri.scheme == 'https')
|
183
|
-
https.verify_mode = (@force_ssl_verification ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE)
|
185
|
+
https = https_connection(uri)
|
184
186
|
res = https.post(uri.path, ';')
|
185
|
-
|
187
|
+
|
186
188
|
raise CASException, res.body unless res.kind_of? Net::HTTPSuccess
|
187
|
-
|
189
|
+
|
188
190
|
res.body.strip
|
189
191
|
end
|
190
|
-
|
192
|
+
|
191
193
|
# Requests a proxy ticket from the CAS server for the given service
|
192
|
-
# using the given pgt (proxy granting ticket); returns a ProxyTicket
|
194
|
+
# using the given pgt (proxy granting ticket); returns a ProxyTicket
|
193
195
|
# object.
|
194
196
|
#
|
195
197
|
# The pgt required to request a proxy ticket is obtained as part of
|
@@ -200,17 +202,17 @@ module CASClient
|
|
200
202
|
h['pgt'] = pgt.ticket
|
201
203
|
h['targetService'] = target_service
|
202
204
|
uri.query = hash_to_query(h)
|
203
|
-
|
205
|
+
|
204
206
|
response = request_cas_response(uri, ProxyResponse)
|
205
|
-
|
207
|
+
|
206
208
|
pt = ProxyTicket.new(response.proxy_ticket, target_service)
|
207
209
|
pt.success = response.is_success?
|
208
210
|
pt.failure_code = response.failure_code
|
209
211
|
pt.failure_message = response.failure_message
|
210
|
-
|
212
|
+
|
211
213
|
return pt
|
212
214
|
end
|
213
|
-
|
215
|
+
|
214
216
|
def retrieve_proxy_granting_ticket(pgt_iou)
|
215
217
|
pgt = @ticket_store.retrieve_pgt(pgt_iou)
|
216
218
|
|
@@ -218,24 +220,29 @@ module CASClient
|
|
218
220
|
|
219
221
|
ProxyGrantingTicket.new(pgt, pgt_iou)
|
220
222
|
end
|
221
|
-
|
223
|
+
|
222
224
|
def add_service_to_login_url(service_url)
|
223
225
|
uri = URI.parse(login_url)
|
224
226
|
uri.query = (uri.query ? uri.query + "&" : "") + "service=#{CGI.escape(service_url)}"
|
225
227
|
uri.to_s
|
226
228
|
end
|
227
|
-
|
229
|
+
|
228
230
|
private
|
231
|
+
|
232
|
+
def https_connection(uri)
|
233
|
+
https = Net::HTTP::Proxy(proxy_host, proxy_port).new(uri.host, uri.port)
|
234
|
+
https.use_ssl = (uri.scheme == 'https')
|
235
|
+
https.verify_mode = (@force_ssl_verification ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE)
|
236
|
+
https
|
237
|
+
end
|
238
|
+
|
229
239
|
# Fetches a CAS response of the given type from the given URI.
|
230
240
|
# Type should be either ValidationResponse or ProxyResponse.
|
231
241
|
def request_cas_response(uri, type, options={})
|
232
242
|
log.debug "Requesting CAS response for URI #{uri}"
|
233
|
-
|
243
|
+
|
234
244
|
uri = URI.parse(uri) unless uri.kind_of? URI
|
235
|
-
https =
|
236
|
-
https.use_ssl = (uri.scheme == 'https')
|
237
|
-
https.verify_mode = (@force_ssl_verification ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE)
|
238
|
-
|
245
|
+
https = https_connection(uri)
|
239
246
|
begin
|
240
247
|
raw_res = https.start do |conn|
|
241
248
|
conn.get("#{uri.path}?#{uri.query}")
|
@@ -244,7 +251,7 @@ module CASClient
|
|
244
251
|
log.error "CAS server did not respond! (#{e.inspect})"
|
245
252
|
raise "The CAS authentication server at #{uri} is not responding!"
|
246
253
|
end
|
247
|
-
|
254
|
+
|
248
255
|
# We accept responses of type 422 since RubyCAS-Server generates these
|
249
256
|
# in response to requests from the client that are processable but contain
|
250
257
|
# invalid CAS data (for example an invalid service ticket).
|
@@ -254,25 +261,23 @@ module CASClient
|
|
254
261
|
log.error "CAS server responded with an error! (#{raw_res.inspect})"
|
255
262
|
raise "The CAS authentication server at #{uri} responded with an error (#{raw_res.inspect})!"
|
256
263
|
end
|
257
|
-
|
264
|
+
|
258
265
|
type.new(raw_res.body, @conf_options)
|
259
266
|
end
|
260
|
-
|
267
|
+
|
261
268
|
# Submits some data to the given URI and returns a Net::HTTPResponse.
|
262
269
|
def submit_data_to_cas(uri, data)
|
263
270
|
uri = URI.parse(uri) unless uri.kind_of? URI
|
264
271
|
req = Net::HTTP::Post.new(uri.path)
|
265
272
|
req.set_form_data(data, ';')
|
266
|
-
https =
|
267
|
-
https.use_ssl = (uri.scheme == 'https')
|
268
|
-
https.verify_mode = (@force_ssl_verification ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE)
|
273
|
+
https = https_connection(uri)
|
269
274
|
https.start {|conn| conn.request(req) }
|
270
275
|
end
|
271
|
-
|
276
|
+
|
272
277
|
def query_to_hash(query)
|
273
278
|
CGI.parse(query)
|
274
279
|
end
|
275
|
-
|
280
|
+
|
276
281
|
def hash_to_query(hash)
|
277
282
|
pairs = []
|
278
283
|
hash.each do |k, vals|
|