Initial stub: models, generator, parser, explainer, and demo
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
|
||||
from iriusrisk_drl_toolkit.models import (
|
||||
RelationRule,
|
||||
Activity,
|
||||
SvgObject,
|
||||
SvgRelation,
|
||||
)
|
||||
from iriusrisk_drl_toolkit.generator import generate_drl
|
||||
from iriusrisk_drl_toolkit.parser import parse_relation_rule
|
||||
from iriusrisk_drl_toolkit.explainer import evaluate_rule
|
||||
|
||||
|
||||
def demo():
|
||||
rule = RelationRule(
|
||||
name="Create threat when process connects to database",
|
||||
source_type="process",
|
||||
relation_type="connects_to",
|
||||
target_type="database",
|
||||
activity=Activity(
|
||||
kind="CREATE_THREAT",
|
||||
value="SQL Injection",
|
||||
),
|
||||
salience=50,
|
||||
no_loop=False,
|
||||
origin="custom",
|
||||
editable=True,
|
||||
)
|
||||
|
||||
drl = generate_drl(rule, package_name="com.acme.iriusrisk.custom")
|
||||
print("=== GENERATED DRL ===")
|
||||
print(drl)
|
||||
|
||||
parsed = parse_relation_rule(drl)
|
||||
print("=== PARSED RULE ===")
|
||||
print(parsed)
|
||||
print()
|
||||
|
||||
src = SvgObject(id="A1", type="process", label="Backend API")
|
||||
rel = SvgRelation(source_id="A1", target_id="B1", relation_type="connects_to")
|
||||
dst = SvgObject(id="B1", type="database", label="Customer DB")
|
||||
|
||||
result = evaluate_rule(parsed, src, rel, dst)
|
||||
print("=== EVALUATION (matching) ===")
|
||||
print(f"Applies: {result.applies}")
|
||||
print(f"Reasons: {result.reasons}")
|
||||
print(f"Failed: {result.failed}")
|
||||
print(f"JSON: {json.dumps({'applies': result.applies, 'reasons': result.reasons, 'failed': result.failed}, indent=2)}")
|
||||
print()
|
||||
|
||||
src2 = SvgObject(id="A1", type="service", label="Auth Service")
|
||||
dst2 = SvgObject(id="B2", type="queue", label="Event Queue")
|
||||
|
||||
result2 = evaluate_rule(parsed, src2, rel, dst2)
|
||||
print("=== EVALUATION (non-matching) ===")
|
||||
print(f"Applies: {result2.applies}")
|
||||
print(f"Reasons: {result2.reasons}")
|
||||
print(f"Failed: {result2.failed}")
|
||||
print(f"JSON: {json.dumps({'applies': result2.applies, 'reasons': result2.reasons, 'failed': result2.failed}, indent=2)}")
|
||||
print()
|
||||
|
||||
platform_drl = """package com.iriusrisk.platform
|
||||
|
||||
import com.iriusrisk.model.Component
|
||||
import com.iriusrisk.model.Relation
|
||||
import com.iriusrisk.actions.RuleActions
|
||||
|
||||
rule "Vendor: create countermeasure for public endpoint"
|
||||
salience 100
|
||||
when
|
||||
$rel : Relation(
|
||||
relationType == "exposes",
|
||||
$srcId : sourceId,
|
||||
$dstId : targetId
|
||||
)
|
||||
|
||||
$src : Component(
|
||||
id == $srcId,
|
||||
type == "load_balancer"
|
||||
)
|
||||
|
||||
$dst : Component(
|
||||
id == $dstId,
|
||||
type == "endpoint"
|
||||
)
|
||||
then
|
||||
RuleActions.createActivity(
|
||||
"CREATE_COUNTERMEASURE",
|
||||
$dst,
|
||||
"WAF"
|
||||
);
|
||||
end"""
|
||||
|
||||
platform_rule = parse_relation_rule(
|
||||
platform_drl,
|
||||
origin="platform",
|
||||
editable=False,
|
||||
)
|
||||
print("=== PLATFORM RULE (greyed out in UI) ===")
|
||||
print(f"Name: {platform_rule.name}")
|
||||
print(f"Origin: {platform_rule.origin}")
|
||||
print(f"Editable: {platform_rule.editable}")
|
||||
print(f"Source type: {platform_rule.source_type}")
|
||||
print(f"Relation type: {platform_rule.relation_type}")
|
||||
print(f"Target type: {platform_rule.target_type}")
|
||||
print(f"Activity: {platform_rule.activity}")
|
||||
print()
|
||||
|
||||
print("=== ROUND-TRIP VERIFICATION ===")
|
||||
assert parsed.name == rule.name
|
||||
assert parsed.source_type == rule.source_type
|
||||
assert parsed.relation_type == rule.relation_type
|
||||
assert parsed.target_type == rule.target_type
|
||||
assert parsed.activity.kind == rule.activity.kind
|
||||
assert parsed.activity.value == rule.activity.value
|
||||
assert parsed.salience == rule.salience
|
||||
print("All assertions passed — round-trip is clean.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
demo()
|
||||
Reference in New Issue
Block a user