mod github;
mod gitlab;
mod npm;
mod slack;
mod stripe;
pub use github::{GithubClassicPatValidator, GithubFineGrainedPatValidator};
pub use gitlab::GitlabTokenValidator;
pub use npm::{NpmTokenValidator, PypiTokenValidator};
pub use slack::SlackTokenValidator;
pub use stripe::StripeTokenValidator;
use std::sync::LazyLock;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum ChecksumResult {
Valid,
Invalid,
NotApplicable,
}
pub trait ChecksumValidator: Send + Sync {
fn validator_id(&self) -> &str;
fn validate(&self, credential: &str) -> ChecksumResult;
}
static VALIDATORS: LazyLock<Vec<Box<dyn ChecksumValidator>>> = LazyLock::new(|| {
vec![
Box::new(GithubClassicPatValidator),
Box::new(GithubFineGrainedPatValidator),
Box::new(NpmTokenValidator),
Box::new(SlackTokenValidator),
Box::new(PypiTokenValidator),
Box::new(StripeTokenValidator),
Box::new(GitlabTokenValidator),
]
});
pub fn validate_checksum(credential: &str) -> ChecksumResult {
for validator in VALIDATORS.iter() {
match validator.validate(credential) {
ChecksumResult::NotApplicable => continue,
result => return result,
}
}
ChecksumResult::NotApplicable
}
pub const CHECKSUM_VALID_FLOOR: f64 = 0.9;
#[inline]
pub fn checksum_adjusted_confidence(confidence: f64, credential: &str) -> Option<f64> {
match validate_checksum(credential) {
ChecksumResult::Invalid => None,
ChecksumResult::Valid => Some(confidence.max(CHECKSUM_VALID_FLOOR)),
ChecksumResult::NotApplicable => Some(confidence),
}
}
pub(crate) fn warm_runtime_regexes() {
slack::warm_runtime_regexes();
}