omniauth-cas 1.1.0.beta.1 → 1.1.0.pre.rc.1
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.
- checksums.yaml +6 -14
- data/.editorconfig +16 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/README.md +36 -10
- data/lib/omniauth-cas.rb +1 -1
- data/lib/omniauth/cas/version.rb +1 -1
- data/lib/omniauth/strategies/cas.rb +99 -49
- data/lib/omniauth/strategies/cas/logout_request.rb +58 -0
- data/lib/omniauth/strategies/cas/service_ticket_validator.rb +18 -10
- data/omniauth-cas.gemspec +5 -7
- data/spec/fixtures/cas_success_jasig.xml +16 -0
- data/spec/omniauth/strategies/cas/logout_request_spec.rb +103 -0
- data/spec/omniauth/strategies/cas/service_ticket_validator_spec.rb +35 -13
- data/spec/omniauth/strategies/cas_spec.rb +174 -77
- data/spec/spec_helper.rb +0 -4
- metadata +39 -51
- data/.rvmrc +0 -1
- data/History.md +0 -58
- data/lib/omniauth/strategies/cas/configuration.rb +0 -34
- data/spec/omniauth/strategies/cas/configuration_spec.rb +0 -60
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NWYwMGVjNWEzMzkzODlhOWEwNWY0MWExYTBiNWM2YjdlNGNlMDAyZjJlMjQx
|
10
|
-
YTdiZWRkMzJhODgwOTY2YjMzZTg2ZWZiOWVjYTNiN2NlMmUzZTNhYzFjZGYx
|
11
|
-
MGJiODI3OTdkMDBkMGM3YjA3MmU1YWFkNmQ0YTg0Y2E4NjAzYjI=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YTkyYjcwZTQxMzE3NzNmYmFjOWE0ZjkyMDY4MzMxMjlhNDU1MTg2ZjQwYmFm
|
14
|
-
YzA2MzJkZGNlNjYzYmE2YjE3NjZiMTZiZGJkYzZkMzdlMzY3NjE1OWU5MjI1
|
15
|
-
MGYxZWQ1MDQ2NzhmNjUzNjVmNzJkMTc0OGJjMGIyOTYyN2MwOGM=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9060c98d3a2f5102d1060c66308ecc86ec7fa0eb
|
4
|
+
data.tar.gz: 8c46c748a3580c4d5ef43307e283f003110dd6ef
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 46e3e70d1513ee2f883f4996a575626b32c3c781e084f88709813b4490542e6fc10a85eaf01b9d68af8a889f48f692e7d934cac504d18462c21ce84685ffadb4
|
7
|
+
data.tar.gz: 3987aebc35372d17e80487bcc688805f37c4ced4434d43db504d38ab17de6dc97bc7bf1a1d4d60aadc33887ef1daffc018d97b92c8b004f14858f4720d28da14
|
data/.editorconfig
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# EditorConfig helps developers define and maintain consistent
|
2
|
+
# coding styles between different editors and IDEs
|
3
|
+
# editorconfig.org
|
4
|
+
|
5
|
+
root = true
|
6
|
+
|
7
|
+
[*]
|
8
|
+
# Change these settings to your own preference
|
9
|
+
indent_style = space
|
10
|
+
indent_size = 2
|
11
|
+
|
12
|
+
# We recommend you to keep these unchanged
|
13
|
+
end_of_line = lf
|
14
|
+
charset = utf-8
|
15
|
+
trim_trailing_whitespace = true
|
16
|
+
insert_final_newline = true
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.3
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -4,11 +4,13 @@
|
|
4
4
|
[version]: http://badge.fury.io/rb/omniauth-cas
|
5
5
|
[travis]: http://travis-ci.org/dlindahl/omniauth-cas
|
6
6
|
[travis_status]: https://secure.travis-ci.org/dlindahl/omniauth-cas.png
|
7
|
+
[releases]: https://github.com/dlindahl/omniauth-cas/releases
|
7
8
|
|
8
9
|
This is a OmniAuth 1.0 compatible port of the previously available
|
9
10
|
[OmniAuth CAS strategy][old_omniauth_cas] that was bundled with OmniAuth 0.3.
|
10
11
|
|
11
|
-
[View the documentation][document_up]
|
12
|
+
* [View the documentation][document_up]
|
13
|
+
* [Changelog][releases]
|
12
14
|
|
13
15
|
## Installation
|
14
16
|
|
@@ -41,21 +43,44 @@ end
|
|
41
43
|
OmniAuth CAS requires at least one of the following two configuration options:
|
42
44
|
|
43
45
|
* `url` - Defines the URL of your CAS server (i.e. `http://example.org:8080`)
|
44
|
-
* `host` - Defines the host of your CAS server.
|
45
|
-
* `login_url` - Defines the URL used to prompt users for their login information. Defaults to `/login`
|
46
|
-
If no `host` is configured, the host application's domain will be used.
|
46
|
+
* `host` - Defines the host of your CAS server (i.e. `example.org`).
|
47
47
|
|
48
48
|
#### Optional
|
49
49
|
|
50
50
|
Other configuration options:
|
51
51
|
|
52
|
-
* `port` - The port to use for your configured CAS `host`. Optional if using `url
|
53
|
-
* `ssl` - TRUE to connect to your CAS server over SSL. Optional if using `url
|
54
|
-
* `service_validate_url` - The URL to use to validate a user. Defaults to `'/serviceValidate'
|
55
|
-
* `
|
56
|
-
* `
|
57
|
-
* `
|
52
|
+
* `port` - The port to use for your configured CAS `host`. Optional if using `url`.
|
53
|
+
* `ssl` - TRUE to connect to your CAS server over SSL. Optional if using `url`.
|
54
|
+
* `service_validate_url` - The URL to use to validate a user. Defaults to `'/serviceValidate'`.
|
55
|
+
* `callback_url` - The URL custom URL path which CAS uses to call back to the service. Defaults to `/users/auth/cas/callback`.
|
56
|
+
* `logout_url` - The URL to use to logout a user. Defaults to `'/logout'`.
|
57
|
+
* `login_url` - Defines the URL used to prompt users for their login information. Defaults to `/login` If no `host` is configured, the host application's domain will be used.
|
58
|
+
* `uid_field` - The user data attribute to use as your user's unique identifier. Defaults to `'user'` (which usually contains the user's login name).
|
59
|
+
* `ca_path` - Optional when `ssl` is `true`. Sets path of a CA certification directory. See [Net::HTTP][net_http] for more details.
|
58
60
|
* `disable_ssl_verification` - Optional when `ssl` is true. Disables verification.
|
61
|
+
* `on_single_sign_out` - Optional. Callback used when a [CAS 3.1 Single Sign Out][sso]
|
62
|
+
request is received.
|
63
|
+
* `fetch_raw_info` - Optional. Callback used to return additional "raw" user
|
64
|
+
info from other sources.
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
provider :cas,
|
68
|
+
fetch_raw_info: lambda { |strategy, options, ticket, user_info|
|
69
|
+
ExternalService.get(user_info[:user]).attributes
|
70
|
+
}
|
71
|
+
```
|
72
|
+
|
73
|
+
Configurable options for values returned by CAS:
|
74
|
+
|
75
|
+
* `uid_key` - The user ID data attribute to use as your user's unique identifier. Defaults to `'user'` (which usually contains the user's login name).
|
76
|
+
* `name_key` - The data attribute containing user first and last name. Defaults to `'name'`.
|
77
|
+
* `email_key` - The data attribute containing user email address. Defaults to `'email'`.
|
78
|
+
* `nickname_key` - The data attribute containing user's nickname. Defaults to `'user'`.
|
79
|
+
* `first_name_key` - The data attribute containing user first name. Defaults to `'first_name'`.
|
80
|
+
* `last_name_key` - The data attribute containing user last name. Defaults to `'last_name'`.
|
81
|
+
* `location_key` - The data attribute containing user location/address. Defaults to `'location'`.
|
82
|
+
* `image_key` - The data attribute containing user image/picture. Defaults to `'image'`.
|
83
|
+
* `phone_key` - The data attribute containing user contact phone number. Defaults to `'phone'`.
|
59
84
|
|
60
85
|
## Migrating from OmniAuth 0.3
|
61
86
|
|
@@ -95,3 +120,4 @@ Special thanks go out to the following people
|
|
95
120
|
[old_omniauth_cas]: https://github.com/intridea/omniauth/blob/0-3-stable/oa-enterprise/lib/omniauth/strategies/cas.rb
|
96
121
|
[document_up]: http://dlindahl.github.com/omniauth-cas/
|
97
122
|
[net_http]: http://ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html
|
123
|
+
[sso]: https://wiki.jasig.org/display/CASUM/Single+Sign+Out
|
data/lib/omniauth-cas.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require 'omniauth/cas'
|
data/lib/omniauth/cas/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'omniauth
|
1
|
+
require 'omniauth'
|
2
2
|
require 'addressable/uri'
|
3
3
|
|
4
4
|
module OmniAuth
|
@@ -10,8 +10,8 @@ module OmniAuth
|
|
10
10
|
class MissingCASTicket < StandardError; end
|
11
11
|
class InvalidCASTicket < StandardError; end
|
12
12
|
|
13
|
-
autoload :Configuration, 'omniauth/strategies/cas/configuration'
|
14
13
|
autoload :ServiceTicketValidator, 'omniauth/strategies/cas/service_ticket_validator'
|
14
|
+
autoload :LogoutRequest, 'omniauth/strategies/cas/logout_request'
|
15
15
|
|
16
16
|
attr_accessor :raw_info
|
17
17
|
alias_method :user_info, :raw_info
|
@@ -25,81 +25,121 @@ module OmniAuth
|
|
25
25
|
option :service_validate_url, '/serviceValidate'
|
26
26
|
option :login_url, '/login'
|
27
27
|
option :logout_url, '/logout'
|
28
|
-
option :
|
28
|
+
option :on_single_sign_out, Proc.new {}
|
29
|
+
# A Proc or lambda that returns a Hash of additional user info to be
|
30
|
+
# merged with the info returned by the CAS server.
|
31
|
+
#
|
32
|
+
# @param [Object] An instance of OmniAuth::Strategies::CAS for the current request
|
33
|
+
# @param [String] The user's Service Ticket value
|
34
|
+
# @param [Hash] The user info for the Service Ticket returned by the CAS server
|
35
|
+
#
|
36
|
+
# @return [Hash] Extra user info
|
37
|
+
option :fetch_raw_info, Proc.new { Hash.new }
|
38
|
+
# Make all the keys configurable with some defaults set here
|
39
|
+
option :uid_field, 'user'
|
40
|
+
option :name_key, 'name'
|
41
|
+
option :email_key, 'email'
|
42
|
+
option :nickname_key, 'user'
|
43
|
+
option :first_name_key, 'first_name'
|
44
|
+
option :last_name_key, 'last_name'
|
45
|
+
option :location_key, 'location'
|
46
|
+
option :image_key, 'image'
|
47
|
+
option :phone_key, 'phone'
|
29
48
|
|
30
49
|
# As required by https://github.com/intridea/omniauth/wiki/Auth-Hash-Schema
|
31
|
-
AuthHashSchemaKeys = %w{name email first_name last_name location image phone}
|
50
|
+
AuthHashSchemaKeys = %w{name email nickname first_name last_name location image phone}
|
32
51
|
info do
|
33
52
|
prune!({
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
53
|
+
name: raw_info[options[:name_key].to_s],
|
54
|
+
email: raw_info[options[:email_key].to_s],
|
55
|
+
nickname: raw_info[options[:nickname_key].to_s],
|
56
|
+
first_name: raw_info[options[:first_name_key].to_s],
|
57
|
+
last_name: raw_info[options[:last_name_key].to_s],
|
58
|
+
location: raw_info[options[:location_key].to_s],
|
59
|
+
image: raw_info[options[:image_key].to_s],
|
60
|
+
phone: raw_info[options[:phone_key].to_s]
|
41
61
|
})
|
42
62
|
end
|
43
63
|
|
44
64
|
extra do
|
45
|
-
prune!
|
65
|
+
prune!(
|
66
|
+
raw_info.delete_if{ |k,v| AuthHashSchemaKeys.include?(k) }
|
67
|
+
)
|
46
68
|
end
|
47
69
|
|
48
70
|
uid do
|
49
|
-
raw_info[
|
71
|
+
raw_info[options[:uid_field].to_s]
|
50
72
|
end
|
51
73
|
|
52
74
|
credentials do
|
53
|
-
prune!({
|
54
|
-
:ticket => @ticket
|
55
|
-
})
|
56
|
-
end
|
57
|
-
|
58
|
-
def initialize( app, *args, &block )
|
59
|
-
super
|
60
|
-
@configuration = Configuration.new( @options )
|
75
|
+
prune!({ ticket: @ticket })
|
61
76
|
end
|
62
77
|
|
63
78
|
def callback_phase
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
79
|
+
if on_sso_path?
|
80
|
+
single_sign_out_phase
|
81
|
+
else
|
82
|
+
@ticket = request.params['ticket']
|
83
|
+
return fail!(:no_ticket, MissingCASTicket.new('No CAS Ticket')) unless @ticket
|
84
|
+
fetch_raw_info(@ticket)
|
85
|
+
return fail!(:invalid_ticket, InvalidCASTicket.new('Invalid CAS Ticket')) if raw_info.empty?
|
86
|
+
super
|
87
|
+
end
|
73
88
|
end
|
74
89
|
|
75
90
|
def request_phase
|
76
|
-
service_url = append_params(
|
91
|
+
service_url = append_params(callback_url, return_url)
|
77
92
|
|
78
93
|
[
|
79
94
|
302,
|
80
95
|
{
|
81
|
-
'Location' => login_url(
|
96
|
+
'Location' => login_url(service_url),
|
82
97
|
'Content-Type' => 'text/plain'
|
83
98
|
},
|
84
99
|
["You are being redirected to CAS for sign-in."]
|
85
100
|
]
|
86
101
|
end
|
87
102
|
|
103
|
+
def on_sso_path?
|
104
|
+
request.post? && request.params.has_key?('logoutRequest')
|
105
|
+
end
|
106
|
+
|
107
|
+
def single_sign_out_phase
|
108
|
+
logout_request_service.new(self, request).call(options)
|
109
|
+
end
|
110
|
+
|
88
111
|
# Build a CAS host with protocol and port
|
89
112
|
#
|
90
113
|
#
|
91
114
|
def cas_url
|
115
|
+
extract_url if options['url']
|
116
|
+
validate_cas_setup
|
92
117
|
@cas_url ||= begin
|
93
118
|
uri = Addressable::URI.new
|
94
|
-
uri.host
|
95
|
-
uri.scheme =
|
96
|
-
uri.port
|
97
|
-
uri.path
|
98
|
-
|
119
|
+
uri.host = options.host
|
120
|
+
uri.scheme = options.ssl ? 'https' : 'http'
|
121
|
+
uri.port = options.port
|
122
|
+
uri.path = options.path
|
99
123
|
uri.to_s
|
100
124
|
end
|
101
125
|
end
|
102
126
|
|
127
|
+
def extract_url
|
128
|
+
url = Addressable::URI.parse(options.delete('url'))
|
129
|
+
options.merge!(
|
130
|
+
'host' => url.host,
|
131
|
+
'port' => url.port,
|
132
|
+
'path' => url.path,
|
133
|
+
'ssl' => url.scheme == 'https'
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
def validate_cas_setup
|
138
|
+
if options.host.nil? || options.login_url.nil?
|
139
|
+
raise ArgumentError.new(":host and :login_url MUST be provided")
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
103
143
|
# Build a service-validation URL from +service+ and +ticket+.
|
104
144
|
# If +service+ has a ticket param, first remove it. URL-encode
|
105
145
|
# +service+ and add it and the +ticket+ as paraemters to the
|
@@ -110,10 +150,12 @@ module OmniAuth
|
|
110
150
|
#
|
111
151
|
# @return [String] a URL like `http://cas.mycompany.com/serviceValidate?service=...&ticket=...`
|
112
152
|
def service_validate_url(service_url, ticket)
|
113
|
-
service_url = Addressable::URI.parse(
|
153
|
+
service_url = Addressable::URI.parse(service_url)
|
114
154
|
service_url.query_values = service_url.query_values.tap { |qs| qs.delete('ticket') }
|
115
|
-
|
116
|
-
|
155
|
+
cas_url + append_params(options.service_validate_url, {
|
156
|
+
service: service_url.to_s,
|
157
|
+
ticket: ticket
|
158
|
+
})
|
117
159
|
end
|
118
160
|
|
119
161
|
# Build a CAS login URL from +service+.
|
@@ -122,7 +164,7 @@ module OmniAuth
|
|
122
164
|
#
|
123
165
|
# @return [String] a URL like `http://cas.mycompany.com/login?service=...`
|
124
166
|
def login_url(service)
|
125
|
-
cas_url + append_params(
|
167
|
+
cas_url + append_params(options.login_url, { service: service })
|
126
168
|
end
|
127
169
|
|
128
170
|
# Adds URL-escaped +parameters+ to +base+.
|
@@ -133,20 +175,25 @@ module OmniAuth
|
|
133
175
|
# @return [String] the new joined URL.
|
134
176
|
def append_params(base, params)
|
135
177
|
params = params.each { |k,v| v = Rack::Utils.escape(v) }
|
136
|
-
|
137
178
|
Addressable::URI.parse(base).tap do |base_uri|
|
138
|
-
base_uri.query_values = (base_uri.query_values || {}).merge(
|
179
|
+
base_uri.query_values = (base_uri.query_values || {}).merge(params)
|
139
180
|
end.to_s
|
140
181
|
end
|
141
182
|
|
142
|
-
#
|
143
|
-
#
|
144
|
-
def
|
145
|
-
|
183
|
+
# Validate the Service Ticket
|
184
|
+
# @return [Object] the validated Service Ticket
|
185
|
+
def validate_service_ticket(ticket)
|
186
|
+
ServiceTicketValidator.new(self, options, callback_url, ticket).call
|
146
187
|
end
|
147
188
|
|
148
189
|
private
|
149
190
|
|
191
|
+
def fetch_raw_info(ticket)
|
192
|
+
ticket_user_info = validate_service_ticket(ticket).user_info
|
193
|
+
custom_user_info = options.fetch_raw_info.call(self, options, ticket, ticket_user_info)
|
194
|
+
self.raw_info = ticket_user_info.merge(custom_user_info)
|
195
|
+
end
|
196
|
+
|
150
197
|
# Deletes Hash pairs with `nil` values.
|
151
198
|
# From https://github.com/mkdynamic/omniauth-facebook/blob/972ed5e3456bcaed7df1f55efd7c05c216c8f48e/lib/omniauth/strategies/facebook.rb#L122-127
|
152
199
|
def prune!(hash)
|
@@ -158,13 +205,16 @@ module OmniAuth
|
|
158
205
|
|
159
206
|
def return_url
|
160
207
|
# If the request already has a `url` parameter, then it will already be appended to the callback URL.
|
161
|
-
if request.params
|
208
|
+
if request.params && request.params['url']
|
162
209
|
{}
|
163
210
|
else
|
164
|
-
{ :
|
211
|
+
{ url: request.referer }
|
165
212
|
end
|
166
213
|
end
|
167
214
|
|
215
|
+
def logout_request_service
|
216
|
+
LogoutRequest
|
217
|
+
end
|
168
218
|
end
|
169
219
|
end
|
170
220
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module OmniAuth
|
2
|
+
module Strategies
|
3
|
+
class CAS
|
4
|
+
class LogoutRequest
|
5
|
+
def initialize(strategy, request)
|
6
|
+
@strategy, @request = strategy, request
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(options = {})
|
10
|
+
@options = options
|
11
|
+
|
12
|
+
begin
|
13
|
+
result = single_sign_out_callback.call(*logout_request)
|
14
|
+
rescue StandardError => err
|
15
|
+
return @strategy.fail! :logout_request, err
|
16
|
+
else
|
17
|
+
result = [200,{},'OK'] if result == true || result.nil?
|
18
|
+
ensure
|
19
|
+
return unless result
|
20
|
+
|
21
|
+
# TODO: Why does ActionPack::Response return [status,headers,body]
|
22
|
+
# when Rack::Response#new wants [body,status,headers]? Additionally,
|
23
|
+
# why does Rack::Response differ in argument order from the usual
|
24
|
+
# Rack-like [status,headers,body] array?
|
25
|
+
return Rack::Response.new(result[2],result[0],result[1]).finish
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def logout_request
|
32
|
+
@logout_request ||= begin
|
33
|
+
saml = Nokogiri.parse(@request.params['logoutRequest'])
|
34
|
+
name_id = saml.xpath('//saml:NameID').text
|
35
|
+
sess_idx = saml.xpath('//samlp:SessionIndex').text
|
36
|
+
inject_params(name_id:name_id, session_index:sess_idx)
|
37
|
+
@request
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def inject_params(new_params)
|
42
|
+
rack_input = @request.env['rack.input'].read
|
43
|
+
params = Rack::Utils.parse_query(rack_input, '&').merge new_params
|
44
|
+
@request.env['rack.input'] = StringIO.new(Rack::Utils.build_query(params))
|
45
|
+
rescue
|
46
|
+
# A no-op intended to ensure that the ensure block is run
|
47
|
+
raise
|
48
|
+
ensure
|
49
|
+
@request.env['rack.input'].rewind
|
50
|
+
end
|
51
|
+
|
52
|
+
def single_sign_out_callback
|
53
|
+
@options[:on_single_sign_out]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -6,7 +6,6 @@ module OmniAuth
|
|
6
6
|
module Strategies
|
7
7
|
class CAS
|
8
8
|
class ServiceTicketValidator
|
9
|
-
|
10
9
|
VALIDATION_REQUEST_HEADERS = { 'Accept' => '*/*' }
|
11
10
|
|
12
11
|
# Build a validator from a +configuration+, a
|
@@ -20,6 +19,13 @@ module OmniAuth
|
|
20
19
|
@uri = URI.parse(strategy.service_validate_url(return_to_url, ticket))
|
21
20
|
end
|
22
21
|
|
22
|
+
# Executes a network request to process the CAS Service Response
|
23
|
+
def call
|
24
|
+
@response_body = get_service_response_body
|
25
|
+
@success_body = find_authentication_success(@response_body)
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
23
29
|
# Request validation of the ticket from the CAS server's
|
24
30
|
# serviceValidate (CAS 2.0) function.
|
25
31
|
#
|
@@ -29,7 +35,7 @@ module OmniAuth
|
|
29
35
|
#
|
30
36
|
# @raise any connection errors encountered.
|
31
37
|
def user_info
|
32
|
-
parse_user_info(
|
38
|
+
parse_user_info(@success_body)
|
33
39
|
end
|
34
40
|
|
35
41
|
private
|
@@ -38,18 +44,21 @@ module OmniAuth
|
|
38
44
|
# returns nil if given nil
|
39
45
|
def parse_user_info(node)
|
40
46
|
return nil if node.nil?
|
41
|
-
|
42
47
|
{}.tap do |hash|
|
43
48
|
node.children.each do |e|
|
44
|
-
|
45
|
-
|
46
|
-
e.name == 'proxies'
|
49
|
+
node_name = e.name.sub(/^cas:/, '')
|
50
|
+
unless e.kind_of?(Nokogiri::XML::Text) || node_name == 'proxies'
|
47
51
|
# There are no child elements
|
48
52
|
if e.element_children.count == 0
|
49
|
-
hash[
|
53
|
+
hash[node_name] = e.content
|
50
54
|
elsif e.element_children.count
|
51
|
-
|
52
|
-
|
55
|
+
# JASIG style extra attributes
|
56
|
+
if node_name == 'attributes'
|
57
|
+
hash.merge!(parse_user_info(e))
|
58
|
+
else
|
59
|
+
hash[node_name] = [] if hash[node_name].nil?
|
60
|
+
hash[node_name].push(parse_user_info(e))
|
61
|
+
end
|
53
62
|
end
|
54
63
|
end
|
55
64
|
end
|
@@ -88,7 +97,6 @@ module OmniAuth
|
|
88
97
|
end
|
89
98
|
result
|
90
99
|
end
|
91
|
-
|
92
100
|
end
|
93
101
|
end
|
94
102
|
end
|