hoodoo 2.8.0 → 2.9.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8faac53f6f7027ef0eb75a9bbf911b3206914880261b44be9cef926b6449623b
4
- data.tar.gz: 2e285f61106912bb90aa10f251bcd36d284d649c8199270cb75f8232562a0472
3
+ metadata.gz: 18fc233fa796b76a8275e120ca461c417262e23ead78bc600171506feb851b13
4
+ data.tar.gz: 3c8aaa457667904c1fb073e8423241f6455f3e78b1339ab36b99f7601481fb50
5
5
  SHA512:
6
- metadata.gz: 5c47a9c16545aac86f9ddb7af7017aab704a106427f6dfae2e091d081ba999861dfa35cefe7a820b82d3c62d651dc070a2d43630c8134e043d33fcd365e0f769
7
- data.tar.gz: a7db2209730adaa2dd3235a4ac66c21b4194f3135ef585f75e957e484258100636532b458a88bd83188107efc9b66610cc925184d397822162e009820233797d
6
+ metadata.gz: ecb400413ec681232584714aa0b58efc50ec8c15eacc2814372c38fee617c99d83c7899cd807dfdda9469f91790cda63f39958f11acb37a8015564b019a9bebf
7
+ data.tar.gz: 8280be1231ab84f35fccf6872eea53923040229e6355afe891bd356a6b2fc7d1e608a5725ab26d3ec13e459a0b8806a9896190c921d5f0d10f9d6435a3bfe8b0
@@ -2266,6 +2266,9 @@ module Hoodoo; module Services
2266
2266
  return nil
2267
2267
  end
2268
2268
 
2269
+ elsif rules_value == '*'
2270
+ identity_overrides[ rules_key ] = input_value
2271
+
2269
2272
  elsif rules_value.is_a?( Hash )
2270
2273
  if rules_value.has_key?( input_value )
2271
2274
  identity_overrides[ rules_key ] = input_value
@@ -12,11 +12,11 @@ module Hoodoo
12
12
  # The Hoodoo gem version. If this changes, be sure to re-run
13
13
  # <tt>bundle install</tt> or <tt>bundle update</tt>.
14
14
  #
15
- VERSION = '2.8.0'
15
+ VERSION = '2.9.0'
16
16
 
17
17
  # The Hoodoo gem date. If this changes, be sure to re-run
18
18
  # <tt>bundle install</tt> or <tt>bundle update</tt>.
19
19
  #
20
- DATE = '2018-08-07'
20
+ DATE = '2018-08-21'
21
21
 
22
22
  end
@@ -152,279 +152,436 @@ describe Hoodoo::Services::Middleware do
152
152
  end
153
153
 
154
154
  context 'with flat rules' do
155
- before :each do
156
- @test_session.scoping.authorised_http_headers = [ 'X-Assume-Identity-Of' ]
157
- @test_session.scoping.authorised_identities =
158
- {
159
- 'account_id' => [ '20', '21', '22' ],
160
- 'member_id' => [ '1', '2', '3', '4', '5', '6' ],
161
- 'device_id' => [ 'A', 'B' ]
162
- }
163
-
164
- Hoodoo::Services::Middleware.set_test_session( @test_session )
165
- end
166
-
167
- it 'rejects bad account ID' do
168
- result = show( { 'account_id' => 'bad' }, 403 )
169
-
170
- expect( result[ 'kind' ] ).to eq( 'Errors' )
171
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
172
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
173
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'account_id,bad' )
174
- end
155
+ context 'and no wildcards' do
156
+ before :each do
157
+ @test_session.scoping.authorised_http_headers = [ 'X-Assume-Identity-Of' ]
158
+ @test_session.scoping.authorised_identities =
159
+ {
160
+ 'account_id' => [ '20', '21', '22' ],
161
+ 'member_id' => [ '1', '2', '3', '4', '5', '6' ],
162
+ 'device_id' => [ 'A', 'B' ]
163
+ }
175
164
 
176
- it 'rejects bad member ID' do
177
- result = show( { 'member_id' => 'bad' }, 403 )
165
+ Hoodoo::Services::Middleware.set_test_session( @test_session )
166
+ end
167
+
168
+ it 'rejects bad account ID' do
169
+ result = show( { 'account_id' => 'bad' }, 403 )
170
+
171
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
172
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
173
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
174
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'account_id,bad' )
175
+ end
176
+
177
+ it 'rejects bad member ID' do
178
+ result = show( { 'member_id' => 'bad' }, 403 )
179
+
180
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
181
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
182
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
183
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,bad' )
184
+ end
185
+
186
+ it 'rejects bad device ID' do
187
+ result = show( { 'device_id' => 'bad' }, 403 )
188
+
189
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
190
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
191
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
192
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id,bad' )
193
+ end
194
+
195
+ # Belt-and-braces check that multiple bad items are still rejected,
196
+ # but don't have any expectations about which one gets picked out
197
+ # in the 'reference' field.
198
+ #
199
+ it 'rejects bad combinations' do
200
+ result = show( { 'account_id' => 'bad', 'member_id' => 'bad', 'device_id' => 'bad' }, 403 )
201
+
202
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
203
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
204
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
205
+ end
206
+
207
+ it 'rejects bad IDs amongst good' do
208
+ result = show( { 'account_id' => '21', 'member_id' => 'bad', 'device_id' => 'A' }, 403 )
209
+
210
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
211
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
212
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
213
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,bad' )
214
+ end
215
+
216
+ # Each 'show' must be in its own test so that the test session data
217
+ # gets reset in between; otherwise, the *same* session identity is
218
+ # being successively merged/updated under test, since it's a single
219
+ # object that's reused rather than a new loaded-in session.
220
+ #
221
+ it 'accepts one good ID (1)' do
222
+ result = show( { 'account_id' => '22' }, 200 )
223
+ end
224
+ it 'accepts one good ID (2)' do
225
+ result = show( { 'member_id' => '1' }, 200 )
226
+ end
227
+ it 'accepts one good ID (3)' do
228
+ result = show( { 'device_id' => 'B' }, 200 )
229
+ end
230
+ it 'accepts many good IDs' do
231
+ result = show( { 'account_id' => '22', 'member_id' => '1', 'device_id' => 'B' }, 200 )
232
+ end
233
+
234
+ it 'accepts encoded names' do
235
+ get(
236
+ '/v1/rspec_assumed_identity/hello',
237
+ nil,
238
+ {
239
+ 'CONTENT_TYPE' => 'application/json; charset=utf-8',
240
+ 'HTTP_X_ASSUME_IDENTITY_OF' => 'a%63%63ount_id=22'
241
+ }
242
+ )
178
243
 
179
- expect( result[ 'kind' ] ).to eq( 'Errors' )
180
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
181
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
182
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,bad' )
183
- end
244
+ expect( last_response.status ).to eq( 200 )
245
+ end
184
246
 
185
- it 'rejects bad device ID' do
186
- result = show( { 'device_id' => 'bad' }, 403 )
247
+ it 'accepts encoded values' do
248
+ get(
249
+ '/v1/rspec_assumed_identity/hello',
250
+ nil,
251
+ {
252
+ 'CONTENT_TYPE' => 'application/json; charset=utf-8',
253
+ 'HTTP_X_ASSUME_IDENTITY_OF' => 'account_id=%32%32'
254
+ }
255
+ )
187
256
 
188
- expect( result[ 'kind' ] ).to eq( 'Errors' )
189
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
190
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
191
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id,bad' )
192
- end
257
+ expect( last_response.status ).to eq( 200 )
258
+ end
193
259
 
194
- # Belt-and-braces check that multiple bad items are still rejected,
195
- # but don't have any expectations about which one gets picked out
196
- # in the 'reference' field.
197
- #
198
- it 'rejects bad combinations' do
199
- result = show( { 'account_id' => 'bad', 'member_id' => 'bad', 'device_id' => 'bad' }, 403 )
260
+ it 'rejects an unknown name' do
261
+ result = show( { 'another_id' => 'A155C' }, 403 )
200
262
 
201
- expect( result[ 'kind' ] ).to eq( 'Errors' )
202
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
203
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
204
- end
263
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
264
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
265
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
266
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
267
+ end
205
268
 
206
- it 'rejects bad IDs amongst good' do
207
- result = show( { 'account_id' => '21', 'member_id' => 'bad', 'device_id' => 'A' }, 403 )
269
+ it 'rejects unknown names' do
270
+ result = show( { 'another_id' => 'A155C', 'additional_id' => 'iiv' }, 403 )
208
271
 
209
- expect( result[ 'kind' ] ).to eq( 'Errors' )
210
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
211
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
212
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,bad' )
213
- end
272
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
273
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
274
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
275
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'additional_id\\,another_id' )
276
+ end
214
277
 
215
- # Each 'show' must be in its own test so that the test session data
216
- # gets reset in between; otherwise, the *same* session identity is
217
- # being successively merged/updated under test, since it's a single
218
- # object that's reused rather than a new loaded-in session.
219
- #
220
- it 'accepts one good ID (1)' do
221
- result = show( { 'account_id' => '22' }, 200 )
222
- end
223
- it 'accepts one good ID (2)' do
224
- result = show( { 'member_id' => '1' }, 200 )
225
- end
226
- it 'accepts one good ID (3)' do
227
- result = show( { 'device_id' => 'B' }, 200 )
228
- end
278
+ it 'rejects an unknown name amongst a known name' do
279
+ result = show( { 'another_id' => 'A155C', 'account_id' => '22' }, 403 )
229
280
 
230
- it 'accepts many good IDs' do
231
- result = show( { 'account_id' => '22', 'member_id' => '1', 'device_id' => 'B' }, 200 )
232
- end
281
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
282
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
283
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
284
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
285
+ end
233
286
 
234
- it 'accepts encoded names' do
235
- get(
236
- '/v1/rspec_assumed_identity/hello',
237
- nil,
238
- {
239
- 'CONTENT_TYPE' => 'application/json; charset=utf-8',
240
- 'HTTP_X_ASSUME_IDENTITY_OF' => 'a%63%63ount_id=22'
241
- }
242
- )
287
+ it 'rejects an unknown name amongst known names' do
288
+ result = show( { 'another_id' => 'A155C', 'account_id' => '22', 'member_id' => '1' }, 403 )
243
289
 
244
- expect( last_response.status ).to eq( 200 )
290
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
291
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
292
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
293
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
294
+ end
245
295
  end
246
296
 
247
- it 'accepts encoded values' do
248
- get(
249
- '/v1/rspec_assumed_identity/hello',
250
- nil,
297
+ context 'and wildcards' do
298
+ before :each do
299
+ @test_session.scoping.authorised_http_headers = [ 'X-Assume-Identity-Of' ]
300
+ @test_session.scoping.authorised_identities =
251
301
  {
252
- 'CONTENT_TYPE' => 'application/json; charset=utf-8',
253
- 'HTTP_X_ASSUME_IDENTITY_OF' => 'account_id=%32%32'
302
+ 'account_id' => [ '20', '21', '22' ],
303
+ 'member_id' => '*',
304
+ 'device_id' => [ 'A', 'B' ]
254
305
  }
255
- )
256
-
257
- expect( last_response.status ).to eq( 200 )
258
- end
259
-
260
- it 'rejects an unknown name' do
261
- result = show( { 'another_id' => 'A155C' }, 403 )
262
-
263
- expect( result[ 'kind' ] ).to eq( 'Errors' )
264
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
265
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
266
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
267
- end
268
-
269
- it 'rejects unknown names' do
270
- result = show( { 'another_id' => 'A155C', 'additional_id' => 'iiv' }, 403 )
271
306
 
272
- expect( result[ 'kind' ] ).to eq( 'Errors' )
273
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
274
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
275
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'additional_id\\,another_id' )
276
- end
277
-
278
- it 'rejects an unknown name amongst a known name' do
279
- result = show( { 'another_id' => 'A155C', 'account_id' => '22' }, 403 )
280
-
281
- expect( result[ 'kind' ] ).to eq( 'Errors' )
282
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
283
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
284
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
285
- end
286
-
287
- it 'rejects an unknown name amongst known names' do
288
- result = show( { 'another_id' => 'A155C', 'account_id' => '22', 'member_id' => '1' }, 403 )
289
-
290
- expect( result[ 'kind' ] ).to eq( 'Errors' )
291
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
292
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
293
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
307
+ Hoodoo::Services::Middleware.set_test_session( @test_session )
308
+ end
309
+
310
+ it 'rejects bad account ID' do
311
+ result = show( { 'account_id' => 'bad' }, 403 )
312
+
313
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
314
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
315
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
316
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'account_id,bad' )
317
+ end
318
+
319
+ it 'rejects bad device ID' do
320
+ result = show( { 'device_id' => 'bad' }, 403 )
321
+
322
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
323
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
324
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
325
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id,bad' )
326
+ end
327
+
328
+ it 'rejects bad combinations' do
329
+ result = show( { 'account_id' => 'bad', 'member_id' => 'hit_wildcard', 'device_id' => 'bad' }, 403 )
330
+
331
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
332
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
333
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
334
+ end
335
+
336
+ it 'rejects bad IDs amongst good' do
337
+ result = show( { 'account_id' => '21', 'member_id' => 'hit_wildcard', 'device_id' => 'bad' }, 403 )
338
+
339
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
340
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
341
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
342
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id,bad' )
343
+ end
344
+
345
+ it 'accepts wildcard combinations' do
346
+ result = show( { 'account_id' => '21', 'member_id' => 'hit_wildcard', 'device_id' => 'A' }, 200 )
347
+ end
348
+
349
+ it 'accepts one good ID (1)' do
350
+ result = show( { 'account_id' => '22' }, 200 )
351
+ end
352
+ it 'accepts one good ID (2)' do
353
+ result = show( { 'member_id' => 'hit_wildcard' }, 200 )
354
+ end
355
+ it 'accepts one good ID (3)' do
356
+ result = show( { 'device_id' => 'B' }, 200 )
357
+ end
358
+ it 'accepts many good IDs' do
359
+ result = show( { 'account_id' => '22', 'member_id' => '1', 'device_id' => 'B' }, 200 )
360
+ end
294
361
  end
295
362
  end
296
363
 
297
364
  context 'with deep rules' do
298
- before :each do
299
- @test_session.scoping.authorised_http_headers = [ 'X-Assume-Identity-Of' ]
300
- @test_session.scoping.authorised_identities =
301
- {
302
- 'account_id' =>
365
+ context 'and no wildcards' do
366
+ before :each do
367
+ @test_session.scoping.authorised_http_headers = [ 'X-Assume-Identity-Of' ]
368
+ @test_session.scoping.authorised_identities =
303
369
  {
304
- '20' => { 'member_id' => [ '1', '2' ] },
305
- '21' => { 'member_id' => [ '3', '4' ] },
306
- '22' =>
370
+ 'account_id' =>
307
371
  {
308
- 'member_id' =>
372
+ '20' => { 'member_id' => [ '1', '2' ] },
373
+ '21' => { 'member_id' => [ '3', '4' ] },
374
+ '22' =>
309
375
  {
310
- '5' => { 'device_id' => [ 'A' ] },
311
- '6' => { 'device_id' => [ 'B' ] }
376
+ 'member_id' =>
377
+ {
378
+ '5' => { 'device_id' => [ 'A' ] },
379
+ '6' => { 'device_id' => [ 'B' ] }
380
+ }
312
381
  }
313
382
  }
314
383
  }
315
- }
316
-
317
- Hoodoo::Services::Middleware.set_test_session( @test_session )
318
- end
319
-
320
- it 'rejects bad account ID' do
321
- result = show( { 'account_id' => 'bad' }, 403 )
322
-
323
- expect( result[ 'kind' ] ).to eq( 'Errors' )
324
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
325
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
326
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'account_id,bad' )
327
- end
328
-
329
- it 'rejects bad member ID' do
330
- result = show( { 'account_id' => '20', 'member_id' => 'bad' }, 403 )
331
-
332
- expect( result[ 'kind' ] ).to eq( 'Errors' )
333
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
334
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
335
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,bad' )
336
- end
337
-
338
- it 'rejects bad device ID' do
339
- result = show( { 'account_id' => '22', 'member_id' => '5', 'device_id' => 'bad' }, 403 )
340
-
341
- expect( result[ 'kind' ] ).to eq( 'Errors' )
342
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
343
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
344
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id,bad' )
345
- end
346
-
347
- it 'rejects attempt to use device ID when not listed in rules' do
348
- result = show( { 'account_id' => '21', 'member_id' => '4', 'device_id' => 'A' }, 403 )
349
-
350
- expect( result[ 'kind' ] ).to eq( 'Errors' )
351
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
352
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
353
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id' )
354
- end
355
-
356
- it 'rejects an ID that is present but listed under a different key' do
357
- result = show( { 'account_id' => '20', 'member_id' => '4' }, 403 )
358
-
359
- expect( result[ 'kind' ] ).to eq( 'Errors' )
360
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
361
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
362
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,4' )
363
- end
364
-
365
- it 'rejects an ID that is present but not top-level' do
366
- result = show( { 'member_id' => '1' }, 403 )
367
-
368
- expect( result[ 'kind' ] ).to eq( 'Errors' )
369
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
370
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
371
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id' )
372
- end
373
-
374
- # Each 'show' must be in its own test so that the test session data
375
- # gets reset in between; otherwise, the *same* session identity is
376
- # being successively merged/updated under test, since it's a single
377
- # object that's reused rather than a new loaded-in session.
378
- #
379
- it 'accepts a subset of good IDs (1)' do
380
- result = show( { 'account_id' => '22' }, 200 )
381
- end
382
- it 'accepts a subset of good IDs (2)' do
383
- result = show( { 'account_id' => '22', 'member_id' => '5' }, 200 )
384
- end
385
- it 'accepts many good IDs (1)' do
386
- result = show( { 'account_id' => '20', 'member_id' => '2' }, 200 )
387
- end
388
- it 'accepts many good IDs (2)' do
389
- result = show( { 'account_id' => '22', 'member_id' => '6', 'device_id' => 'B' }, 200 )
390
- end
391
-
392
- it 'rejects an unknown name' do
393
- result = show( { 'another_id' => 'A155C' }, 403 )
394
-
395
- expect( result[ 'kind' ] ).to eq( 'Errors' )
396
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
397
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
398
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
399
- end
400
-
401
- it 'rejects unknown names' do
402
- result = show( { 'another_id' => 'A155C', 'additional_id' => 'iiv' }, 403 )
403
-
404
- expect( result[ 'kind' ] ).to eq( 'Errors' )
405
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
406
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
407
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'additional_id\\,another_id' )
408
- end
409
-
410
- it 'rejects an unknown name amongst a known name' do
411
- result = show( { 'another_id' => 'A155C', 'account_id' => '22' }, 403 )
412
-
413
- expect( result[ 'kind' ] ).to eq( 'Errors' )
414
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
415
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
416
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
417
- end
418
384
 
419
- it 'rejects an unknown name amongst known names' do
420
- result = show( { 'another_id' => 'A155C', 'account_id' => '22', 'member_id' => '6' }, 403 )
385
+ Hoodoo::Services::Middleware.set_test_session( @test_session )
386
+ end
387
+
388
+ it 'rejects bad account ID' do
389
+ result = show( { 'account_id' => 'bad' }, 403 )
390
+
391
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
392
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
393
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
394
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'account_id,bad' )
395
+ end
396
+
397
+ it 'rejects bad member ID' do
398
+ result = show( { 'account_id' => '20', 'member_id' => 'bad' }, 403 )
399
+
400
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
401
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
402
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
403
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,bad' )
404
+ end
405
+
406
+ it 'rejects bad device ID' do
407
+ result = show( { 'account_id' => '22', 'member_id' => '5', 'device_id' => 'bad' }, 403 )
408
+
409
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
410
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
411
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
412
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id,bad' )
413
+ end
414
+
415
+ it 'rejects attempt to use device ID when not listed in rules' do
416
+ result = show( { 'account_id' => '21', 'member_id' => '4', 'device_id' => 'A' }, 403 )
417
+
418
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
419
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
420
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
421
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id' )
422
+ end
423
+
424
+ it 'rejects an ID that is present but listed under a different key' do
425
+ result = show( { 'account_id' => '20', 'member_id' => '4' }, 403 )
426
+
427
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
428
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
429
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
430
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,4' )
431
+ end
432
+
433
+ it 'rejects an ID that is present but not top-level' do
434
+ result = show( { 'member_id' => '1' }, 403 )
435
+
436
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
437
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
438
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
439
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id' )
440
+ end
441
+
442
+ it 'accepts a subset of good IDs (1)' do
443
+ result = show( { 'account_id' => '22' }, 200 )
444
+ end
445
+ it 'accepts a subset of good IDs (2)' do
446
+ result = show( { 'account_id' => '22', 'member_id' => '5' }, 200 )
447
+ end
448
+ it 'accepts many good IDs (1)' do
449
+ result = show( { 'account_id' => '20', 'member_id' => '2' }, 200 )
450
+ end
451
+ it 'accepts many good IDs (2)' do
452
+ result = show( { 'account_id' => '22', 'member_id' => '6', 'device_id' => 'B' }, 200 )
453
+ end
454
+
455
+ it 'rejects an unknown name' do
456
+ result = show( { 'another_id' => 'A155C' }, 403 )
457
+
458
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
459
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
460
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
461
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
462
+ end
463
+
464
+ it 'rejects unknown names' do
465
+ result = show( { 'another_id' => 'A155C', 'additional_id' => 'iiv' }, 403 )
466
+
467
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
468
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
469
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
470
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'additional_id\\,another_id' )
471
+ end
472
+
473
+ it 'rejects an unknown name amongst a known name' do
474
+ result = show( { 'another_id' => 'A155C', 'account_id' => '22' }, 403 )
475
+
476
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
477
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
478
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
479
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
480
+ end
481
+
482
+ it 'rejects an unknown name amongst known names' do
483
+ result = show( { 'another_id' => 'A155C', 'account_id' => '22', 'member_id' => '6' }, 403 )
484
+
485
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
486
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
487
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
488
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
489
+ end
490
+ end
491
+
492
+ context 'and wildcards' do
493
+ before :each do
494
+ @test_session.scoping.authorised_http_headers = [ 'X-Assume-Identity-Of' ]
495
+ @test_session.scoping.authorised_identities =
496
+ {
497
+ 'account_id' =>
498
+ {
499
+ '20' => { 'member_id' => [ '1', '2' ] },
500
+ '21' => { 'member_id' => '*' },
501
+ '22' =>
502
+ {
503
+ 'member_id' =>
504
+ {
505
+ '5' => { 'device_id' => [ 'A' ] },
506
+ '6' => { 'device_id' => [ 'B' ] }
507
+ }
508
+ }
509
+ }
510
+ }
421
511
 
422
- expect( result[ 'kind' ] ).to eq( 'Errors' )
423
- expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
424
- expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
425
- expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'another_id' )
512
+ Hoodoo::Services::Middleware.set_test_session( @test_session )
513
+ end
514
+
515
+ it 'rejects bad account ID' do
516
+ result = show( { 'account_id' => 'bad' }, 403 )
517
+
518
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
519
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
520
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
521
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'account_id,bad' )
522
+ end
523
+
524
+ it 'rejects bad member ID' do
525
+ result = show( { 'account_id' => '20', 'member_id' => 'bad' }, 403 )
526
+
527
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
528
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
529
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
530
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,bad' )
531
+ end
532
+
533
+ it 'rejects bad device ID' do
534
+ result = show( { 'account_id' => '22', 'member_id' => '5', 'device_id' => 'bad' }, 403 )
535
+
536
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
537
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
538
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
539
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id,bad' )
540
+ end
541
+
542
+ it 'rejects attempt to use device ID when not listed in rules' do
543
+ result = show( { 'account_id' => '21', 'member_id' => '4', 'device_id' => 'A' }, 403 )
544
+
545
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
546
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
547
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
548
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'device_id' )
549
+ end
550
+
551
+ it 'rejects an ID that is present but listed under a different key' do
552
+ result = show( { 'account_id' => '20', 'member_id' => '4' }, 403 )
553
+
554
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
555
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
556
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests a prohibited identity quantity' )
557
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id,4' )
558
+ end
559
+
560
+ it 'rejects an ID that is present but not top-level' do
561
+ result = show( { 'member_id' => '1' }, 403 )
562
+
563
+ expect( result[ 'kind' ] ).to eq( 'Errors' )
564
+ expect( result[ 'errors' ][ 0 ][ 'code' ] ).to eq( 'platform.forbidden' )
565
+ expect( result[ 'errors' ][ 0 ][ 'message' ] ).to eq( 'X-Assume-Identity-Of header value requests prohibited identity name(s)' )
566
+ expect( result[ 'errors' ][ 0 ][ 'reference' ] ).to eq( 'member_id' )
567
+ end
568
+
569
+ it 'accepts a subset of good IDs (1)' do
570
+ result = show( { 'account_id' => '22' }, 200 )
571
+ end
572
+ it 'accepts a subset of good IDs (2)' do
573
+ result = show( { 'account_id' => '22', 'member_id' => '5' }, 200 )
574
+ end
575
+ it 'accepts many good IDs (1)' do
576
+ result = show( { 'account_id' => '20', 'member_id' => '2' }, 200 )
577
+ end
578
+ it 'accepts many good IDs (2)' do
579
+ result = show( { 'account_id' => '22', 'member_id' => '6', 'device_id' => 'B' }, 200 )
580
+ end
581
+ it 'accepts wildcard names' do
582
+ result = show( { 'account_id' => '21', 'member_id' => 'hit_wildcard' }, 200 )
583
+ end
426
584
  end
427
-
428
585
  end
429
586
 
430
587
  context 'with malformed rules' do
@@ -25,6 +25,17 @@ describe Hoodoo::TransientStore::Mocks::Redis do
25
25
  end
26
26
  end
27
27
 
28
+ context 'deprecated interfaces in Redis' do
29
+ it 'supports Array-like "set" and "get"' do
30
+ mock_redis_instance = Hoodoo::TransientStore::Mocks::Redis.new
31
+ key = Hoodoo::UUID.generate()
32
+ value = Hoodoo::UUID.generate()
33
+
34
+ mock_redis_instance[ key ] = value
35
+ expect( mock_redis_instance[ key ] ).to eq( value )
36
+ end
37
+ end
38
+
28
39
  context 'approximate old behaviour by' do
29
40
  it 'using the mock client in test mode if there is an empty host' do
30
41
  expect_any_instance_of( Hoodoo::TransientStore::Mocks::Redis ).to receive( :initialize ).once.and_call_original()
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoodoo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Loyalty New Zealand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-07 00:00:00.000000000 Z
11
+ date: 2018-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack