use crate::transformations::bot_detection::cloudflare_challenge_variation;
use crate::transformations::case::{case_swap, randomize_capitalization};
use crate::transformations::cloudflare::{
cloudflare_challenge_response, cloudflare_turnstile_variation,
};
use crate::transformations::encoding::{base64_encode, hex_encode, url_encode};
use crate::transformations::obfuscation::{leetspeak, rot13};
use crate::transformations::phishing::{advanced_domain_spoof, email_obfuscation};
use crate::transformations::shell::{bash_obfuscate, powershell_obfuscate};
use crate::transformations::unicode::homoglyph_substitution;
use crate::transformations::web_security::graphql_obfuscate;
pub struct TransformBuilder {
text: String,
}
impl TransformBuilder {
pub fn new(input: &str) -> Self {
Self {
text: input.to_string(),
}
}
pub fn leetspeak(mut self) -> Self {
self.text = leetspeak(&self.text);
self
}
pub fn base64(mut self) -> Self {
self.text = base64_encode(&self.text);
self
}
pub fn url_encode(mut self) -> Self {
self.text = url_encode(&self.text);
self
}
pub fn redstrs(mut self) -> Self {
self.text = randomize_capitalization(&self.text);
self
}
pub fn homoglyphs(mut self) -> Self {
self.text = homoglyph_substitution(&self.text);
self
}
pub fn case_swap(mut self) -> Self {
self.text = case_swap(&self.text);
self
}
pub fn hex_encode(mut self) -> Self {
self.text = hex_encode(&self.text);
self
}
pub fn rot13(mut self) -> Self {
self.text = rot13(&self.text);
self
}
pub fn advanced_domain_spoof(mut self) -> Self {
self.text = advanced_domain_spoof(&self.text);
self
}
pub fn email_obfuscation(mut self) -> Self {
self.text = email_obfuscation(&self.text);
self
}
pub fn powershell_obfuscate(mut self) -> Self {
self.text = powershell_obfuscate(&self.text);
self
}
pub fn bash_obfuscate(mut self) -> Self {
self.text = bash_obfuscate(&self.text);
self
}
pub fn cloudflare_challenge(mut self) -> Self {
self.text = cloudflare_challenge_variation(&self.text);
self
}
pub fn cloudflare_turnstile(mut self) -> Self {
self.text = cloudflare_turnstile_variation(&self.text);
self
}
pub fn cloudflare_challenge_response(mut self) -> Self {
self.text = cloudflare_challenge_response(&self.text);
self
}
pub fn graphql_obfuscate(mut self) -> Self {
self.text = graphql_obfuscate(&self.text);
self
}
pub fn build(self) -> String {
self.text
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transform_builder() {
let result = TransformBuilder::new("test").leetspeak().build();
assert!(result.len() > 0);
let result2 = TransformBuilder::new("hello").redstrs().base64().build();
assert!(result2.len() > 0);
}
#[test]
fn test_transform_builder_new_functions() {
let result = TransformBuilder::new("paypal.com")
.advanced_domain_spoof()
.build();
assert!(result.len() > 0);
let result2 = TransformBuilder::new("admin@example.com")
.email_obfuscation()
.build();
assert!(result2.contains("@"));
let result3 = TransformBuilder::new("Get-Process")
.powershell_obfuscate()
.build();
assert!(result3.len() > 0);
}
#[test]
fn test_transform_builder_cloudflare_functions() {
let result = TransformBuilder::new("challenge-token")
.cloudflare_turnstile()
.build();
assert!(result.len() > 0);
assert!(result.contains("challenge-token"));
let result2 = TransformBuilder::new("cf_clearance=abc123")
.cloudflare_challenge_response()
.build();
assert!(result2.len() > 0);
assert!(
result2.to_lowercase().contains("cf_clearance")
|| result2.to_lowercase().contains("cf-clearance")
);
let result3 = TransformBuilder::new("test")
.cloudflare_turnstile()
.cloudflare_challenge_response()
.build();
assert!(result3.len() > 0);
}
}