cf-uaa-lib 3.2.4 → 3.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/uaa/http.rb +8 -3
- data/lib/uaa/info.rb +1 -0
- data/lib/uaa/scim.rb +19 -14
- data/lib/uaa/token_issuer.rb +1 -0
- data/lib/uaa/version.rb +1 -1
- data/spec/http_spec.rb +12 -0
- data/spec/scim_spec.rb +32 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22244230c33436d1113ddefaa82fd4e8f68f611b
|
4
|
+
data.tar.gz: 67c4faa41e5dabcd57944e634dc1d7689ff63402
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 08a6c3960dfd815606d99b477450068c1350f8ecfca4617f2bd9401faa594565290aa4c1c191fc48254a25b27b629701525bee4192cc23df8a1c835b791257b5
|
7
|
+
data.tar.gz: be6448d4cc5dddb693a122b7cf86062c62f950163dbb648cb0c03cee05899f74b47081e7b1e85aef9f95973fa995c5b52f004bd152c401050713ee2a44eb12b1
|
data/lib/uaa/http.rb
CHANGED
@@ -50,7 +50,7 @@ module Http
|
|
50
50
|
|
51
51
|
def self.included(base)
|
52
52
|
base.class_eval do
|
53
|
-
attr_accessor :http_proxy, :https_proxy, :skip_ssl_validation, :ssl_ca_file
|
53
|
+
attr_accessor :http_proxy, :https_proxy, :skip_ssl_validation, :ssl_ca_file, :ssl_cert_store, :zone
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -128,8 +128,10 @@ module Http
|
|
128
128
|
def http_put(target, path, body, headers = {}) request(target, :put, path, body, headers) end
|
129
129
|
def http_patch(target, path, body, headers = {}) request(target, :patch, path, body, headers) end
|
130
130
|
|
131
|
-
def http_delete(target, path, authorization)
|
132
|
-
|
131
|
+
def http_delete(target, path, authorization, zone = nil)
|
132
|
+
hdrs = { "authorization" => authorization }
|
133
|
+
hdrs['X-Identity-Zone-Subdomain'] = zone if zone
|
134
|
+
status = request(target, :delete, path, nil, hdrs)[0]
|
133
135
|
unless [200, 204].include?(status)
|
134
136
|
raise (status == 404 ? NotFound : BadResponse), "invalid response from #{path}: #{status}"
|
135
137
|
end
|
@@ -188,6 +190,9 @@ module Http
|
|
188
190
|
elsif ssl_ca_file
|
189
191
|
http.ca_file = File.expand_path(ssl_ca_file)
|
190
192
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
193
|
+
elsif ssl_cert_store
|
194
|
+
http.cert_store = ssl_cert_store
|
195
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
191
196
|
end
|
192
197
|
end
|
193
198
|
|
data/lib/uaa/info.rb
CHANGED
@@ -33,6 +33,7 @@ class Info
|
|
33
33
|
self.target = target
|
34
34
|
self.skip_ssl_validation = options[:skip_ssl_validation]
|
35
35
|
self.ssl_ca_file = options[:ssl_ca_file]
|
36
|
+
self.ssl_cert_store = options[:ssl_cert_store]
|
36
37
|
self.symbolize_keys = options[:symbolize_keys]
|
37
38
|
self.http_proxy = options[:http_proxy]
|
38
39
|
self.https_proxy = options[:https_proxy]
|
data/lib/uaa/scim.rb
CHANGED
@@ -55,6 +55,12 @@ class Scim
|
|
55
55
|
kc || kd
|
56
56
|
end
|
57
57
|
|
58
|
+
def headers()
|
59
|
+
hdrs = { 'authorization' => @auth_header }
|
60
|
+
hdrs['X-Identity-Zone-Subdomain'] = @zone if @zone
|
61
|
+
hdrs
|
62
|
+
end
|
63
|
+
|
58
64
|
# This is very inefficient and should be unnecessary. SCIM (1.1 and early
|
59
65
|
# 2.0 drafts) specify that attribute names are case insensitive. However
|
60
66
|
# in the UAA attribute names are currently case sensitive. This hack takes
|
@@ -102,8 +108,10 @@ class Scim
|
|
102
108
|
@key_style = options[:symbolize_keys] ? :downsym : :down
|
103
109
|
self.skip_ssl_validation = options[:skip_ssl_validation]
|
104
110
|
self.ssl_ca_file = options[:ssl_ca_file]
|
111
|
+
self.ssl_cert_store = options[:ssl_cert_store]
|
105
112
|
self.http_proxy = options[:http_proxy]
|
106
113
|
self.https_proxy = options[:https_proxy]
|
114
|
+
@zone = options[:zone]
|
107
115
|
end
|
108
116
|
|
109
117
|
# Convenience method to get the naming attribute, e.g. userName for user,
|
@@ -120,7 +128,7 @@ class Scim
|
|
120
128
|
def add(type, info)
|
121
129
|
path, info = type_info(type, :path), force_case(info)
|
122
130
|
reply = json_parse_reply(@key_style, *json_post(@target, path, info,
|
123
|
-
|
131
|
+
headers))
|
124
132
|
fake_client_id(reply) if type == :client # hide client reply, not quite scim
|
125
133
|
reply
|
126
134
|
end
|
@@ -130,7 +138,7 @@ class Scim
|
|
130
138
|
# @param [String] id the id attribute of the SCIM object
|
131
139
|
# @return [nil]
|
132
140
|
def delete(type, id)
|
133
|
-
http_delete @target, "#{type_info(type, :path)}/#{URI.encode(id)}", @auth_header
|
141
|
+
http_delete @target, "#{type_info(type, :path)}/#{URI.encode(id)}", @auth_header, @zone
|
134
142
|
end
|
135
143
|
|
136
144
|
# Replaces the contents of a SCIM object.
|
@@ -140,7 +148,7 @@ class Scim
|
|
140
148
|
path, info = type_info(type, :path), force_case(info)
|
141
149
|
ida = type == :client ? 'client_id' : 'id'
|
142
150
|
raise ArgumentError, "info must include #{ida}" unless id = info[ida]
|
143
|
-
|
151
|
+
hdrs = headers
|
144
152
|
if info && info['meta'] && (etag = info['meta']['version'])
|
145
153
|
hdrs.merge!('if-match' => etag)
|
146
154
|
end
|
@@ -158,7 +166,7 @@ class Scim
|
|
158
166
|
path, info = type_info(type, :path), force_case(info)
|
159
167
|
ida = type == :client ? 'client_id' : 'id'
|
160
168
|
raise ArgumentError, "info must include #{ida}" unless id = info[ida]
|
161
|
-
hdrs =
|
169
|
+
hdrs = headers
|
162
170
|
if info && info['meta'] && (etag = info['meta']['version'])
|
163
171
|
hdrs.merge!('if-match' => etag)
|
164
172
|
end
|
@@ -189,7 +197,7 @@ class Scim
|
|
189
197
|
end
|
190
198
|
qstr = query.empty?? '': "?#{Util.encode_form(query)}"
|
191
199
|
info = json_get(@target, "#{type_info(type, :path)}#{qstr}",
|
192
|
-
@key_style,
|
200
|
+
@key_style, headers)
|
193
201
|
unless info.is_a?(Hash) && info[rk = jkey(:resources)].is_a?(Array)
|
194
202
|
|
195
203
|
# hide client endpoints that are not yet scim compatible
|
@@ -212,7 +220,7 @@ class Scim
|
|
212
220
|
# @return (see #add)
|
213
221
|
def get(type, id)
|
214
222
|
info = json_get(@target, "#{type_info(type, :path)}/#{URI.encode(id)}",
|
215
|
-
@key_style,
|
223
|
+
@key_style, headers)
|
216
224
|
|
217
225
|
fake_client_id(info) if type == :client # hide client reply, not quite scim
|
218
226
|
info
|
@@ -288,8 +296,7 @@ class Scim
|
|
288
296
|
req = {"password" => new_password}
|
289
297
|
req["oldPassword"] = old_password if old_password
|
290
298
|
json_parse_reply(@key_style, *json_put(@target,
|
291
|
-
"#{type_info(:user, :path)}/#{URI.encode(user_id)}/password", req,
|
292
|
-
'authorization' => @auth_header))
|
299
|
+
"#{type_info(:user, :path)}/#{URI.encode(user_id)}/password", req, headers))
|
293
300
|
end
|
294
301
|
|
295
302
|
# Change client secret.
|
@@ -305,8 +312,7 @@ class Scim
|
|
305
312
|
req = {"secret" => new_secret }
|
306
313
|
req["oldSecret"] = old_secret if old_secret
|
307
314
|
json_parse_reply(@key_style, *json_put(@target,
|
308
|
-
"#{type_info(:client, :path)}/#{URI.encode(client_id)}/secret", req,
|
309
|
-
'authorization' => @auth_header))
|
315
|
+
"#{type_info(:client, :path)}/#{URI.encode(client_id)}/secret", req, headers))
|
310
316
|
end
|
311
317
|
|
312
318
|
def map_group(group, is_id, external_group)
|
@@ -314,19 +320,18 @@ class Scim
|
|
314
320
|
request = {key_name => group, :externalGroup => external_group, :schemas => ["urn:scim:schemas:core:1.0"] }
|
315
321
|
result = json_parse_reply(@key_style, *json_post(@target,
|
316
322
|
"#{type_info(:group_mapping, :path)}", request,
|
317
|
-
|
323
|
+
headers))
|
318
324
|
result
|
319
325
|
end
|
320
326
|
|
321
327
|
def unmap_group(group_id, external_group)
|
322
328
|
http_delete(@target, "#{type_info(:group_mapping, :path)}/id/#{group_id}/#{URI.encode(external_group)}",
|
323
|
-
@auth_header)
|
329
|
+
@auth_header, @zone)
|
324
330
|
end
|
325
331
|
|
326
332
|
def list_group_mappings(start = nil, count = nil)
|
327
|
-
json_get(@target, "#{type_info(:group_mapping, :path)}/list?startIndex=#{start}&count=#{count}", @key_style,
|
333
|
+
json_get(@target, "#{type_info(:group_mapping, :path)}/list?startIndex=#{start}&count=#{count}", @key_style, headers)
|
328
334
|
end
|
329
335
|
end
|
330
336
|
|
331
337
|
end
|
332
|
-
|
data/lib/uaa/token_issuer.rb
CHANGED
@@ -111,6 +111,7 @@ class TokenIssuer
|
|
111
111
|
@key_style = options[:symbolize_keys] ? :sym : nil
|
112
112
|
self.skip_ssl_validation = options[:skip_ssl_validation]
|
113
113
|
self.ssl_ca_file = options[:ssl_ca_file]
|
114
|
+
self.ssl_cert_store = options[:ssl_cert_store]
|
114
115
|
self.http_proxy = options[:http_proxy]
|
115
116
|
self.https_proxy = options[:https_proxy]
|
116
117
|
end
|
data/lib/uaa/version.rb
CHANGED
data/spec/http_spec.rb
CHANGED
@@ -80,6 +80,18 @@ describe Http do
|
|
80
80
|
expect(http_double).to have_received(:ca_file=).with("/fake-ca-file")
|
81
81
|
expect(http_double).to have_received(:verify_mode=).with(OpenSSL::SSL::VERIFY_PEER)
|
82
82
|
end
|
83
|
+
|
84
|
+
it "passes ssl cert store if provided" do
|
85
|
+
http_double = double('http').as_null_object
|
86
|
+
cert_store = double('OpenSSL::X509::Store')
|
87
|
+
Net::HTTP.stub(:new).and_return(http_double)
|
88
|
+
|
89
|
+
http_instance.ssl_cert_store = cert_store
|
90
|
+
http_instance.http_get("https://uncached.example.com")
|
91
|
+
|
92
|
+
expect(http_double).to have_received(:cert_store=).with(cert_store)
|
93
|
+
expect(http_double).to have_received(:verify_mode=).with(OpenSSL::SSL::VERIFY_PEER)
|
94
|
+
end
|
83
95
|
end
|
84
96
|
|
85
97
|
end
|
data/spec/scim_spec.rb
CHANGED
@@ -29,12 +29,13 @@ describe Scim do
|
|
29
29
|
|
30
30
|
subject { @scim }
|
31
31
|
|
32
|
-
def check_headers(headers, content, accept)
|
32
|
+
def check_headers(headers, content, accept, zone)
|
33
33
|
headers["content-type"].should =~ /application\/json/ if content == :json
|
34
34
|
headers["content-type"].should be_nil unless content
|
35
35
|
headers["accept"].should =~ /application\/json/ if accept == :json
|
36
36
|
headers["accept"].should be_nil unless accept
|
37
37
|
headers["authorization"].should =~ /^(?i:bearer)\s+xyz$/
|
38
|
+
headers["X-Identity-Zone-Subdomain"].should eq zone
|
38
39
|
end
|
39
40
|
|
40
41
|
describe "initialize" do
|
@@ -54,7 +55,7 @@ describe Scim do
|
|
54
55
|
subject.set_request_handler do |url, method, body, headers|
|
55
56
|
url.should == "#{@target}/Users"
|
56
57
|
method.should == :post
|
57
|
-
check_headers(headers, :json, :json)
|
58
|
+
check_headers(headers, :json, :json, nil)
|
58
59
|
[200, '{"ID":"id12345"}', {"content-type" => "application/json"}]
|
59
60
|
end
|
60
61
|
result = subject.add(:user, :hair => "brown", :shoe_size => "large",
|
@@ -68,7 +69,7 @@ describe Scim do
|
|
68
69
|
subject.set_request_handler do |url, method, body, headers|
|
69
70
|
url.should == "#{@target}/Users/id12345"
|
70
71
|
method.should == :put
|
71
|
-
check_headers(headers, :json, :json)
|
72
|
+
check_headers(headers, :json, :json, nil)
|
72
73
|
headers["if-match"].should == "v567"
|
73
74
|
[200, '{"ID":"id12345"}', {"content-type" => "application/json"}]
|
74
75
|
end
|
@@ -82,7 +83,7 @@ describe Scim do
|
|
82
83
|
subject.set_request_handler do |url, method, body, headers|
|
83
84
|
url.should == "#{@target}/Users/id12345"
|
84
85
|
method.should == :patch
|
85
|
-
check_headers(headers, :json, :json)
|
86
|
+
check_headers(headers, :json, :json, nil)
|
86
87
|
headers["if-match"].should == "v567"
|
87
88
|
[200, '{"ID":"id12345"}', {"content-type" => "application/json"}]
|
88
89
|
end
|
@@ -94,7 +95,7 @@ describe Scim do
|
|
94
95
|
subject.set_request_handler do |url, method, body, headers|
|
95
96
|
url.should == "#{@target}/Users/id12345"
|
96
97
|
method.should == :get
|
97
|
-
check_headers(headers, nil, :json)
|
98
|
+
check_headers(headers, nil, :json, nil)
|
98
99
|
[200, '{"id":"id12345"}', {"content-type" => "application/json"}]
|
99
100
|
end
|
100
101
|
result = subject.get(:user, "id12345")
|
@@ -107,7 +108,7 @@ describe Scim do
|
|
107
108
|
url.should =~ %r{[\?&]attributes=id(&|$)}
|
108
109
|
url.should =~ %r{[\?&]startIndex=[12](&|$)}
|
109
110
|
method.should == :get
|
110
|
-
check_headers(headers, nil, :json)
|
111
|
+
check_headers(headers, nil, :json, nil)
|
111
112
|
reply = url =~ /startIndex=1/ ?
|
112
113
|
'{"TotalResults":2,"ItemsPerPage":1,"StartIndex":1,"RESOURCES":[{"id":"id12345"}]}' :
|
113
114
|
'{"TotalResults":2,"ItemsPerPage":1,"StartIndex":2,"RESOURCES":[{"id":"id67890"}]}'
|
@@ -121,7 +122,7 @@ describe Scim do
|
|
121
122
|
subject.set_request_handler do |url, method, body, headers|
|
122
123
|
url.should == "#{@target}/Users/id12345/password"
|
123
124
|
method.should == :put
|
124
|
-
check_headers(headers, :json, :json)
|
125
|
+
check_headers(headers, :json, :json, nil)
|
125
126
|
body.should include('"password":"newpwd"', '"oldPassword":"oldpwd"')
|
126
127
|
[200, '{"id":"id12345"}', {"content-type" => "application/json"}]
|
127
128
|
end
|
@@ -133,7 +134,7 @@ describe Scim do
|
|
133
134
|
subject.set_request_handler do |url, method, body, headers|
|
134
135
|
url.should == "#{@target}/Users/id12345/password"
|
135
136
|
method.should == :put
|
136
|
-
check_headers(headers, :json, :json)
|
137
|
+
check_headers(headers, :json, :json, nil)
|
137
138
|
[400, '{"error":"invalid_password","message":"Your new password cannot be the same as the old password."}', {"content-type" => "application/json"}]
|
138
139
|
end
|
139
140
|
expect {subject.change_password("id12345", "oldpwd", "oldpwd")}.to raise_error(error=TargetError)
|
@@ -143,7 +144,7 @@ describe Scim do
|
|
143
144
|
subject.set_request_handler do |url, method, body, headers|
|
144
145
|
url.should == "#{@target}/oauth/clients/id12345/secret"
|
145
146
|
method.should == :put
|
146
|
-
check_headers(headers, :json, :json)
|
147
|
+
check_headers(headers, :json, :json, nil)
|
147
148
|
body.should include('"secret":"newpwd"', '"oldSecret":"oldpwd"')
|
148
149
|
[200, '{"id":"id12345"}', {"content-type" => "application/json"}]
|
149
150
|
end
|
@@ -155,7 +156,7 @@ describe Scim do
|
|
155
156
|
subject.set_request_handler do |url, method, body, headers|
|
156
157
|
url.should == "#{@target}/Groups/External"
|
157
158
|
method.should == :post
|
158
|
-
check_headers(headers, :json, :json)
|
159
|
+
check_headers(headers, :json, :json, nil)
|
159
160
|
body.should include('"displayName":"uaa-scope-name"', '"externalGroup":"external-group-name"', '"schemas":["urn:scim:schemas:core:1.0"]')
|
160
161
|
[201, '{"displayName":"uaa-scope-name", "externalGroup": "external-group-name"}', {"content-type" => "application/json"}]
|
161
162
|
end
|
@@ -168,19 +169,35 @@ describe Scim do
|
|
168
169
|
subject.set_request_handler do |url, method, body, headers|
|
169
170
|
url.should == "#{@target}/Groups/External/id/uaa-group-id/external%20group%20name"
|
170
171
|
method.should == :delete
|
171
|
-
check_headers(headers, nil, nil)
|
172
|
+
check_headers(headers, nil, nil, nil)
|
172
173
|
|
173
174
|
[200, '{"displayName":"uaa-scope-name", "groupId": "uaa-group-id", "externalGroup": "external-group-name"}', {"content-type" => "application/json"}]
|
174
175
|
end
|
175
176
|
subject.unmap_group("uaa-group-id", "external group name")
|
176
177
|
end
|
177
178
|
|
179
|
+
describe "users in a zone" do
|
180
|
+
let(:options) { {:http_proxy => 'http-proxy.com', :https_proxy => 'https-proxy.com', :skip_ssl_validation => true, :zone => 'derpzone'} }
|
181
|
+
|
182
|
+
it "sends zone header" do
|
183
|
+
subject.set_request_handler do |url, method, body, headers|
|
184
|
+
url.should == "#{@target}/Users"
|
185
|
+
method.should == :post
|
186
|
+
check_headers(headers, :json, :json, 'derpzone')
|
187
|
+
[200, '{"ID":"id12345"}', {"content-type" => "application/json"}]
|
188
|
+
end
|
189
|
+
result = subject.add(:user, :hair => "brown", :shoe_size => "large",
|
190
|
+
:eye_color => ["blue", "green"], :name => "fred")
|
191
|
+
result["id"].should == "id12345"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
178
195
|
describe "#list_group_mappings" do
|
179
196
|
it "lists all the external group mappings with default pagination" do
|
180
197
|
subject.set_request_handler do |url, method, body, headers|
|
181
198
|
url.should start_with("#{@target}/Groups/External/list")
|
182
199
|
method.should == :get
|
183
|
-
check_headers(headers, nil, :json)
|
200
|
+
check_headers(headers, nil, :json, nil)
|
184
201
|
|
185
202
|
[
|
186
203
|
200,
|
@@ -198,7 +215,7 @@ describe Scim do
|
|
198
215
|
subject.set_request_handler do |url, method, body, headers|
|
199
216
|
url.should start_with("#{@target}/Groups/External/list")
|
200
217
|
method.should == :get
|
201
|
-
check_headers(headers, nil, :json)
|
218
|
+
check_headers(headers, nil, :json, nil)
|
202
219
|
|
203
220
|
query_params = CGI::parse(URI.parse(url).query)
|
204
221
|
start_index = query_params["startIndex"].first
|
@@ -216,6 +233,8 @@ describe Scim do
|
|
216
233
|
|
217
234
|
subject.list_group_mappings(3, 10)
|
218
235
|
end
|
236
|
+
|
237
|
+
|
219
238
|
end
|
220
239
|
end
|
221
240
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cf-uaa-lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Syer
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2015-
|
15
|
+
date: 2015-12-01 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: multi_json
|