@@ -81,12 +81,15 @@ function parse_max_items(input_max_items) {
8181}
8282
8383/**
84- * validate_params will call the aquivalent function in user or access key
84+ * validate_params will call the equivalent function (for example: user, access key, tagging, etc.)
85+ * Note: The order of conditions matters - check 'tag' before 'user' to avoid misrouting
8586 * @param {string } action
8687 * @param {object } params
8788 */
8889function validate_params ( action , params ) {
89- if ( action . includes ( 'policy' ) || action . includes ( 'policies' ) ) {
90+ if ( action . includes ( 'tag' ) ) {
91+ validate_tagging_params ( action , params ) ;
92+ } else if ( action . includes ( 'policy' ) || action . includes ( 'policies' ) ) {
9093 validate_policy_params ( action , params ) ;
9194 } else if ( action . includes ( 'user' ) ) {
9295 validate_user_params ( action , params ) ;
@@ -151,6 +154,27 @@ function validate_access_keys_params(action, params) {
151154 }
152155}
153156
157+ /**
158+ * validate_tagging_params will call the equivalent function for each action in tagging API
159+ * @param {string } action
160+ * @param {object } params
161+ */
162+ function validate_tagging_params ( action , params ) {
163+ switch ( action ) {
164+ case iam_constants . IAM_ACTIONS . TAG_USER :
165+ validate_tag_user_params ( params ) ;
166+ break ;
167+ case iam_constants . IAM_ACTIONS . UNTAG_USER :
168+ validate_untag_user_params ( params ) ;
169+ break ;
170+ case iam_constants . IAM_ACTIONS . LIST_USER_TAGS :
171+ validate_list_user_tags_params ( params ) ;
172+ break ;
173+ default :
174+ throw new RpcError ( 'INTERNAL_ERROR' , `${ action } is not supported` ) ;
175+ }
176+ }
177+
154178/**
155179 * validate_policy_params will call the aquivalent function for each action in user policy API
156180 * @param {string } action
@@ -581,6 +605,100 @@ function translate_rpc_error(err) {
581605 throw err ;
582606}
583607
608+ /**
609+ * parse_indexed_members parses indexed array members
610+ * generic parser for AWS-style indexed request parameters
611+ * @param {object } body - request body
612+ * @param {string } base_key - the base key pattern (e.g., 'tags_member_{index}_key)
613+ * @param {Function } [mapper] - optional function to convert each item
614+ */
615+ function parse_indexed_members ( body , base_key , mapper ) {
616+ const result = [ ] ;
617+ let index = 1 ;
618+ let check_key = base_key . replace ( '{index}' , String ( index ) ) ;
619+
620+ while ( body [ check_key ] !== undefined ) {
621+ result . push ( mapper ? mapper ( body , index ) : body [ check_key ] ) ;
622+ index += 1 ;
623+ check_key = base_key . replace ( '{index}' , String ( index ) ) ;
624+ }
625+ return result ;
626+ }
627+
628+ /**
629+ * parse_tags_from_request_body parses tags from request body
630+ * converts AWS encoded indexed members to array of tag objects
631+ * example input: { tags_member_1_key: 'env', tags_member_1_value: 'prod', tags_member_2_key: 'team', tags_member_2_value: 'backend' }
632+ * example output: [{ key: 'env', value: 'prod' }, { key: 'team', value: 'backend' }]
633+ * @param {object } body - request body
634+ * @returns {Array<{key: string, value: string}> } array of tag objects
635+ */
636+ function parse_tags_from_request_body ( body ) {
637+ return parse_indexed_members (
638+ body ,
639+ 'tags_member_{index}_key' ,
640+ ( req_body , index ) => ( {
641+ key : req_body [ `tags_member_${ index } _key` ] ,
642+ value : req_body [ `tags_member_${ index } _value` ] || ''
643+ } )
644+ ) ;
645+ }
646+
647+ /**
648+ * parse_tag_keys_from_request_body parses tag keys from request body
649+ * converts AWS encoded indexed members to array
650+ * example input: { tag_keys_member_1: 'env', tag_keys_member_2: 'team' }
651+ * example output: ['env', 'team']
652+ * @param {object } body - request body
653+ * @returns {Array<string> } array of tag keys
654+ */
655+ function parse_tag_keys_from_request_body ( body ) {
656+ return parse_indexed_members ( body , 'tag_keys_member_{index}' ) ;
657+ }
658+
659+ /**
660+ * validate_tag_user_params checks the params for tag_user action
661+ * @param {object } params
662+ */
663+ function validate_tag_user_params ( params ) {
664+ try {
665+ check_required_username ( params ) ;
666+ validation_utils . validate_username ( params . username , iam_constants . IAM_PARAMETER_NAME . USERNAME ) ;
667+ validation_utils . validate_iam_tags ( params . tags ) ;
668+ } catch ( err ) {
669+ translate_rpc_error ( err ) ;
670+ }
671+ }
672+
673+ /**
674+ * validate_untag_user_params checks the params for untag_user action
675+ * @param {object } params
676+ */
677+ function validate_untag_user_params ( params ) {
678+ try {
679+ check_required_username ( params ) ;
680+ validation_utils . validate_username ( params . username , iam_constants . IAM_PARAMETER_NAME . USERNAME ) ;
681+ validation_utils . validate_iam_tag_keys ( params . tag_keys ) ;
682+ } catch ( err ) {
683+ translate_rpc_error ( err ) ;
684+ }
685+ }
686+
687+ /**
688+ * validate_list_user_tags_params checks the params for list_user_tags action
689+ * @param {object } params
690+ */
691+ function validate_list_user_tags_params ( params ) {
692+ try {
693+ check_required_username ( params ) ;
694+ validation_utils . validate_username ( params . username , iam_constants . IAM_PARAMETER_NAME . USERNAME ) ;
695+ validate_marker ( params . marker ) ;
696+ validate_max_items ( params . max_items ) ;
697+ } catch ( err ) {
698+ translate_rpc_error ( err ) ;
699+ }
700+ }
701+
584702// EXPORTS
585703exports . format_iam_xml_date = format_iam_xml_date ;
586704exports . create_arn_for_user = create_arn_for_user ;
@@ -593,4 +711,10 @@ exports.validate_iam_path = validate_iam_path;
593711exports . validate_marker = validate_marker ;
594712exports . validate_access_key_id = validate_access_key_id ;
595713exports . validate_status = validate_status ;
714+ exports . parse_indexed_members = parse_indexed_members ;
715+ exports . parse_tags_from_request_body = parse_tags_from_request_body ;
716+ exports . parse_tag_keys_from_request_body = parse_tag_keys_from_request_body ;
717+ exports . validate_tag_user_params = validate_tag_user_params ;
718+ exports . validate_untag_user_params = validate_untag_user_params ;
719+ exports . validate_list_user_tags_params = validate_list_user_tags_params ;
596720
0 commit comments