@@ -60,6 +60,22 @@ export const usePolicies = () => {
6060 * @returns Result
6161 */
6262 const setPolicyMultiple = async ( data : any ) => {
63+ // Add basic deduplication for policy names if applicable
64+ // This handles common batch policy assignment patterns
65+ if ( data . policyName && Array . isArray ( data . policyName ) ) {
66+ data . policyName = Array . from ( new Set ( data . policyName ) )
67+ }
68+ // Handle potential different structure where policies might be in a 'policies' array
69+ if ( data . policies && Array . isArray ( data . policies ) ) {
70+ // If policies array contains objects with policyName, deduplicate based on policyName
71+ const policyNameMap = new Map ( )
72+ data . policies . forEach ( ( policy : any ) => {
73+ if ( policy . policyName && ! policyNameMap . has ( policy . policyName ) ) {
74+ policyNameMap . set ( policy . policyName , policy )
75+ }
76+ } )
77+ data . policies = Array . from ( policyNameMap . values ( ) )
78+ }
6379 return await $api . put ( `/set-policy-multi` , data )
6480 }
6581
@@ -69,6 +85,10 @@ export const usePolicies = () => {
6985 * @returns Result
7086 */
7187 const setUserOrGroupPolicy = async ( data : any ) => {
88+ // Ensure policy names are unique before sending to API
89+ if ( data . policyName && Array . isArray ( data . policyName ) ) {
90+ data . policyName = Array . from ( new Set ( data . policyName ) )
91+ }
7292 return await $api . put ( `/set-user-or-group-policy` , { } , { params : data } )
7393 }
7494
@@ -80,37 +100,56 @@ export const usePolicies = () => {
80100 const getPolicyByUserName = async ( userName : string ) => {
81101 // Get user policy groups
82102 const userInfo = await $api . get ( `/user-info?accessKey=${ userName } ` )
83- const policyName = userInfo ?. policyName ?. split ( ',' ) || [ ]
103+ const directPolicyNames = userInfo ?. policyName ?. split ( ',' ) || [ ]
84104
85105 // Get user's group memberships
86- const memberOf = userInfo ?. memberOf
106+ const memberOf = userInfo ?. memberOf || [ ]
87107 // Get group policies
88- if ( memberOf && memberOf . length > 0 ) {
89- const promises = memberOf . map ( async ( element : string ) => {
90- const groupInfo : { policy ?: string } = await $api . get ( `/group?group=${ encodeURIComponent ( element ) } ` )
91- const groupPolicyName : string [ ] = groupInfo . policy ? groupInfo . policy . split ( ',' ) : [ ]
92- return groupPolicyName
93- } )
94- const results = await Promise . all ( promises )
95- results . forEach ( policyNames => {
96- policyName . push ( ...policyNames )
108+ const groupPoliciesMap : Record < string , string [ ] > = { }
109+ if ( memberOf . length > 0 ) {
110+ const promises = memberOf . map ( async ( groupName : string ) => {
111+ const groupInfo : { policy ?: string } = await $api . get ( `/group?group=${ encodeURIComponent ( groupName ) } ` )
112+ const groupPolicyNames : string [ ] = groupInfo . policy ? groupInfo . policy . split ( ',' ) : [ ]
113+ if ( groupPolicyNames . length > 0 ) {
114+ groupPoliciesMap [ groupName ] = groupPolicyNames
115+ }
97116 } )
117+ await Promise . all ( promises )
98118 }
99119
100- // Remove duplicates
101- let uniquePolicyName : string [ ] = [ ]
102- if ( policyName . length ) {
103- uniquePolicyName = Array . from ( new Set ( policyName ) )
104- }
120+ // Collect all unique policy names
121+ const allPolicyNames = new Set < string > ( )
122+ directPolicyNames . forEach ( ( policyName : string ) => allPolicyNames . add ( policyName ) )
123+ Object . values ( groupPoliciesMap ) . forEach ( ( policyNames : string [ ] ) => {
124+ policyNames . forEach ( ( policyName : string ) => allPolicyNames . add ( policyName ) )
125+ } )
105126
106127 let policyStatement : any = [ ]
107- // Get all remaining policy documents
108- if ( uniquePolicyName . length ) {
109- const policyPromises = uniquePolicyName . map ( async ( element : any ) => {
110- const policyInfo = await getPolicy ( element )
128+ // Get all policy documents
129+ if ( allPolicyNames . size > 0 ) {
130+ const policyPromises = Array . from ( allPolicyNames ) . map ( async ( policyName : string ) => {
131+ const policyInfo = await getPolicy ( policyName )
111132 // Format policy
112133 let policyRes = JSON . parse ( policyInfo . policy )
113134 if ( policyRes ?. Statement ) {
135+ // Add origin information to each statement
136+ policyRes . Statement = policyRes . Statement . map ( ( statement : any ) => {
137+ // Check if this policy is direct or inherited from groups
138+ const isDirect = directPolicyNames . includes ( policyName )
139+ const groupOrigins = Object . entries ( groupPoliciesMap )
140+ . filter ( ( [ _ , policies ] ) => policies . includes ( policyName ) )
141+ . map ( ( [ groupName ] ) => groupName )
142+
143+ return {
144+ ...statement ,
145+ Sid : statement . Sid || policyName , // Use policy name as Sid if not provided
146+ Origin : {
147+ type : isDirect && groupOrigins . length > 0 ? 'both' : isDirect ? 'direct' : 'group' ,
148+ groups : groupOrigins ,
149+ policyName : policyName ,
150+ } ,
151+ }
152+ } )
114153 policyStatement . push ( ...policyRes . Statement )
115154 }
116155 } )
0 commit comments