@@ -56,6 +56,7 @@ all() ->
5656 {group , definitions_group2_without_prefix },
5757 {group , definitions_group3_without_prefix },
5858 {group , definitions_group4_without_prefix },
59+ {group , definitions_group5_without_prefix },
5960 {group , default_queue_type_without_prefix }
6061 ].
6162
@@ -71,6 +72,7 @@ groups() ->
7172 {definitions_group2_without_prefix , [], definitions_group2_tests ()},
7273 {definitions_group3_without_prefix , [], definitions_group3_tests ()},
7374 {definitions_group4_without_prefix , [], definitions_group4_tests ()},
75+ {definitions_group5_without_prefix , [], definitions_group5_tests ()},
7476 {default_queue_type_without_prefix , [], default_queue_type_group_tests ()}
7577 ].
7678
@@ -113,6 +115,14 @@ definitions_group4_tests() ->
113115 definitions_vhost_test
114116 ].
115117
118+ definitions_group5_tests () ->
119+ [
120+ definitions_multipart_non_json_extension_rejected_test ,
121+ definitions_multipart_non_json_extension_allowed_when_not_enforced_test ,
122+ require_definition_json_extension_defaults_to_false_in_overview_test ,
123+ require_definition_json_extension_enabled_in_overview_test
124+ ].
125+
116126default_queue_type_group_tests () ->
117127 [
118128 default_queue_type_fallback_in_overview_test ,
@@ -2234,7 +2244,7 @@ long_definitions_multipart_test(Config) ->
22342244 Data = binary_to_list (format_for_upload (LongDefs )),
22352245 CodeExp = {group , '2xx' },
22362246 Boundary = " ------------long_definitions_multipart_test" ,
2237- Body = format_multipart_filedata (Boundary , [{file , " file " , Data }]),
2247+ Body = format_multipart_filedata (Boundary , [{file , " definitions.json " , Data }]),
22382248 ContentType = lists :concat ([" multipart/form-data; boundary=" , Boundary ]),
22392249 MoreHeaders = [{" content-type" , ContentType }, {" content-length" , integer_to_list (length (Body ))}],
22402250 http_upload_raw (Config , post , " /definitions" , Body , " guest" , " guest" , CodeExp , MoreHeaders ),
@@ -3492,7 +3502,7 @@ definitions_multipart_body_size_limit_test(Config) ->
34923502 Boundary = " ------------definitions_multipart_body_size_limit_test" ,
34933503 LargeBody = list_to_binary (lists :duplicate (300 , $\s )),
34943504 OversizedMultipart = format_multipart_filedata (Boundary ,
3495- [{file , " file " , Data ++ binary_to_list (LargeBody )}]),
3505+ [{file , " definitions.json " , Data ++ binary_to_list (LargeBody )}]),
34963506 ContentType = lists :concat ([" multipart/form-data; boundary=" , Boundary ]),
34973507 MoreHeaders = [{" content-type" , ContentType },
34983508 {" content-length" , integer_to_list (length (OversizedMultipart ))}],
@@ -3503,6 +3513,64 @@ definitions_multipart_body_size_limit_test(Config) ->
35033513 rpc (Config , application , unset_env , [rabbitmq_management , max_http_body_size ])
35043514 end .
35053515
3516+ definitions_multipart_non_json_extension_rejected_test (Config ) ->
3517+ % % When require_definition_json_extension is enabled, uploads whose filename does not
3518+ % % end in .json must be rejected with HTTP 400. The JSON response body must
3519+ % % include the reason code and the offending filename.
3520+ rpc (Config , application , set_env ,
3521+ [rabbitmq_management , require_definition_json_extension , true ]),
3522+ try
3523+ SmallDefs = #{users => [], vhosts => [#{name => <<" test" >>}]},
3524+ Data = binary_to_list (format_for_upload (SmallDefs )),
3525+ Boundary = " ------------definitions_multipart_non_json_rejected" ,
3526+ Body = format_multipart_filedata (Boundary , [{file , " definitions.txt" , Data }]),
3527+ ContentType = lists :concat ([" multipart/form-data; boundary=" , Boundary ]),
3528+ MoreHeaders = [{" content-type" , ContentType },
3529+ {" content-length" , integer_to_list (length (Body ))},
3530+ auth_header (" guest" , " guest" )],
3531+ {ok , {{_ , 400 , _ }, _ , ResBody }} =
3532+ req (Config , 0 , post , " /definitions" , MoreHeaders , Body ),
3533+ Decoded = decode_body (ResBody ),
3534+ ? assertEqual (<<" unsupported_file_extension" >>, maps :get (reason , Decoded )),
3535+ ? assertEqual (<<" definitions.txt" >>, maps :get (filename , Decoded )),
3536+ passed
3537+ after
3538+ rpc (Config , application , unset_env ,
3539+ [rabbitmq_management , require_definition_json_extension ])
3540+ end .
3541+
3542+ definitions_multipart_non_json_extension_allowed_when_not_enforced_test (Config ) ->
3543+ % % By default (require_definition_json_extension = false), files with any extension are accepted.
3544+ SmallDefs = #{users => [], vhosts => [#{name => <<" test" >>}]},
3545+ Data = binary_to_list (format_for_upload (SmallDefs )),
3546+ Boundary = " ------------definitions_multipart_non_json_allowed" ,
3547+ Body = format_multipart_filedata (Boundary , [{file , " definitions.txt" , Data }]),
3548+ ContentType = lists :concat ([" multipart/form-data; boundary=" , Boundary ]),
3549+ MoreHeaders = [{" content-type" , ContentType },
3550+ {" content-length" , integer_to_list (length (Body ))}],
3551+ http_upload_raw (Config , post , " /definitions" , Body ,
3552+ " guest" , " guest" , {group , '2xx' }, MoreHeaders ),
3553+ passed .
3554+
3555+ require_definition_json_extension_defaults_to_false_in_overview_test (Config ) ->
3556+ % % By default, require_definition_json_extension is false and must be reflected in the overview.
3557+ Overview = http_get (Config , " /overview" ),
3558+ ? assertEqual (false , maps :get (require_definition_json_extension , Overview )),
3559+ passed .
3560+
3561+ require_definition_json_extension_enabled_in_overview_test (Config ) ->
3562+ % % When enabled, the overview endpoint must report require_definition_json_extension as true.
3563+ rpc (Config , application , set_env ,
3564+ [rabbitmq_management , require_definition_json_extension , true ]),
3565+ try
3566+ Overview = http_get (Config , " /overview" ),
3567+ ? assertEqual (true , maps :get (require_definition_json_extension , Overview )),
3568+ passed
3569+ after
3570+ rpc (Config , application , unset_env ,
3571+ [rabbitmq_management , require_definition_json_extension ])
3572+ end .
3573+
35063574publish_accept_json_test (Config ) ->
35073575 Headers = #{'x-forwarding' => [#{uri => <<" amqp://localhost/%2F/upstream" >>}]},
35083576 Msg = msg (<<" publish_accept_json_test" >>, Headers , <<" Hello world" >>),
0 commit comments