16
16
*/
17
17
18
18
use matter:: {
19
- acl:: { AclEntry , AuthMode , Target } ,
19
+ acl:: { gen_noc_cat , AclEntry , AuthMode , Target } ,
20
20
data_model:: {
21
21
objects:: { AttrValue , EncodeValue , Privilege } ,
22
22
system_model:: access_control,
@@ -30,6 +30,7 @@ use matter::{
30
30
messages:: { msg, GenericPath } ,
31
31
} ,
32
32
tlv:: { self , ElementType , FromTLV , TLVArray , TLVElement , TLVWriter , TagType } ,
33
+ transport:: session:: NocCatIds ,
33
34
} ;
34
35
35
36
use crate :: {
@@ -77,6 +78,7 @@ fn gen_read_reqs_output<'a>(
77
78
fn handle_write_reqs (
78
79
im : & mut ImEngine ,
79
80
peer_node_id : u64 ,
81
+ peer_cat_ids : Option < & NocCatIds > ,
80
82
input : & [ AttrData ] ,
81
83
expected : & [ AttrStatus ] ,
82
84
) {
@@ -85,6 +87,9 @@ fn handle_write_reqs(
85
87
86
88
let mut input = ImInput :: new ( OpCode :: WriteRequest , & write_req) ;
87
89
input. set_peer_node_id ( peer_node_id) ;
90
+ if let Some ( cat_ids) = peer_cat_ids {
91
+ input. set_cat_ids ( cat_ids) ;
92
+ }
88
93
let ( _, out_buf) = im. process ( & input, & mut out_buf) ;
89
94
90
95
tlv:: print_tlv_list ( out_buf) ;
@@ -263,7 +268,7 @@ fn wc_write_attribute() {
263
268
264
269
// Test 1: Wildcard write to an attribute without permission should return
265
270
// no error
266
- handle_write_reqs ( & mut im, peer, input0, & [ ] ) ;
271
+ handle_write_reqs ( & mut im, peer, None , input0, & [ ] ) ;
267
272
{
268
273
let node = im. dm . node . read ( ) . unwrap ( ) ;
269
274
let echo = node. get_cluster ( 0 , echo_cluster:: ID ) . unwrap ( ) ;
@@ -287,6 +292,7 @@ fn wc_write_attribute() {
287
292
handle_write_reqs (
288
293
& mut im,
289
294
peer,
295
+ None ,
290
296
input0,
291
297
& [ AttrStatus :: new ( & ep0_att, IMStatusCode :: Sucess , 0 ) ] ,
292
298
) ;
@@ -307,6 +313,7 @@ fn wc_write_attribute() {
307
313
handle_write_reqs (
308
314
& mut im,
309
315
peer,
316
+ None ,
310
317
input1,
311
318
& [
312
319
AttrStatus :: new ( & ep0_att, IMStatusCode :: Sucess , 0 ) ,
@@ -350,7 +357,7 @@ fn exact_write_attribute() {
350
357
351
358
// Test 1: Exact write to an attribute without permission should return
352
359
// Unsupported Access Error
353
- handle_write_reqs ( & mut im, peer, input, expected_fail) ;
360
+ handle_write_reqs ( & mut im, peer, None , input, expected_fail) ;
354
361
assert_eq ! (
355
362
AttrValue :: Uint16 ( ATTR_WRITE_DEFAULT_VALUE ) ,
356
363
read_cluster_id_write_attr( & im, 0 )
@@ -363,7 +370,62 @@ fn exact_write_attribute() {
363
370
364
371
// Test 1: Exact write to an attribute with permission should grant
365
372
// access
366
- handle_write_reqs ( & mut im, peer, input, expected_success) ;
373
+ handle_write_reqs ( & mut im, peer, None , input, expected_success) ;
374
+ assert_eq ! ( AttrValue :: Uint16 ( val0) , read_cluster_id_write_attr( & im, 0 ) ) ;
375
+ }
376
+
377
+ #[ test]
378
+ /// Ensure that an write attribute without a wildcard returns an error when the
379
+ /// ACL disallows the access, and returns success once access is granted to the CAT ID
380
+ /// The Accessor CAT version is one more than that in the ACL
381
+ fn exact_write_attribute_noc_cat ( ) {
382
+ let _ = env_logger:: try_init ( ) ;
383
+ let val0 = 10 ;
384
+ let attr_data0 = |tag, t : & mut TLVWriter | {
385
+ let _ = t. u16 ( tag, val0) ;
386
+ } ;
387
+
388
+ let ep0_att = GenericPath :: new (
389
+ Some ( 0 ) ,
390
+ Some ( echo_cluster:: ID ) ,
391
+ Some ( echo_cluster:: Attributes :: AttWrite as u32 ) ,
392
+ ) ;
393
+
394
+ let input = & [ AttrData :: new (
395
+ None ,
396
+ AttrPath :: new ( & ep0_att) ,
397
+ EncodeValue :: Closure ( & attr_data0) ,
398
+ ) ] ;
399
+ let expected_fail = & [ AttrStatus :: new (
400
+ & ep0_att,
401
+ IMStatusCode :: UnsupportedAccess ,
402
+ 0 ,
403
+ ) ] ;
404
+ let expected_success = & [ AttrStatus :: new ( & ep0_att, IMStatusCode :: Sucess , 0 ) ] ;
405
+
406
+ let peer = 98765 ;
407
+ /* CAT in NOC is 1 more, in version, than that in ACL */
408
+ let noc_cat = gen_noc_cat ( 0xABCD , 2 ) ;
409
+ let cat_in_acl = gen_noc_cat ( 0xABCD , 1 ) ;
410
+ let cat_ids = [ noc_cat, 0 , 0 ] ;
411
+ let mut im = ImEngine :: new ( ) ;
412
+
413
+ // Test 1: Exact write to an attribute without permission should return
414
+ // Unsupported Access Error
415
+ handle_write_reqs ( & mut im, peer, Some ( & cat_ids) , input, expected_fail) ;
416
+ assert_eq ! (
417
+ AttrValue :: Uint16 ( ATTR_WRITE_DEFAULT_VALUE ) ,
418
+ read_cluster_id_write_attr( & im, 0 )
419
+ ) ;
420
+
421
+ // Add ACL to allow our peer to access any endpoint
422
+ let mut acl = AclEntry :: new ( 1 , Privilege :: ADMIN , AuthMode :: Case ) ;
423
+ acl. add_subject ( cat_in_acl) . unwrap ( ) ;
424
+ im. acl_mgr . add ( acl) . unwrap ( ) ;
425
+
426
+ // Test 1: Exact write to an attribute with permission should grant
427
+ // access
428
+ handle_write_reqs ( & mut im, peer, Some ( & cat_ids) , input, expected_success) ;
367
429
assert_eq ! ( AttrValue :: Uint16 ( val0) , read_cluster_id_write_attr( & im, 0 ) ) ;
368
430
}
369
431
@@ -399,6 +461,7 @@ fn insufficient_perms_write() {
399
461
handle_write_reqs (
400
462
& mut im,
401
463
peer,
464
+ None ,
402
465
input0,
403
466
& [ AttrStatus :: new (
404
467
& ep0_att,
@@ -466,6 +529,7 @@ fn write_with_runtime_acl_add() {
466
529
handle_write_reqs (
467
530
& mut im,
468
531
peer,
532
+ None ,
469
533
// write to echo-cluster attribute, write to acl attribute, write to echo-cluster attribute
470
534
& [ input0, acl_input, input0] ,
471
535
& [
@@ -623,6 +687,7 @@ fn test_write_data_ver() {
623
687
handle_write_reqs (
624
688
& mut im,
625
689
peer,
690
+ None ,
626
691
input_correct_dataver,
627
692
& [ AttrStatus :: new ( & ep0_attwrite, IMStatusCode :: Sucess , 0 ) ] ,
628
693
) ;
@@ -638,6 +703,7 @@ fn test_write_data_ver() {
638
703
handle_write_reqs (
639
704
& mut im,
640
705
peer,
706
+ None ,
641
707
input_correct_dataver,
642
708
& [ AttrStatus :: new (
643
709
& ep0_attwrite,
@@ -660,6 +726,7 @@ fn test_write_data_ver() {
660
726
handle_write_reqs (
661
727
& mut im,
662
728
peer,
729
+ None ,
663
730
input_correct_dataver,
664
731
& [ AttrStatus :: new ( & ep0_attwrite, IMStatusCode :: Sucess , 0 ) ] ,
665
732
) ;
0 commit comments