Files
iriusrisk-drl-toolkit/demo.py
T

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()