mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-09 23:54:17 -06:00
41c23b2f04
* Various string slices are sorted and truncated to strings if they only contain one element. * Sids are now included if they are empty. This is to ensure what is sent to AWS matches what comes back, to prevent recurring diffs even when the policy has changed.
96 lines
2.6 KiB
Go
96 lines
2.6 KiB
Go
package aws
|
|
|
|
import (
|
|
"encoding/json"
|
|
"sort"
|
|
)
|
|
|
|
type IAMPolicyDoc struct {
|
|
Version string `json:",omitempty"`
|
|
Id string `json:",omitempty"`
|
|
Statements []*IAMPolicyStatement `json:"Statement"`
|
|
}
|
|
|
|
type IAMPolicyStatement struct {
|
|
Sid string
|
|
Effect string `json:",omitempty"`
|
|
Actions interface{} `json:"Action,omitempty"`
|
|
NotActions interface{} `json:"NotAction,omitempty"`
|
|
Resources interface{} `json:"Resource,omitempty"`
|
|
NotResources interface{} `json:"NotResource,omitempty"`
|
|
Principals IAMPolicyStatementPrincipalSet `json:"Principal,omitempty"`
|
|
NotPrincipals IAMPolicyStatementPrincipalSet `json:"NotPrincipal,omitempty"`
|
|
Conditions IAMPolicyStatementConditionSet `json:"Condition,omitempty"`
|
|
}
|
|
|
|
type IAMPolicyStatementPrincipal struct {
|
|
Type string
|
|
Identifiers interface{}
|
|
}
|
|
|
|
type IAMPolicyStatementCondition struct {
|
|
Test string
|
|
Variable string
|
|
Values interface{}
|
|
}
|
|
|
|
type IAMPolicyStatementPrincipalSet []IAMPolicyStatementPrincipal
|
|
type IAMPolicyStatementConditionSet []IAMPolicyStatementCondition
|
|
|
|
func (ps IAMPolicyStatementPrincipalSet) MarshalJSON() ([]byte, error) {
|
|
raw := map[string]interface{}{}
|
|
|
|
for _, p := range ps {
|
|
switch i := p.Identifiers.(type) {
|
|
case []string:
|
|
if _, ok := raw[p.Type]; !ok {
|
|
raw[p.Type] = make([]string, 0, len(i))
|
|
}
|
|
sort.Sort(sort.Reverse(sort.StringSlice(i)))
|
|
raw[p.Type] = append(raw[p.Type].([]string), i...)
|
|
case string:
|
|
raw[p.Type] = i
|
|
default:
|
|
panic("Unsupported data type for IAMPolicyStatementPrincipalSet")
|
|
}
|
|
}
|
|
|
|
return json.Marshal(&raw)
|
|
}
|
|
|
|
func (cs IAMPolicyStatementConditionSet) MarshalJSON() ([]byte, error) {
|
|
raw := map[string]map[string]interface{}{}
|
|
|
|
for _, c := range cs {
|
|
if _, ok := raw[c.Test]; !ok {
|
|
raw[c.Test] = map[string]interface{}{}
|
|
}
|
|
switch i := c.Values.(type) {
|
|
case []string:
|
|
if _, ok := raw[c.Test][c.Variable]; !ok {
|
|
raw[c.Test][c.Variable] = make([]string, 0, len(i))
|
|
}
|
|
sort.Sort(sort.Reverse(sort.StringSlice(i)))
|
|
raw[c.Test][c.Variable] = append(raw[c.Test][c.Variable].([]string), i...)
|
|
case string:
|
|
raw[c.Test][c.Variable] = i
|
|
default:
|
|
panic("Unsupported data type for IAMPolicyStatementConditionSet")
|
|
}
|
|
}
|
|
|
|
return json.Marshal(&raw)
|
|
}
|
|
|
|
func iamPolicyDecodeConfigStringList(lI []interface{}) interface{} {
|
|
if len(lI) == 1 {
|
|
return lI[0].(string)
|
|
}
|
|
ret := make([]string, len(lI))
|
|
for i, vI := range lI {
|
|
ret[i] = vI.(string)
|
|
}
|
|
sort.Sort(sort.Reverse(sort.StringSlice(ret)))
|
|
return ret
|
|
}
|