Skip to content

Commit f09656b

Browse files
committed
fix: add missing statement elements needed for the policy definitions
1 parent 65c3947 commit f09656b

4 files changed

Lines changed: 77 additions & 12 deletions

File tree

src/services/iamPolicy/schema.graphql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ type awsIamJSONPolicyStatement
3333
effect: String @search(by: [hash, regexp])
3434
principal: [awsIamJSONPolicyPrincipal]
3535
resource: [String] @search(by: [hash])
36+
notAction: [String] @search(by: [hash])
37+
notPrincipal: [awsIamJSONPolicyPrincipal]
38+
notResource: [String] @search(by: [hash])
3639
}
3740

3841
type awsIamJSONPolicyCondition

src/types/generated.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3107,6 +3107,9 @@ export type AwsIamJsonPolicyStatement = {
31073107
condition?: Maybe<Array<Maybe<AwsIamJsonPolicyCondition>>>;
31083108
effect?: Maybe<Scalars['String']>;
31093109
id?: Maybe<Scalars['ID']>;
3110+
notAction?: Maybe<Array<Maybe<Scalars['String']>>>;
3111+
notPrincipal?: Maybe<Array<Maybe<AwsIamJsonPolicyPrincipal>>>;
3112+
notResource?: Maybe<Array<Maybe<Scalars['String']>>>;
31103113
principal?: Maybe<Array<Maybe<AwsIamJsonPolicyPrincipal>>>;
31113114
resource?: Maybe<Array<Maybe<Scalars['String']>>>;
31123115
};

src/types/index.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,35 @@ export interface RawAwsService {
1717
cgId: string
1818
accountId: string
1919
}
20+
21+
export interface RawAwsIamJsonPolicyStatementCondition {
22+
// Condition operator
23+
[key: string]: {
24+
// Condition key: Condition value
25+
[key: string]: string | number
26+
}
27+
}
28+
29+
export interface RawAwsIamJsonPolicyStatementPrincipal {
30+
[key: string]: string[]
31+
}
32+
33+
export interface RawAwsIamJsonPolicyStatement {
34+
Sid?: string
35+
Condition?: RawAwsIamJsonPolicyStatementCondition
36+
Effect: string
37+
Principal?: RawAwsIamJsonPolicyStatementPrincipal
38+
NotPrincipal?: RawAwsIamJsonPolicyStatementPrincipal
39+
Action?: string[]
40+
NotAction?: string[]
41+
Resource?: string[]
42+
NotResource?: string[]
43+
}
44+
45+
export interface RawAwsIamJsonPolicy {
46+
Version: string
47+
Id?: string
48+
Statement: RawAwsIamJsonPolicyStatement[]
49+
}
50+
51+
export * from './generated'

src/utils/format.ts

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,21 @@ import { parseString } from '@fast-csv/parse'
22
import CloudGraph, { generateUniqueId } from '@cloudgraph/sdk'
33
import isArray from 'lodash/isArray'
44
import toString from 'lodash/toString'
5-
import { AwsRawTag, AwsIamJsonPolicy } from '../types/generated'
6-
import { AwsTag, TagMap } from '../types'
5+
import {
6+
AwsRawTag,
7+
AwsIamJsonPolicy,
8+
AwsIamJsonPolicyCondition,
9+
AwsIamJsonPolicyPrincipal,
10+
AwsIamJsonPolicyStatement,
11+
} from '../types/generated'
12+
import {
13+
AwsTag,
14+
RawAwsIamJsonPolicy,
15+
RawAwsIamJsonPolicyStatement,
16+
RawAwsIamJsonPolicyStatementCondition,
17+
RawAwsIamJsonPolicyStatementPrincipal,
18+
TagMap,
19+
} from '../types'
720

821
const { logger } = CloudGraph
922

@@ -46,6 +59,7 @@ export const camelize = (key: string): string =>
4659
*/
4760
export const pascalize = (key: string): string => {
4861
const camelized = camelize(key)
62+
// TODO: Change to String.slice?
4963
return camelized.substr(0, 1).toUpperCase() + camelized.substr(1)
5064
}
5165

@@ -65,7 +79,7 @@ export const parseCSV = (csv: string): Promise<any[]> =>
6579
})
6680

6781
export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
68-
let object
82+
let object: RawAwsIamJsonPolicy
6983
try {
7084
object = JSON.parse(json.replace(/\\"/g, '"'))
7185
} catch (err) {
@@ -75,7 +89,9 @@ export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
7589
const statement = isArray(object.Statement)
7690
? object.Statement
7791
: [object.Statement]
78-
const formatCondition = condition => {
92+
const formatCondition = (
93+
condition: RawAwsIamJsonPolicyStatementCondition
94+
): AwsIamJsonPolicyCondition[] => {
7995
if (!condition) return null
8096
return Object.entries(condition).map(([key, value = {}]) => {
8197
const entry = Object.entries(value)[0] || []
@@ -88,7 +104,9 @@ export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
88104
})
89105
}
90106

91-
const formatPrincipal = principal => {
107+
const formatPrincipal = (
108+
principal: RawAwsIamJsonPolicyStatementPrincipal
109+
): AwsIamJsonPolicyPrincipal[] => {
92110
if (!principal) return null
93111
return Object.entries(principal).map(([key, value]) => {
94112
const conVal = (isArray(value) ? value : [value]) || []
@@ -102,12 +120,21 @@ export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
102120
return {
103121
id: generateUniqueId(json),
104122
version: object.Version,
105-
statement: statement.map(el => ({
106-
action: isArray(el.Action) ? el.Action : [toString(el.Action)],
107-
condition: formatCondition(el.Condition),
108-
effect: el.Effect,
109-
principal: formatPrincipal(el.Principal),
110-
resource: isArray(el.Resource) ? el.Resource : [toString(el.Resource)],
111-
})),
123+
statement: statement.map(
124+
(el: RawAwsIamJsonPolicyStatement): AwsIamJsonPolicyStatement => ({
125+
action: isArray(el.Action) ? el.Action : [toString(el.Action)],
126+
notAction: isArray(el.NotAction)
127+
? el.NotAction
128+
: [toString(el.NotAction)],
129+
condition: formatCondition(el.Condition),
130+
effect: el.Effect,
131+
principal: formatPrincipal(el.Principal),
132+
notPrincipal: formatPrincipal(el.NotPrincipal),
133+
resource: isArray(el.Resource) ? el.Resource : [toString(el.Resource)],
134+
notResource: isArray(el.NotResource)
135+
? el.NotResource
136+
: [toString(el.NotResource)],
137+
})
138+
),
112139
}
113140
}

0 commit comments

Comments
 (0)