Skip to content

Protection API

TrustManager

from drogue.protection.trust import TrustManager, TrustLevel

manager = TrustManager(
    max_fingerprints=100000,
    trusted_ttl=14400.0,    # 4 hours
    standard_ttl=1800.0,    # 30 minutes
    score_threshold_trusted=0.2,
    score_threshold_standard=0.5,
)

# Update trust score (negative = suspicious, positive = good)
level = manager.update("fingerprint_abc", score=-0.1)
# TrustLevel.TRUSTED / STANDARD / SUSPICIOUS / BANNED

# Check trust level
level = manager.check("fingerprint_abc")

# Get state
state = manager.get_state("fingerprint_abc")
# TrustState(level=TrustLevel.STANDARD, score=0.5, ...)

# Check by level
assert manager.is_trusted("fingerprint_abc") == True
assert manager.is_banned("fingerprint_abc") == False

# Manual ban
manager.ban("fingerprint_abc")

# Poison (mark as threat)
manager.poison("fingerprint_abc")

# Stats
stats = manager.get_stats()

ProgressiveBanManager

from drogue.protection.ban import ProgressiveBanManager

manager = ProgressiveBanManager(
    threshold=5,           # violations before ban
    window=300.0,          # violation window (seconds)
    max_violations=20,
    escalation=[60, 300, 900, 3600, 7200, 14400],  # durations per level
)

# Record a violation
count = manager.record_violation("192.168.1.1")

# Check ban status
is_banned = manager.is_banned("192.168.1.1")

# Get ban details
ban = manager.get_ban("192.168.1.1")
# BanEntry(key='192.168.1.1', level=1, banned_at=..., expires_at=..., violation_count=5)

level = manager.get_ban_level("192.168.1.1")
retry_after = manager.get_retry_after("192.168.1.1")

# Clear
manager.clear_ban("192.168.1.1")
manager.clear_all()

CircuitBreaker

from drogue.protection.circuit import CircuitBreaker

breaker = CircuitBreaker(
    failure_threshold=5,
    recovery_timeout=30.0,
    jitter=0.2,
    half_open_max_calls=1,
)

# Check if request is allowed
if breaker.allow_request():
    try:
        result = do_work()
        breaker.record_success()
    except Exception:
        breaker.record_failure()

# Get status
status = breaker.get_status()
# {"state": "closed", "failure_count": 0, ...}

# Manual reset
breaker.reset()

DDoSDetector

from drogue.protection.ddos import DDoSDetector

detector = DDoSDetector(
    window=60.0,
    z_threshold=3.0,
    min_samples=100,
    bucket_size=1.0,
    max_clients=10000,
)

# Record HTTP traffic
detector.record("192.168.1.1")

# Record WebSocket traffic
detector.record_ws("client_abc")

# Check anomalies
is_anomalous = detector.is_anomalous("192.168.1.1")
is_http = detector.is_http_anomalous("192.168.1.1")
is_ws = detector.is_ws_anomalous("client_abc")

# Get rates
rate = detector.get_client_rate("192.168.1.1")
global_rate = detector.get_global_rate()

# Stats
stats = detector.get_stats()

ProbeDetector

from drogue.protection.probes import ProbeDetector

detector = ProbeDetector(
    window=300.0,
    probe_threshold=3,
    min_error_rate=0.5,
    max_time_span=60.0,
    threat_boost=0.3,
    max_clients=10000,
)

# Record requests
detector.record("scanner.ip", "/page1", status_code=200, method="GET")

# Check if client is probing
is_probing = detector.is_probing("scanner.ip")

# Get signal details
signal = detector.get_signal("scanner.ip")

# Threat boost (0.0 to 1.0)
boost = detector.get_threat_boost("scanner.ip")

# Cleanup
detector.clear_client("scanner.ip")
detector.clear_all()

CIDRFilter

from drogue.protection.cidr import CIDRFilter

cidr = CIDRFilter(
    allowlist=["192.168.0.0/16"],
    denylist=["185.220.101.0/24"],
)

# Add/remove
cidr.add_to_allowlist("10.0.0.0/8")
cidr.add_to_denylist("2001:db8::/32")
cidr.remove_from_allowlist("10.0.0.0/8")

# Check
is_allowed = cidr.is_allowed("192.168.1.1")
is_denied = cidr.is_denied("185.220.101.50")

# Load from file
count = cidr.load_from_file("blocked_ips.txt", list_type="denylist")

# Stats
stats = cidr.get_stats()

AdaptiveRateLimiter

from drogue.protection.adaptive import AdaptiveRateLimiter

limiter = AdaptiveRateLimiter(
    cpu_threshold=0.8,
    memory_threshold=0.8,
    latency_threshold=1.0,
    check_interval=5.0,
)

# Get effective limit under load
effective = limiter.get_effective_limit(base_limit=1000)

# Record latency for adaptive scaling
limiter.record_latency(0.05)

# Get current metrics
metrics = limiter.get_metrics()
# {"cpu_percent": 65.2, "memory_percent": 72.1, ...}