cribra 0.2.0

Privacy-first Rust core for detecting, querying, and safely transforming secrets and sensitive data
Documentation
//! Public semantic-template transformation tests.

use cribra::{
    Rule, Scanner, Severity,
    transform::{TemplateOptions, template, template_with},
};

#[test]
fn public_template_uses_rule_identity_not_secret_value() {
    let scanner = Scanner::builder()
        .rule(Rule::literal(
            "example.credential",
            "SECRET",
            Severity::High,
        ))
        .build()
        .expect("scanner should build");

    let source = "TOKEN=SECRET";
    let results = scanner.scan([("memory", source)]);
    let report = results.single_report().expect("one report");

    let transformed = template(source, report).unwrap();

    assert_eq!(transformed, "TOKEN=<CRIBRA:example.credential>",);
    assert!(!transformed.contains("SECRET"));
}

#[test]
fn public_template_can_number_repeated_semantic_findings() {
    let scanner = Scanner::builder()
        .rule(Rule::literal("secret", "SECRET", Severity::High))
        .build()
        .expect("scanner should build");

    let source = "A=SECRET B=SECRET";
    let results = scanner.scan([("memory", source)]);
    let report = results.single_report().expect("one report");
    let options = TemplateOptions::new().numbered(true);

    assert_eq!(
        template_with(source, report, &options).unwrap(),
        "A=<CRIBRA:secret:1> B=<CRIBRA:secret:2>",
    );
}

#[test]
fn public_template_rejects_ambiguous_overlaps() {
    let scanner = Scanner::builder()
        .rule(Rule::literal("short", "github", Severity::Low))
        .rule(Rule::literal("long", "github_pat", Severity::High))
        .build()
        .expect("scanner should build");

    let source = "github_pat_value";
    let results = scanner.scan([("memory", source)]);
    let report = results.single_report().expect("one report");

    assert!(template(source, report).is_err());
}