use super::shape::{looks_like_prefixed_masked_sequence, RFC7519_EXAMPLE_JWT_PREFIX};
pub(super) enum MarkerVerdict {
Suppress(&'static str),
Allow,
KeepChecking,
}
fn upper_mentions_reserved_example_domain(upper: &str) -> bool {
upper.contains("EXAMPLE.COM") || upper.contains("EXAMPLE.ORG")
}
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>,
entropy_hint: Option<f64>,
) -> MarkerVerdict {
if crate::placeholder_words::contains_non_example_placeholder_word_with_entropy_hint(
credential,
upper,
entropy_hint,
) {
return MarkerVerdict::Suppress("placeholder_word");
}
if let Some(example) = crate::placeholder_words::example_word() {
if !from_evasion_decoder
&& (upper_contains_token(upper, example.upper())
|| upper.ends_with(example.upper())
|| upper_contains_token(upper, "EXAMPLEKEY")
|| upper.ends_with("EXAMPLEKEY"))
&& !upper_mentions_reserved_example_domain(upper)
{
return MarkerVerdict::Suppress("contains_EXAMPLE_token");
}
}
for frag in crate::placeholder_words::instructional_fragments() {
let frag = frag.as_str();
if upper.contains(frag) {
let mut positions = upper.match_indices(frag);
if positions.any(|(idx, _)| {
upper[..idx]
.chars()
.next_back()
.is_none_or(|c| !c.is_alphanumeric())
}) {
return MarkerVerdict::Suppress("instructional_fragment");
}
}
}
if upper_contains_token(upper, "TODO") || upper_contains_token(upper, "FIXME") {
return MarkerVerdict::Suppress("dev_marker_todo_fixme");
}
if credential.contains(RFC7519_EXAMPLE_JWT_PREFIX) {
return MarkerVerdict::Suppress("rfc7519_example_jwt");
}
if !from_evasion_decoder && !upper_mentions_reserved_example_domain(upper) {
for marker in crate::placeholder_words::doc_marker_substrings() {
let marker = marker.as_str();
if upper.contains(marker) {
if credential.starts_with("TESTKEY_")
&& (marker == "TESTKEY" || marker == "TEST_KEY")
{
continue;
}
return MarkerVerdict::Suppress("doc_marker_substring");
}
}
}
let known_prefix_body = crate::confidence::known_prefix_body(credential);
if let Some(body) = known_prefix_body {
if looks_like_prefixed_masked_sequence(body) {
return MarkerVerdict::Suppress("prefixed_masked_sequence");
}
if !credential.starts_with("TESTKEY_") {
return MarkerVerdict::Allow;
}
}
MarkerVerdict::KeepChecking
}