Skip to content

Commit 251a31f

Browse files
author
Marco Franceschi
committed
fix: Avoided rule duplication using schema connections
1 parent 4f771a6 commit 251a31f

File tree

7 files changed

+15
-48
lines changed

7 files changed

+15
-48
lines changed

src/plugins/policyPack/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
StorageEngine,
1212
} from '../..'
1313
import RulesEngine from '../../rules-engine'
14-
import { Result, Severity } from '../../rules-engine/types'
14+
import { Result, Rule, Severity } from '../../rules-engine/types'
1515
import Plugin, { ConfiguredPlugin, PluginManager } from '../types'
1616

1717
export default class PolicyPackPlugin extends Plugin {
@@ -57,7 +57,7 @@ export default class PolicyPackPlugin extends Plugin {
5757
[policyPackName: string]: {
5858
engine: Engine
5959
entity: string
60-
rules: any
60+
rules: Rule[]
6161
}
6262
} = {}
6363

src/rules-engine/evaluators/js-evaluator.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,17 @@ export default class JsEvaluator implements RuleEvaluator<JsRule> {
1717
rule: JsRule,
1818
data: ResourceData
1919
): Promise<RuleFinding> {
20+
const { gql, check, resource, ...ruleMetadata } = rule
2021
const result = rule.check!(data)
2122
? RuleResult.MATCHES
2223
: RuleResult.DOESNT_MATCH
2324

2425
const finding = {
2526
id: `${rule.id}/${data.resource?.id}`,
26-
ruleId: rule.id,
2727
resourceId: data.resource?.id,
2828
result: result !== RuleResult.MATCHES ? Result.FAIL : Result.PASS,
29-
severity: rule.severity,
30-
description: rule.description,
31-
title: rule.title,
32-
rationale: rule.rationale,
33-
audit: rule.audit,
34-
remediation: rule.remediation,
35-
references: rule.references,
3629
typename: data.resource?.__typename, // eslint-disable-line no-underscore-dangle
30+
rule: ruleMetadata,
3731
} as RuleFinding
3832

3933
return finding

src/rules-engine/evaluators/json-evaluator.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,17 @@ export default class JsonEvaluator implements RuleEvaluator<JsonRule> {
2222
rule: JsonRule,
2323
data: ResourceData
2424
): Promise<RuleFinding> {
25+
const { gql, conditions, resource, ...ruleMetadata } = rule
2526
const result = (await this.evaluateCondition(rule.conditions, data))
2627
? RuleResult.MATCHES
2728
: RuleResult.DOESNT_MATCH
2829

2930
const finding = {
3031
id: `${rule.id}/${data.resource?.id}`,
31-
ruleId: rule.id,
3232
resourceId: data.resource?.id,
3333
result: result !== RuleResult.MATCHES ? Result.FAIL : Result.PASS,
34-
severity: rule.severity,
35-
description: rule.description,
36-
title: rule.title,
37-
rationale: rule.rationale,
38-
audit: rule.audit,
39-
remediation: rule.remediation,
40-
references: rule.references,
4134
typename: data.resource?.__typename, // eslint-disable-line no-underscore-dangle
35+
rule: ruleMetadata,
4236
} as RuleFinding
4337

4438
return finding

src/rules-engine/evaluators/manual-evaluator.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,9 @@ export default class ManualEvaluator implements RuleEvaluator<JsonRule> {
99
async evaluateSingleResource(rule: Rule): Promise<RuleFinding> {
1010
return {
1111
id: `${rule.id}/manual`,
12-
ruleId: rule.id,
1312
result: Result.SKIPPED,
14-
severity: rule.severity,
15-
description: rule.description,
16-
title: rule.title,
17-
rationale: rule.rationale,
18-
audit: rule.audit,
19-
remediation: rule.remediation,
20-
references: rule.references,
2113
typename: 'manual',
14+
rule,
2215
} as RuleFinding
2316
}
2417
}

src/rules-engine/index.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,22 +215,25 @@ export default class RulesProvider implements Engine {
215215
this.entityName
216216
}Findings]
217217
}
218-
interface baseFinding {
219-
id: String! @id
220-
ruleId: String! @search(by: [hash, regexp])
221-
resourceId: String @search(by: [hash, regexp])
218+
type ruleMetadata @key(fields: "id") {
219+
id: String! @id @search(by: [hash, regexp])
222220
severity: String! @search(by: [hash, regexp])
223221
description: String! @search(by: [hash, regexp])
224222
title: String @search(by: [hash, regexp])
225223
audit: String @search(by: [hash, regexp])
226224
rationale: String @search(by: [hash, regexp])
227225
remediation: String @search(by: [hash, regexp])
228226
references: [String] @search(by: [hash, regexp])
227+
}
228+
interface baseFinding {
229+
id: String! @id
230+
resourceId: String @search(by: [hash, regexp])
231+
rule: ruleMetadata
229232
result: FindingsResult @search
230233
}
231234
type ${this.providerName}${
232235
this.entityName
233-
}Findings implements baseFinding @key(fields: "id") {
236+
}Findings implements baseFinding @key(fields: "id") {
234237
findings: ${this.providerName}Findings @hasInverse(field: ${
235238
this.entityName
236239
}Findings)

src/rules-engine/types.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,8 @@ export interface Rule {
5353
}
5454
export interface RuleFinding {
5555
id: string
56-
title: string
57-
ruleId: string
5856
resourceId?: string
5957
result: Result
60-
severity: Severity
61-
description: string
62-
rationale?: string
63-
audit?: string
64-
remediation?: string
65-
references?: string[]
6658
typename: string
6759
}
6860

tests/rules-engine.test.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,28 +55,19 @@ describe('RulesEngine', () => {
5555
})
5656

5757
it('Should pass preparing the mutations to insert findings data given a RuleFindings array', () => {
58-
const ruleId = cuid()
5958
const resourceId = cuid()
6059
const data = [
6160
{
6261
id: cuid(),
63-
ruleId,
6462
resourceId,
6563
result: Result.FAIL,
66-
severity: Severity.MEDIUM,
6764
typename: 'querySchemaA',
68-
description: '',
69-
title: '',
7065
},
7166
{
7267
id: cuid(),
73-
ruleId,
7468
resourceId,
7569
result: Result.PASS,
76-
severity: Severity.LOW,
7770
typename: 'querySchemaA',
78-
description: '',
79-
title: '',
8071
},
8172
]
8273

0 commit comments

Comments
 (0)