cf-uaac 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/spec/info_spec.rb ADDED
@@ -0,0 +1,74 @@
1
+ #--
2
+ # Cloud Foundry 2012.02.03 Beta
3
+ # Copyright (c) [2009-2012] VMware, Inc. All Rights Reserved.
4
+ #
5
+ # This product is licensed to you under the Apache License, Version 2.0 (the "License").
6
+ # You may not use this product except in compliance with the License.
7
+ #
8
+ # This product includes a number of subcomponents with
9
+ # separate copyright notices and license terms. Your use of these
10
+ # subcomponents is subject to the terms and conditions of the
11
+ # subcomponent's license, as noted in the LICENSE file.
12
+ #++
13
+
14
+ require 'spec_helper'
15
+ require 'cli'
16
+ require 'stub/uaa'
17
+
18
+ module CF::UAA
19
+
20
+ describe InfoCli do
21
+
22
+ include SpecHelper
23
+
24
+ before :all do
25
+ #Util.default_logger(:trace)
26
+ Cli.configure("", nil, StringIO.new, true)
27
+ if ENV["UAA_CLIENT_TARGET"]
28
+ @target, @stub_uaa = ENV["UAA_CLIENT_TARGET"], nil
29
+ @varz_secret = ENV['UAA_VARZ_SECRET']
30
+ else
31
+ @stub_uaa = StubUAA.new.run_on_thread
32
+ @target, @varz_secret = @stub_uaa.url, "varzsecret"
33
+ end
34
+ Cli.run("target #{@target}").should be
35
+ Cli.output.string.should include URI.parse(@target).host
36
+ end
37
+
38
+ after :all do @stub_uaa.stop if @stub_uaa end
39
+
40
+ it "gets server info" do
41
+ Cli.run("info").should be
42
+ Cli.output.string.should match /\d.\d.\d/
43
+ Cli.output.string.should include "prompts", "commit_id"
44
+ end
45
+
46
+ it "gets prompts" do
47
+ Cli.run("prompts").should be
48
+ Cli.output.string.should include "username", "password"
49
+ end
50
+
51
+ it "checks password strength" do
52
+ Cli.run("password strength PaSsW0rd").should be
53
+ Cli.output.string.should include "score", "requiredScore"
54
+ end
55
+
56
+ it "gets the server stats" do
57
+ pending "no UAA_VARZ_SECRET environment variable set" unless @varz_secret
58
+ Cli.run("stats -c varz -s #{@varz_secret}").should be
59
+ Cli.output.string.should include 'type: UAA', 'mem:', 'version:'
60
+ end
61
+
62
+ it "sets multiple targets to be fully qualified in config and targets output" do
63
+ Config.load("")
64
+ Cli.run("target example.com --force")
65
+ Cli.run("target example2.com --force")
66
+ uri = URI.parse(@target)
67
+ Cli.run("target #{uri.host}:#{uri.port}#{uri.path}")
68
+ Cli.run("targets").should be
69
+ Config.yaml.should include "https://example.com", "https://example2.com", @target
70
+ Cli.output.string.should include "https://example.com", "https://example2.com", @target
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,87 @@
1
+ #--
2
+ # Cloud Foundry 2012.02.03 Beta
3
+ # Copyright (c) [2009-2012] VMware, Inc. All Rights Reserved.
4
+ #
5
+ # This product is licensed to you under the Apache License, Version 2.0 (the "License").
6
+ # You may not use this product except in compliance with the License.
7
+ #
8
+ # This product includes a number of subcomponents with
9
+ # separate copyright notices and license terms. Your use of these
10
+ # subcomponents is subject to the terms and conditions of the
11
+ # subcomponent's license, as noted in the LICENSE file.
12
+ #++
13
+
14
+ if ENV['COVERAGE']
15
+ require "simplecov"
16
+ if ENV['COVERAGE'] =~ /rcov/
17
+ require "simplecov-rcov"
18
+ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
19
+ end
20
+ SimpleCov.add_filter "^#{File.dirname(__FILE__)}" if ENV['COVERAGE'] =~ /exclude-spec/
21
+ SimpleCov.add_filter "^#{File.expand_path(File.join(__FILE__, "..", "..", "vendor"))}" if ENV['COVERAGE'] =~ /exclude-vendor/
22
+ SimpleCov.start
23
+ end
24
+
25
+ require 'rspec'
26
+ require 'eventmachine'
27
+ require 'stub/uaa'
28
+
29
+ module CF::UAA
30
+
31
+ module SpecHelper
32
+
33
+ def capture_exception
34
+ yield
35
+ rescue Exception => e
36
+ e
37
+ end
38
+
39
+ # Runs given block on a thread or fiber and returns result.
40
+ # If eventmachine is running on another thread, the fiber
41
+ # must be on the same thread, hence EM.schedule and the
42
+ # restriction that the given block cannot include rspec matchers.
43
+ def frequest(on_fiber, &blk)
44
+ return capture_exception(&blk) unless on_fiber
45
+ result = nil
46
+ cthred = Thread.current
47
+ EM.schedule { Fiber.new { result = capture_exception(&blk); cthred.run }.resume }
48
+ Thread.stop
49
+ result
50
+ end
51
+
52
+ def setup_target(opts = {})
53
+ opts = { authorities: "clients.read,scim.read,scim.write,uaa.resource",
54
+ grant_types: "client_credentials,password",
55
+ scope: "openid,password.write"}.update(opts)
56
+ @admin_client = ENV["UAA_CLIENT_ID"] || "admin"
57
+ @admin_secret = ENV["UAA_CLIENT_SECRET"] || "adminsecret"
58
+ if ENV["UAA_CLIENT_TARGET"]
59
+ @target, @stub_uaa = ENV["UAA_CLIENT_TARGET"], nil
60
+ else
61
+ @stub_uaa = StubUAA.new(@admin_client, @admin_secret).run_on_thread
62
+ @target = @stub_uaa.url
63
+ end
64
+ Cli.run("target #{@target}").should be
65
+ Cli.run("token client get #{@admin_client} -s #{@admin_secret}")
66
+ Config.yaml.should include("access_token")
67
+ test_client = "test_client_#{Time.now.to_i}"
68
+ @test_secret = "+=tEsTsEcRet~!@"
69
+ Cli.run("client add #{test_client} -s #{@test_secret} " +
70
+ "--authorities #{opts[:authorities]} --scope #{opts[:scope]} " +
71
+ "--authorized_grant_types #{opts[:grant_types]}").should be
72
+ opts.each { |k, a| Util.arglist(a).each {|v| Cli.output.string.should include(v) }}
73
+ @test_client = test_client
74
+ end
75
+
76
+ def cleanup_target
77
+ Cli.run("context #{@admin_client}")
78
+ if @test_client && !@test_client.empty?
79
+ Cli.run("client delete #{@test_client}").should be
80
+ Cli.output.string.should include("deleted")
81
+ end
82
+ @stub_uaa.stop if @stub_uaa
83
+ end
84
+ end
85
+
86
+ end
87
+
@@ -0,0 +1,119 @@
1
+ #--
2
+ # Cloud Foundry 2012.02.03 Beta
3
+ # Copyright (c) [2009-2012] VMware, Inc. All Rights Reserved.
4
+ #
5
+ # This product is licensed to you under the Apache License, Version 2.0 (the "License").
6
+ # You may not use this product except in compliance with the License.
7
+ #
8
+ # This product includes a number of subcomponents with
9
+ # separate copyright notices and license terms. Your use of these
10
+ # subcomponents is subject to the terms and conditions of the
11
+ # subcomponent's license, as noted in the LICENSE file.
12
+ #++
13
+
14
+ require 'spec_helper'
15
+ require 'cli'
16
+
17
+ module CF::UAA
18
+
19
+ describe TokenCli do
20
+
21
+ include SpecHelper
22
+
23
+ before :all do
24
+ #Util.default_logger(:trace)
25
+ Cli.configure("", nil, StringIO.new, true)
26
+ setup_target(authorities: "clients.read,scim.read,scim.write,uaa.resource")
27
+ Cli.run("token client get #{@test_client} -s #{@test_secret}").should be
28
+ Config.yaml.should include("access_token")
29
+ @test_pwd = "TesTpwd$%^"
30
+ @test_user = "tEst_UseR+-#{Time.now.to_i}"
31
+ Cli.run("user add #{@test_user} -p #{@test_pwd} " +
32
+ "--emails sam@example.com,joNES@sample.com --given_name SamueL " +
33
+ "--phones 801-555-1212 --family_name jonES").should be
34
+ end
35
+
36
+ after :all do cleanup_target end
37
+
38
+ it "gets the server signing key" do
39
+ Cli.run("signing key -c #{@test_client} -s #{@test_secret}").should be
40
+ Cli.output.string.should include 'alg:', 'value:'
41
+ end
42
+
43
+ it "logs in with implicit grant & posted credentials as a user" do
44
+ Cli.run("token get #{@test_user} #{@test_pwd}").should be
45
+ Cli.output.string.should include("Successfully fetched token")
46
+ end
47
+
48
+ it "decodes the token" do
49
+ Cli.run("token decode").should be
50
+ ["user_name", "exp", "aud", "scope", "client_id", "email", "user_id"].each do |a|
51
+ Cli.output.string.should include(a)
52
+ end
53
+ Cli.output.string.should include("email: sam@example.com")
54
+ #Cli.output.string.should include("user_name: #{@test_user}")
55
+ end
56
+
57
+ it "gets authenticated user information" do
58
+ Cli.run("me").should be
59
+ Cli.output.string.should include(@test_user)
60
+ end
61
+
62
+ it "updates the user" do
63
+ Cli.run "context #{@test_client}"
64
+ Cli.run("user update #{@test_user} --emails #{@test_user}+1@example.com --phones 123-456-7890").should be
65
+ Cli.run("user get #{@test_user}").should be
66
+ Cli.output.string.should include(@test_user, "#{@test_user}+1@example.com", "123-456-7890")
67
+ end
68
+
69
+ it "gets updated information in the token" do
70
+ Cli.run("token get #{@test_user} #{@test_pwd}").should be
71
+ Cli.output.string.should include("Successfully fetched token")
72
+ Cli.run("token decode").should be
73
+ Cli.output.string.should include("email: #{@test_user}+1@example.com")
74
+ end
75
+
76
+ it "gets ids for a username" do
77
+ Cli.run("user ids #{@test_user.downcase}").should be
78
+ Cli.output.string.should include(@test_user, "id")
79
+ end
80
+
81
+ it "has multiple distinct authentication contexts" do
82
+ Cli.run("contexts").should be
83
+ Cli.output.string.should include "[admin]", "[#{@test_client}]", "[#{@test_user.downcase}]"
84
+ end
85
+
86
+ it "removes the user context" do
87
+ Cli.run("token delete #{@test_user}").should be
88
+ Cli.run "contexts"
89
+ Cli.output.string.should include "[admin]", "[#{@test_client}]"
90
+ Cli.output.string.should_not include "#{@test_user}"
91
+ end
92
+
93
+ it "logs in with owner password grant" do
94
+ Cli.run("token owner get #{@test_client} -s #{@test_secret} #{@test_user} -p #{@test_pwd}" ).should be
95
+ Cli.output.string.should include "Successfully fetched token"
96
+ end
97
+
98
+ it "decodes the owner token" do
99
+ Cli.run("token decode").should be
100
+ ["user_name", "exp", "aud", "scope", "client_id", "email", "user_id", "openid", "password.write"].each do |a|
101
+ Cli.output.string.should include a
102
+ end
103
+ end
104
+
105
+ it "uses the token endpoint given by the login server" do
106
+ pending "only saml login server returns token endpoint" if ENV["UAA_CLIENT_TARGET"]
107
+ @stub_uaa.info[:token_endpoint] = te = "#{@stub_uaa.url}/alternate"
108
+ Cli.run("target #{@target} --config")
109
+ Cli.run("token client get #{@test_client} -s #{@test_secret}").should be
110
+ Config.yaml.should include("access_token", "token_endpoint", te)
111
+ @stub_uaa.info[:token_endpoint].should be_nil
112
+ Cli.configure("", nil, StringIO.new) # clean up
113
+ Cli.run("target #{@target}").should be
114
+ Cli.run("token client get #{@admin_client} -s #{@admin_secret}").should be
115
+ end
116
+
117
+ end
118
+
119
+ end
data/spec/user_spec.rb ADDED
@@ -0,0 +1,61 @@
1
+ #--
2
+ # Cloud Foundry 2012.02.03 Beta
3
+ # Copyright (c) [2009-2012] VMware, Inc. All Rights Reserved.
4
+ #
5
+ # This product is licensed to you under the Apache License, Version 2.0 (the "License").
6
+ # You may not use this product except in compliance with the License.
7
+ #
8
+ # This product includes a number of subcomponents with
9
+ # separate copyright notices and license terms. Your use of these
10
+ # subcomponents is subject to the terms and conditions of the
11
+ # subcomponent's license, as noted in the LICENSE file.
12
+ #++
13
+
14
+ require 'spec_helper'
15
+ require 'cli'
16
+
17
+ module CF::UAA
18
+
19
+ describe UserCli do
20
+
21
+ include SpecHelper
22
+
23
+ before :all do
24
+ #Util.default_logger(:trace)
25
+ Cli.configure("", nil, StringIO.new, true)
26
+ setup_target(authorities: "clients.read,scim.read,scim.write")
27
+ Cli.run("token client get #{@test_client} -s #{@test_secret}").should be
28
+ Config.yaml.should include("access_token")
29
+ @test_pwd = "TesTpwd$%^"
30
+ @test_user = "tEst_UseR_#{Time.now.to_i}"
31
+ Cli.run("user add #{@test_user} -p #{@test_pwd} " +
32
+ "--emails sam@example.com,joNES@sample.com --given_name SamueL " +
33
+ "--phones 801-555-1212 --family_name jonES").should be
34
+ end
35
+
36
+ after :all do cleanup_target end
37
+
38
+ it "creates a user" do
39
+ Cli.output.string.should include "success"
40
+ end
41
+
42
+ it "fails to change a user's password with the wrong old pwd" do
43
+ Cli.run("password change -p newpwd --old_password not-the-password").should be_nil
44
+ end
45
+
46
+ it "changes a user's password" do
47
+ Cli.run("token get #{@test_user} #{@test_pwd}").should be
48
+ Cli.run("password change -p newpwd --old_password #{@test_pwd}").should be
49
+ Cli.run("token get #{@test_user} newpwd").should be
50
+ Cli.output.string.should include "Successfully fetched token"
51
+ end
52
+
53
+ it "preserves case in names" do
54
+ Cli.run("context #{@test_client}")
55
+ Cli.run("user get #{@test_user.upcase}").should be
56
+ Cli.output.string.should =~ /#{@test_user}/
57
+ end
58
+
59
+ end
60
+
61
+ end
metadata ADDED
@@ -0,0 +1,292 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cf-uaac
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dave Syer
9
+ - Dale Olds
10
+ - Joel D'sa
11
+ - Vidya Valmikinathan
12
+ - Luke Taylor
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+ date: 2012-12-05 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: bundler
20
+ requirement: !ruby/object:Gem::Requirement
21
+ none: false
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ type: :development
27
+ prerelease: false
28
+ version_requirements: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ - !ruby/object:Gem::Dependency
35
+ name: rake
36
+ requirement: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ type: :development
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ - !ruby/object:Gem::Dependency
51
+ name: rspec
52
+ requirement: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ type: :development
59
+ prerelease: false
60
+ version_requirements: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ - !ruby/object:Gem::Dependency
67
+ name: simplecov
68
+ requirement: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: simplecov-rcov
84
+ requirement: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: ci_reporter
100
+ requirement: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ - !ruby/object:Gem::Dependency
115
+ name: highline
116
+ requirement: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: cf-uaa-lib
132
+ requirement: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
137
+ version: 1.3.0
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: 1.3.0
146
+ - !ruby/object:Gem::Dependency
147
+ name: multi_json
148
+ requirement: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ - !ruby/object:Gem::Dependency
163
+ name: eventmachine
164
+ requirement: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ type: :runtime
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ! '>='
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ - !ruby/object:Gem::Dependency
179
+ name: launchy
180
+ requirement: !ruby/object:Gem::Requirement
181
+ none: false
182
+ requirements:
183
+ - - ! '>='
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ type: :runtime
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: em-http-request
196
+ requirement: !ruby/object:Gem::Requirement
197
+ none: false
198
+ requirements:
199
+ - - ! '>='
200
+ - !ruby/object:Gem::Version
201
+ version: 1.0.0.beta.3
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ none: false
206
+ requirements:
207
+ - - ! '>='
208
+ - !ruby/object:Gem::Version
209
+ version: 1.0.0.beta.3
210
+ description: Client command line tools for interacting with the CloudFoundry User
211
+ Account and Authorization (UAA) server. The UAA is an OAuth2 Authorization Server
212
+ so it can be used by webapps and command line apps to obtain access tokens to act
213
+ on behalf of users. The tokens can then be used to access protected resources in
214
+ a Resource Server. This library can be used by clients (as a convenient wrapper
215
+ for mainstream oauth gems) or by resource servers.
216
+ email:
217
+ - dsyer@vmware.com
218
+ - olds@vmware.com
219
+ - jdsa@vmware.com
220
+ - vidya@vmware.com
221
+ - ltaylor@vmware.com
222
+ executables:
223
+ - completion-helper
224
+ - uaac
225
+ - uaac-completion.sh
226
+ - uaas
227
+ extensions: []
228
+ extra_rdoc_files: []
229
+ files:
230
+ - .gitignore
231
+ - Gemfile
232
+ - README.md
233
+ - Rakefile
234
+ - bin/completion-helper
235
+ - bin/uaac
236
+ - bin/uaac-completion.sh
237
+ - bin/uaas
238
+ - cf-uaac.gemspec
239
+ - lib/cli.rb
240
+ - lib/cli/base.rb
241
+ - lib/cli/client_reg.rb
242
+ - lib/cli/common.rb
243
+ - lib/cli/config.rb
244
+ - lib/cli/favicon.ico
245
+ - lib/cli/group.rb
246
+ - lib/cli/info.rb
247
+ - lib/cli/runner.rb
248
+ - lib/cli/token.rb
249
+ - lib/cli/user.rb
250
+ - lib/cli/version.rb
251
+ - lib/stub/scim.rb
252
+ - lib/stub/server.rb
253
+ - lib/stub/uaa.rb
254
+ - spec/client_reg_spec.rb
255
+ - spec/common_spec.rb
256
+ - spec/group_spec.rb
257
+ - spec/http_spec.rb
258
+ - spec/info_spec.rb
259
+ - spec/spec_helper.rb
260
+ - spec/token_spec.rb
261
+ - spec/user_spec.rb
262
+ homepage: https://github.com/cloudfoundry/cf-uaac
263
+ licenses: []
264
+ post_install_message:
265
+ rdoc_options: []
266
+ require_paths:
267
+ - lib
268
+ required_ruby_version: !ruby/object:Gem::Requirement
269
+ none: false
270
+ requirements:
271
+ - - ! '>='
272
+ - !ruby/object:Gem::Version
273
+ version: '0'
274
+ segments:
275
+ - 0
276
+ hash: -3878497912978208519
277
+ required_rubygems_version: !ruby/object:Gem::Requirement
278
+ none: false
279
+ requirements:
280
+ - - ! '>='
281
+ - !ruby/object:Gem::Version
282
+ version: '0'
283
+ segments:
284
+ - 0
285
+ hash: -3878497912978208519
286
+ requirements: []
287
+ rubyforge_project: cf-uaac
288
+ rubygems_version: 1.8.21
289
+ signing_key:
290
+ specification_version: 3
291
+ summary: Command line interface for CloudFoundry UAA
292
+ test_files: []