Skip to content

Commit 6d8478e

Browse files
authored
Merge pull request #94 from cloudgraphdev/fix/CG-1258
fix: add missing statement elements needed for the policy definitions
2 parents 65c3947 + 24b6ad4 commit 6d8478e

4 files changed

Lines changed: 75 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 | 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: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,19 @@ 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+
AwsTag,
12+
RawAwsIamJsonPolicy,
13+
RawAwsIamJsonPolicyStatement,
14+
RawAwsIamJsonPolicyStatementCondition,
15+
RawAwsIamJsonPolicyStatementPrincipal,
16+
TagMap,
17+
} from '../types'
718

819
const { logger } = CloudGraph
920

@@ -46,6 +57,7 @@ export const camelize = (key: string): string =>
4657
*/
4758
export const pascalize = (key: string): string => {
4859
const camelized = camelize(key)
60+
// TODO: Change to String.slice?
4961
return camelized.substr(0, 1).toUpperCase() + camelized.substr(1)
5062
}
5163

@@ -65,7 +77,7 @@ export const parseCSV = (csv: string): Promise<any[]> =>
6577
})
6678

6779
export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
68-
let object
80+
let object: RawAwsIamJsonPolicy
6981
try {
7082
object = JSON.parse(json.replace(/\\"/g, '"'))
7183
} catch (err) {
@@ -75,7 +87,9 @@ export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
7587
const statement = isArray(object.Statement)
7688
? object.Statement
7789
: [object.Statement]
78-
const formatCondition = condition => {
90+
const formatCondition = (
91+
condition: RawAwsIamJsonPolicyStatementCondition
92+
): AwsIamJsonPolicyCondition[] => {
7993
if (!condition) return null
8094
return Object.entries(condition).map(([key, value = {}]) => {
8195
const entry = Object.entries(value)[0] || []
@@ -88,7 +102,9 @@ export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
88102
})
89103
}
90104

91-
const formatPrincipal = principal => {
105+
const formatPrincipal = (
106+
principal: RawAwsIamJsonPolicyStatementPrincipal
107+
): AwsIamJsonPolicyPrincipal[] => {
92108
if (!principal) return null
93109
return Object.entries(principal).map(([key, value]) => {
94110
const conVal = (isArray(value) ? value : [value]) || []
@@ -102,12 +118,21 @@ export const formatIamJsonPolicy = (json: string): AwsIamJsonPolicy => {
102118
return {
103119
id: generateUniqueId(json),
104120
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-
})),
121+
statement: statement.map(
122+
(el: RawAwsIamJsonPolicyStatement): AwsIamJsonPolicyStatement => ({
123+
action: isArray(el.Action) ? el.Action : [toString(el.Action)],
124+
notAction: isArray(el.NotAction)
125+
? el.NotAction
126+
: [toString(el.NotAction)],
127+
condition: formatCondition(el.Condition),
128+
effect: el.Effect,
129+
principal: formatPrincipal(el.Principal),
130+
notPrincipal: formatPrincipal(el.NotPrincipal),
131+
resource: isArray(el.Resource) ? el.Resource : [toString(el.Resource)],
132+
notResource: isArray(el.NotResource)
133+
? el.NotResource
134+
: [toString(el.NotResource)],
135+
})
136+
),
112137
}
113138
}

0 commit comments

Comments
 (0)