openid_connect 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,12 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openid_connect (0.0.11)
4
+ openid_connect (0.0.12)
5
5
  activemodel (>= 3)
6
6
  attr_required (>= 0.0.3)
7
7
  json (>= 1.4.3)
8
8
  jwt (>= 0.1.3)
9
9
  rack-oauth2 (>= 0.9)
10
+ swd (>= 0.0.1)
10
11
  tzinfo
11
12
  validate_email
12
13
  validate_url
@@ -53,6 +54,12 @@ GEM
53
54
  rspec-expectations (2.6.0)
54
55
  diff-lcs (~> 1.1.2)
55
56
  rspec-mocks (2.6.0)
57
+ swd (0.0.1)
58
+ activesupport (>= 3)
59
+ attr_required (>= 0.0.3)
60
+ httpclient (>= 2.2.1)
61
+ i18n
62
+ json (>= 1.4.3)
56
63
  treetop (1.4.10)
57
64
  polyglot
58
65
  polyglot (>= 0.3.1)
data/README.rdoc CHANGED
@@ -10,7 +10,7 @@ OpenID Connect Server & Client Library
10
10
 
11
11
  * View Source on GitHub (https://github.com/nov/openid_connect)
12
12
  * Report Issues on GitHub (https://github.com/nov/openid_connect/issues)
13
- * Subscribe Update Info (https://www.facebook.com/pages/OpenID-Connect/134681459957370)
13
+ * Subscribe Update Info (https://www.facebook.com/OpenIDConnect.rb)
14
14
 
15
15
  == Examples
16
16
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.12
1
+ 0.0.13
@@ -6,4 +6,5 @@ require 'openid_connect/exception'
6
6
  require 'openid_connect/client'
7
7
  require 'openid_connect/access_token'
8
8
  require 'openid_connect/response_object'
9
- require 'openid_connect/server/id_token'
9
+ require 'openid_connect/server'
10
+ require 'openid_connect/discovery'
@@ -23,13 +23,13 @@ module OpenIDConnect
23
23
  when 200
24
24
  JSON.parse(res.body).with_indifferent_access
25
25
  when 400
26
- raise BadRequest.new('API Access Faild')
26
+ raise BadRequest.new('API Access Faild', res)
27
27
  when 401
28
- raise Unauthorized.new('Access Token Invalid or Expired')
28
+ raise Unauthorized.new('Access Token Invalid or Expired', res)
29
29
  when 403
30
- raise Forbidden.new('Insufficient Scope')
30
+ raise Forbidden.new('Insufficient Scope', res)
31
31
  else
32
- raise HttpError.new(res.status, 'Unknown HttpError')
32
+ raise HttpError.new(res.status, 'Unknown HttpError', res)
33
33
  end
34
34
  end
35
35
  end
@@ -0,0 +1,9 @@
1
+ module OpenIDConnect
2
+ module Discovery
3
+ class InvalidIdentifier < Exception; end
4
+ class DiscoveryFailed < Exception; end
5
+ end
6
+ end
7
+
8
+ require 'openid_connect/discovery/principal'
9
+ require 'openid_connect/discovery/provider'
@@ -0,0 +1,38 @@
1
+ require 'swd'
2
+
3
+ module OpenIDConnect
4
+ module Discovery
5
+ class Principal
6
+ attr_reader :identifier, :host
7
+
8
+ def initialize(identifier)
9
+ raise InvalidIdentifier if identifier.blank?
10
+ type = case identifier
11
+ when /^(=|@|!)/
12
+ XRI
13
+ when /@/
14
+ Email
15
+ else
16
+ URI
17
+ end
18
+ principal = type.new identifier
19
+ @identifier = principal.identifier
20
+ @host = principal.host
21
+ end
22
+
23
+ def discover!
24
+ SWD.discover!(
25
+ :principal => identifier,
26
+ :service => 'http://openid.net/specs/connect/1.0/issuer',
27
+ :host => host
28
+ )
29
+ rescue SWD::Exception => e
30
+ raise DiscoveryFailed.new(e.message)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ require 'openid_connect/discovery/principal/email'
37
+ require 'openid_connect/discovery/principal/uri'
38
+ require 'openid_connect/discovery/principal/xri'
@@ -0,0 +1,12 @@
1
+ module OpenIDConnect
2
+ module Discovery
3
+ class Principal
4
+ class Email < Principal
5
+ def initialize(identifier)
6
+ @identifier = identifier
7
+ @host = identifier.split('@').last
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ module OpenIDConnect
2
+ module Discovery
3
+ class Principal
4
+ class URI < Principal
5
+ def initialize(identifier)
6
+ uri = normalize(identifier)
7
+ @identifier = uri.to_s
8
+ @host = uri.host
9
+ end
10
+
11
+ private
12
+
13
+ def normalize(identifier)
14
+ uri = ::URI.parse(identifier)
15
+ if uri.host.blank?
16
+ uri.host, uri.path = uri.path.split('/', 2)
17
+ uri.path = File.join('/', uri.path)
18
+ end
19
+ uri.scheme ||= 'https'
20
+ uri
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ module OpenIDConnect
2
+ module Discovery
3
+ class Principal
4
+ class XRI < Principal
5
+ def initialize(identifier)
6
+ @identifier = identifier
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module OpenIDConnect
2
+ module Discovery
3
+ module Provider
4
+ def self.discover!(identifier)
5
+ Principal.new(identifier).discover!
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ require 'openid_connect/discovery/provider/config'
@@ -0,0 +1,11 @@
1
+ module OpenIDConnect
2
+ module Discovery
3
+ module Provider
4
+ class Config
5
+ def self.discover!(host)
6
+ # TODO
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -3,7 +3,7 @@ module OpenIDConnect
3
3
 
4
4
  class HttpError < Exception
5
5
  attr_accessor :status, :response
6
- def initialize(status, message, response = nil)
6
+ def initialize(status, message = nil, response = nil)
7
7
  super message
8
8
  @status = status
9
9
  @response = response
@@ -46,7 +46,7 @@ module OpenIDConnect
46
46
  end
47
47
 
48
48
  def validate!
49
- raise ValidationFailed.new(errors) unless valid?
49
+ valid? or raise ValidationFailed.new(errors)
50
50
  end
51
51
  end
52
52
  end
@@ -0,0 +1 @@
1
+ require 'openid_connect/server/id_token'
@@ -4,12 +4,11 @@ module Rack::OAuth2::Server
4
4
  klass.send :attr_optional, :id_token, :private_key
5
5
  klass.class_eval do
6
6
  def jwt_string
7
- case id_token
8
- when String
9
- id_token
10
- when OpenIDConnect::ResponseObject::IdToken
7
+ if id_token.is_a? OpenIDConnect::ResponseObject::IdToken
11
8
  raise AttrRequired::AttrMissing.new('private_key is required') unless private_key
12
9
  id_token.to_jwt private_key
10
+ else
11
+ id_token
13
12
  end
14
13
  end
15
14
 
@@ -10,13 +10,14 @@ Gem::Specification.new do |s|
10
10
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
11
11
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
12
  s.require_paths = ["lib"]
13
+ s.add_runtime_dependency "json", ">= 1.4.3"
14
+ s.add_runtime_dependency "tzinfo"
15
+ s.add_runtime_dependency "attr_required", ">= 0.0.3"
13
16
  s.add_runtime_dependency "activemodel", ">= 3"
14
17
  s.add_runtime_dependency "validate_url"
15
18
  s.add_runtime_dependency "validate_email"
16
- s.add_runtime_dependency "tzinfo"
17
19
  s.add_runtime_dependency "jwt", ">= 0.1.3"
18
- s.add_runtime_dependency "json", ">= 1.4.3"
19
- s.add_runtime_dependency "attr_required", ">= 0.0.3"
20
+ s.add_runtime_dependency "swd", ">= 0.0.1"
20
21
  s.add_runtime_dependency "rack-oauth2", ">= 0.9"
21
22
  s.add_development_dependency "rake", ">= 0.8"
22
23
  s.add_development_dependency "rcov", ">= 0.9"
@@ -34,8 +34,7 @@ describe OpenIDConnect::AccessToken do
34
34
  :iss => 'https://server.example.com',
35
35
  :user_id => 'user_id',
36
36
  :aud => 'client_id',
37
- :exp => 1313424327,
38
- :secret => 'secret'
37
+ :exp => 1313424327
39
38
  )
40
39
  end
41
40
  its(:id_token) { should be_a OpenIDConnect::ResponseObject::IdToken }
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenIDConnect::Discovery::Principal::Email do
4
+ it :TODO
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenIDConnect::Discovery::Principal::URI do
4
+ it :TODO
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenIDConnect::Discovery::Principal::XRI do
4
+ it :TODO
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenIDConnect::Discovery::Principal do
4
+ it :TODO
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenIDConnect::Discovery do
4
+ it :TODO
5
+ end
@@ -47,7 +47,11 @@ describe OpenIDConnect::ResponseObject::IdToken do
47
47
  describe '#as_json' do
48
48
  subject { id_token.as_json }
49
49
  let(:attributes) { required_attributes }
50
- it { should_not include :secret }
50
+ it do
51
+ hash = required_attributes
52
+ hash[:exp] = required_attributes[:exp].to_i
53
+ should == hash
54
+ end
51
55
  end
52
56
 
53
57
  describe '.from_jwt' do
@@ -7,8 +7,9 @@ describe OpenIDConnect::ResponseObject do
7
7
  validates :required, :inclusion => {:in => ['Required', 'required']}, :length => 1..10
8
8
  end
9
9
 
10
- subject { klass.new attributes }
11
- let(:klass) { OpenIDConnect::ResponseObject::SubClass }
10
+ subject { instance }
11
+ let(:klass) { OpenIDConnect::ResponseObject::SubClass }
12
+ let(:instance) { klass.new attributes }
12
13
  let :attributes do
13
14
  {:required => 'Required', :optional => 'Optional'}
14
15
  end
@@ -46,24 +47,45 @@ describe OpenIDConnect::ResponseObject do
46
47
  end
47
48
 
48
49
  describe '#as_json' do
49
- its(:as_json) do
50
- should == {:required => 'Required', :optional => 'Optional'}
50
+ context 'when valid' do
51
+ its(:as_json) do
52
+ should == attributes
53
+ end
54
+ end
55
+
56
+ context 'otherwise' do
57
+ let :attributes do
58
+ {:required => 'Out of List and Too Long'}
59
+ end
60
+
61
+ it 'should raise OpenIDConnect::ResponseObject::ValidationFailed with ActiveModel::Errors' do
62
+ expect { instance.as_json }.should raise_error(OpenIDConnect::ResponseObject::ValidationFailed) { |e|
63
+ e.message.should include 'Required is not included in the list'
64
+ e.message.should include 'Required is too long (maximum is 10 characters)'
65
+ e.errors.should be_a ActiveModel::Errors
66
+ }
67
+ end
51
68
  end
52
69
  end
53
70
 
54
71
  describe '#validate!' do
55
- let(:invalid) do
56
- instance = klass.new attributes
57
- instance.required = 'Out of List and Too Long'
58
- instance
72
+ context 'when valid' do
73
+ subject { instance.validate! }
74
+ it { should be_true }
59
75
  end
60
76
 
61
- it 'should raise OpenIDConnect::ResponseObject::ValidationFailed with ActiveModel::Errors' do
62
- expect { invalid.validate! }.should raise_error(OpenIDConnect::ResponseObject::ValidationFailed) { |e|
63
- e.message.should include 'Required is not included in the list'
64
- e.message.should include 'Required is too long (maximum is 10 characters)'
65
- e.errors.should be_a ActiveModel::Errors
66
- }
77
+ context 'otherwise' do
78
+ let :attributes do
79
+ {:required => 'Out of List and Too Long'}
80
+ end
81
+
82
+ it 'should raise OpenIDConnect::ResponseObject::ValidationFailed with ActiveModel::Errors' do
83
+ expect { instance.validate! }.should raise_error(OpenIDConnect::ResponseObject::ValidationFailed) { |e|
84
+ e.message.should include 'Required is not included in the list'
85
+ e.message.should include 'Required is too long (maximum is 10 characters)'
86
+ e.errors.should be_a ActiveModel::Errors
87
+ }
88
+ end
67
89
  end
68
90
  end
69
91
  end
@@ -11,8 +11,7 @@ describe Rack::OAuth2::Server::Authorize::Token do
11
11
  :iss => 'https://server.example.com',
12
12
  :user_id => 'user_id',
13
13
  :aud => 'client_id',
14
- :exp => 1313424327,
15
- :secret => 'secret'
14
+ :exp => 1313424327
16
15
  )
17
16
  end
18
17
 
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openid_connect
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 12
10
- version: 0.0.12
5
+ version: 0.0.13
11
6
  platform: ruby
12
7
  authors:
13
8
  - nov matake
@@ -15,187 +10,151 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-08-18 00:00:00 Z
13
+ date: 2011-08-19 00:00:00 Z
19
14
  dependencies:
20
15
  - !ruby/object:Gem::Dependency
21
- name: activemodel
16
+ name: json
22
17
  prerelease: false
23
18
  requirement: &id001 !ruby/object:Gem::Requirement
24
19
  none: false
25
20
  requirements:
26
21
  - - ">="
27
22
  - !ruby/object:Gem::Version
28
- hash: 5
29
- segments:
30
- - 3
31
- version: "3"
23
+ version: 1.4.3
32
24
  type: :runtime
33
25
  version_requirements: *id001
34
26
  - !ruby/object:Gem::Dependency
35
- name: validate_url
27
+ name: tzinfo
36
28
  prerelease: false
37
29
  requirement: &id002 !ruby/object:Gem::Requirement
38
30
  none: false
39
31
  requirements:
40
32
  - - ">="
41
33
  - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
34
  version: "0"
46
35
  type: :runtime
47
36
  version_requirements: *id002
48
37
  - !ruby/object:Gem::Dependency
49
- name: validate_email
38
+ name: attr_required
50
39
  prerelease: false
51
40
  requirement: &id003 !ruby/object:Gem::Requirement
52
41
  none: false
53
42
  requirements:
54
43
  - - ">="
55
44
  - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
45
+ version: 0.0.3
60
46
  type: :runtime
61
47
  version_requirements: *id003
62
48
  - !ruby/object:Gem::Dependency
63
- name: tzinfo
49
+ name: activemodel
64
50
  prerelease: false
65
51
  requirement: &id004 !ruby/object:Gem::Requirement
66
52
  none: false
67
53
  requirements:
68
54
  - - ">="
69
55
  - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
56
+ version: "3"
74
57
  type: :runtime
75
58
  version_requirements: *id004
76
59
  - !ruby/object:Gem::Dependency
77
- name: jwt
60
+ name: validate_url
78
61
  prerelease: false
79
62
  requirement: &id005 !ruby/object:Gem::Requirement
80
63
  none: false
81
64
  requirements:
82
65
  - - ">="
83
66
  - !ruby/object:Gem::Version
84
- hash: 29
85
- segments:
86
- - 0
87
- - 1
88
- - 3
89
- version: 0.1.3
67
+ version: "0"
90
68
  type: :runtime
91
69
  version_requirements: *id005
92
70
  - !ruby/object:Gem::Dependency
93
- name: json
71
+ name: validate_email
94
72
  prerelease: false
95
73
  requirement: &id006 !ruby/object:Gem::Requirement
96
74
  none: false
97
75
  requirements:
98
76
  - - ">="
99
77
  - !ruby/object:Gem::Version
100
- hash: 1
101
- segments:
102
- - 1
103
- - 4
104
- - 3
105
- version: 1.4.3
78
+ version: "0"
106
79
  type: :runtime
107
80
  version_requirements: *id006
108
81
  - !ruby/object:Gem::Dependency
109
- name: attr_required
82
+ name: jwt
110
83
  prerelease: false
111
84
  requirement: &id007 !ruby/object:Gem::Requirement
112
85
  none: false
113
86
  requirements:
114
87
  - - ">="
115
88
  - !ruby/object:Gem::Version
116
- hash: 25
117
- segments:
118
- - 0
119
- - 0
120
- - 3
121
- version: 0.0.3
89
+ version: 0.1.3
122
90
  type: :runtime
123
91
  version_requirements: *id007
124
92
  - !ruby/object:Gem::Dependency
125
- name: rack-oauth2
93
+ name: swd
126
94
  prerelease: false
127
95
  requirement: &id008 !ruby/object:Gem::Requirement
128
96
  none: false
129
97
  requirements:
130
98
  - - ">="
131
99
  - !ruby/object:Gem::Version
132
- hash: 25
133
- segments:
134
- - 0
135
- - 9
136
- version: "0.9"
100
+ version: 0.0.1
137
101
  type: :runtime
138
102
  version_requirements: *id008
139
103
  - !ruby/object:Gem::Dependency
140
- name: rake
104
+ name: rack-oauth2
141
105
  prerelease: false
142
106
  requirement: &id009 !ruby/object:Gem::Requirement
143
107
  none: false
144
108
  requirements:
145
109
  - - ">="
146
110
  - !ruby/object:Gem::Version
147
- hash: 27
148
- segments:
149
- - 0
150
- - 8
111
+ version: "0.9"
112
+ type: :runtime
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
+ name: rake
116
+ prerelease: false
117
+ requirement: &id010 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
151
122
  version: "0.8"
152
123
  type: :development
153
- version_requirements: *id009
124
+ version_requirements: *id010
154
125
  - !ruby/object:Gem::Dependency
155
126
  name: rcov
156
127
  prerelease: false
157
- requirement: &id010 !ruby/object:Gem::Requirement
128
+ requirement: &id011 !ruby/object:Gem::Requirement
158
129
  none: false
159
130
  requirements:
160
131
  - - ">="
161
132
  - !ruby/object:Gem::Version
162
- hash: 25
163
- segments:
164
- - 0
165
- - 9
166
133
  version: "0.9"
167
134
  type: :development
168
- version_requirements: *id010
135
+ version_requirements: *id011
169
136
  - !ruby/object:Gem::Dependency
170
137
  name: rspec
171
138
  prerelease: false
172
- requirement: &id011 !ruby/object:Gem::Requirement
139
+ requirement: &id012 !ruby/object:Gem::Requirement
173
140
  none: false
174
141
  requirements:
175
142
  - - ">="
176
143
  - !ruby/object:Gem::Version
177
- hash: 7
178
- segments:
179
- - 2
180
144
  version: "2"
181
145
  type: :development
182
- version_requirements: *id011
146
+ version_requirements: *id012
183
147
  - !ruby/object:Gem::Dependency
184
148
  name: webmock
185
149
  prerelease: false
186
- requirement: &id012 !ruby/object:Gem::Requirement
150
+ requirement: &id013 !ruby/object:Gem::Requirement
187
151
  none: false
188
152
  requirements:
189
153
  - - ">="
190
154
  - !ruby/object:Gem::Version
191
- hash: 11
192
- segments:
193
- - 1
194
- - 6
195
- - 2
196
155
  version: 1.6.2
197
156
  type: :development
198
- version_requirements: *id012
157
+ version_requirements: *id013
199
158
  description: OpenID Connect Server & Client Library
200
159
  email:
201
160
  - nov@matake.jp
@@ -217,12 +176,20 @@ files:
217
176
  - lib/openid_connect.rb
218
177
  - lib/openid_connect/access_token.rb
219
178
  - lib/openid_connect/client.rb
179
+ - lib/openid_connect/discovery.rb
180
+ - lib/openid_connect/discovery/principal.rb
181
+ - lib/openid_connect/discovery/principal/email.rb
182
+ - lib/openid_connect/discovery/principal/uri.rb
183
+ - lib/openid_connect/discovery/principal/xri.rb
184
+ - lib/openid_connect/discovery/provider.rb
185
+ - lib/openid_connect/discovery/provider/config.rb
220
186
  - lib/openid_connect/exception.rb
221
187
  - lib/openid_connect/response_object.rb
222
188
  - lib/openid_connect/response_object/id_token.rb
223
189
  - lib/openid_connect/response_object/user_info.rb
224
190
  - lib/openid_connect/response_object/user_info/open_id.rb
225
191
  - lib/openid_connect/response_object/user_info/open_id/address.rb
192
+ - lib/openid_connect/server.rb
226
193
  - lib/openid_connect/server/id_token.rb
227
194
  - lib/openid_connect/server/id_token/error.rb
228
195
  - lib/rack/oauth2/server/id_token_response.rb
@@ -239,6 +206,11 @@ files:
239
206
  - spec/mock_response/user_info/openid.json
240
207
  - spec/openid_connect/access_token_spec.rb
241
208
  - spec/openid_connect/client_spec.rb
209
+ - spec/openid_connect/discovery/principal/email_spec.rb
210
+ - spec/openid_connect/discovery/principal/uri_spec.rb
211
+ - spec/openid_connect/discovery/principal/xri_spec.rb
212
+ - spec/openid_connect/discovery/principal_spec.rb
213
+ - spec/openid_connect/discovery_spec.rb
242
214
  - spec/openid_connect/exception_spec.rb
243
215
  - spec/openid_connect/response_object/id_token_spec.rb
244
216
  - spec/openid_connect/response_object/user_info/open_id/address_spec.rb
@@ -263,18 +235,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
263
235
  requirements:
264
236
  - - ">="
265
237
  - !ruby/object:Gem::Version
266
- hash: 3
267
- segments:
268
- - 0
269
238
  version: "0"
270
239
  required_rubygems_version: !ruby/object:Gem::Requirement
271
240
  none: false
272
241
  requirements:
273
242
  - - ">="
274
243
  - !ruby/object:Gem::Version
275
- hash: 3
276
- segments:
277
- - 0
278
244
  version: "0"
279
245
  requirements: []
280
246
 
@@ -296,6 +262,11 @@ test_files:
296
262
  - spec/mock_response/user_info/openid.json
297
263
  - spec/openid_connect/access_token_spec.rb
298
264
  - spec/openid_connect/client_spec.rb
265
+ - spec/openid_connect/discovery/principal/email_spec.rb
266
+ - spec/openid_connect/discovery/principal/uri_spec.rb
267
+ - spec/openid_connect/discovery/principal/xri_spec.rb
268
+ - spec/openid_connect/discovery/principal_spec.rb
269
+ - spec/openid_connect/discovery_spec.rb
299
270
  - spec/openid_connect/exception_spec.rb
300
271
  - spec/openid_connect/response_object/id_token_spec.rb
301
272
  - spec/openid_connect/response_object/user_info/open_id/address_spec.rb