use super::shape_gates::{
known_prefix_body, looks_like_prefixed_masked_sequence, RFC7519_EXAMPLE_JWT_PREFIX,
};
pub(super) enum MarkerVerdict {
Suppress,
Allow,
KeepChecking,
}
pub(super) fn upper_contains_token(upper: &str, token: &str) -> bool {
upper.match_indices(token).any(|(idx, _)| {
let before = upper[..idx].chars().next_back();
let after = upper[idx + token.len()..].chars().next();
before.is_none_or(|c| !c.is_alphanumeric()) && after.is_none_or(|c| !c.is_alphanumeric())
})
}
pub(super) fn check_markers(
credential: &str,
upper: &str,
from_evasion_decoder: bool,
path: Option<&str>,
) -> MarkerVerdict {
const PLACEHOLDER_WORDS: &[&str] = &["DUMMY", "PLACEHOLDER", "FAKE", "MOCK", "SAMPLE"];
for word in PLACEHOLDER_WORDS {
if upper_contains_token(upper, word) {
return MarkerVerdict::Suppress;
}
}
if !from_evasion_decoder
&& (upper_contains_token(upper, "EXAMPLE")
|| upper.ends_with("EXAMPLE")
|| upper_contains_token(upper, "EXAMPLEKEY")
|| upper.ends_with("EXAMPLEKEY"))
&& !credential.contains("example.com")
&& !credential.contains("example.org")
{
crate::telemetry::record_example_suppression(
"pipeline",
path,
credential,
"contains_EXAMPLE_token",
);
return MarkerVerdict::Suppress;
}
const INSTRUCTIONAL_FRAGMENTS: &[&str] = &["YOUR_", "YOUR-", "INSERT", "CHANGE", "REPLACE"];
for frag in INSTRUCTIONAL_FRAGMENTS {
if upper.contains(frag) {
let mut positions = upper.match_indices(frag);
if positions.any(|(idx, _)| {
idx == 0
|| upper
.chars()
.nth(idx - 1)
.is_none_or(|c| !c.is_alphanumeric())
}) {
return MarkerVerdict::Suppress;
}
}
}
if upper_contains_token(upper, "TODO") || upper_contains_token(upper, "FIXME") {
return MarkerVerdict::Suppress;
}
if credential.contains(RFC7519_EXAMPLE_JWT_PREFIX) {
return MarkerVerdict::Suppress;
}
let known_prefix_body = known_prefix_body(credential);
if let Some(body) = known_prefix_body {
if looks_like_prefixed_masked_sequence(body) {
return MarkerVerdict::Suppress;
}
if !credential.starts_with("TESTKEY_") {
return MarkerVerdict::Allow;
}
}
const DOC_MARKER_SUBSTRINGS: &[&str] = &[
"EXAMPLE",
"PLACEHOLDER",
"NOT_A_REAL",
"NOTAREAL",
"INSERT_TOKEN_HERE",
"INSERT-TOKEN-HERE",
"CHANGE-ME",
"CHANGEME",
"REPLACE_ME",
"REPLACEME",
"REDACTED",
"FAKE_KEY",
"FAKEKEY",
"TEST_KEY",
"TESTKEY",
"SAMPLE_KEY",
"SAMPLEKEY",
];
if !from_evasion_decoder
&& !credential.contains("example.com")
&& !credential.contains("example.org")
{
for marker in DOC_MARKER_SUBSTRINGS {
if upper.contains(marker) {
if credential.starts_with("TESTKEY_")
&& (*marker == "TESTKEY" || *marker == "TEST_KEY")
{
continue;
}
return MarkerVerdict::Suppress;
}
}
}
MarkerVerdict::KeepChecking
}