123 lines
3.6 KiB
Python
123 lines
3.6 KiB
Python
#!/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()
|