use crate::header::CborValue;
use std::collections::BTreeMap;
pub mod keys {
use crate::constants::cat_keys;
pub const CATREPLAY: i32 = cat_keys::CATREPLAY;
pub const CATPOR: i32 = cat_keys::CATPOR;
pub const CATV: i32 = cat_keys::CATV;
pub const CATNIP: i32 = cat_keys::CATNIP;
pub const CATU: i32 = cat_keys::CATU;
pub const CATM: i32 = cat_keys::CATM;
pub const CATALPN: i32 = cat_keys::CATALPN;
pub const CATH: i32 = cat_keys::CATH;
pub const CATGEOISO3166: i32 = cat_keys::CATGEOISO3166;
pub const CATGEOCOORD: i32 = cat_keys::CATGEOCOORD;
pub const CATGEOALT: i32 = cat_keys::CATGEOALT;
pub const CATTPK: i32 = cat_keys::CATTPK;
pub const CATIFDATA: i32 = cat_keys::CATIFDATA;
pub const CATDPOP: i32 = cat_keys::CATDPOP;
pub const CATIF: i32 = cat_keys::CATIF;
pub const CATR: i32 = cat_keys::CATR;
pub const CATTPRINT: i32 = cat_keys::CATTPRINT;
}
pub mod cattprint {
use super::*;
use crate::{constants::tprint_params, FingerprintType};
pub fn create(fingerprint_type: FingerprintType, fingerprint_value: &str) -> CborValue {
let mut params = BTreeMap::new();
params.insert(tprint_params::FINGERPRINT_TYPE, CborValue::Integer(fingerprint_type as i64));
params.insert(tprint_params::FINGERPRINT_VALUE, CborValue::Text(fingerprint_value.to_string()));
CborValue::Map(params)
}
}
pub mod catu {
use super::*;
use crate::constants::match_types;
pub fn create(components: BTreeMap<i32, BTreeMap<i32, CborValue>>) -> CborValue {
let mut map = BTreeMap::new();
for (component_key, match_map) in components {
let mut inner_map = BTreeMap::new();
for (match_type, match_value) in match_map {
inner_map.insert(match_type, match_value);
}
map.insert(component_key, CborValue::Map(inner_map));
}
CborValue::Map(map)
}
pub fn exact_match(text: &str) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(match_types::EXACT, CborValue::Text(text.to_string()));
map
}
pub fn prefix_match(prefix: &str) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(match_types::PREFIX, CborValue::Text(prefix.to_string()));
map
}
pub fn suffix_match(suffix: &str) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(match_types::SUFFIX, CborValue::Text(suffix.to_string()));
map
}
pub fn contains_match(text: &str) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(match_types::CONTAINS, CborValue::Text(text.to_string()));
map
}
pub fn regex_match(pattern: &str, groups: Vec<Option<String>>) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
let mut array = vec![CborValue::Text(pattern.to_string())];
for group in groups {
match group {
Some(text) => array.push(CborValue::Text(text)),
None => array.push(CborValue::Null),
}
}
map.insert(match_types::REGEX, CborValue::Array(array));
map
}
pub fn sha256_match(hash: Vec<u8>) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(match_types::SHA256, CborValue::Bytes(hash));
map
}
pub fn sha512_256_match(hash: Vec<u8>) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(match_types::SHA512_256, CborValue::Bytes(hash));
map
}
}
pub mod catr {
use super::*;
use crate::constants::{renewal_params, renewal_types};
pub fn create(params: BTreeMap<i32, CborValue>) -> CborValue {
CborValue::Map(params)
}
pub fn automatic_renewal(exp_add: i64, deadline: Option<i64>) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(
renewal_params::TYPE,
CborValue::Integer(renewal_types::AUTOMATIC as i64),
);
map.insert(renewal_params::EXPADD, CborValue::Integer(exp_add));
if let Some(deadline_value) = deadline {
map.insert(renewal_params::DEADLINE, CborValue::Integer(deadline_value));
}
map
}
pub fn cookie_renewal(
exp_add: i64,
deadline: Option<i64>,
cookie_name: Option<&str>,
additional_params: Option<Vec<&str>>,
) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(
renewal_params::TYPE,
CborValue::Integer(renewal_types::COOKIE as i64),
);
map.insert(renewal_params::EXPADD, CborValue::Integer(exp_add));
if let Some(deadline_value) = deadline {
map.insert(renewal_params::DEADLINE, CborValue::Integer(deadline_value));
}
if let Some(name) = cookie_name {
map.insert(
renewal_params::COOKIE_NAME,
CborValue::Text(name.to_string()),
);
}
if let Some(params) = additional_params {
let params_array: Vec<CborValue> = params
.into_iter()
.map(|s| CborValue::Text(s.to_string()))
.collect();
map.insert(
renewal_params::COOKIE_PARAMS,
CborValue::Array(params_array),
);
}
map
}
pub fn header_renewal(
exp_add: i64,
deadline: Option<i64>,
header_name: Option<&str>,
additional_params: Option<Vec<&str>>,
) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(
renewal_params::TYPE,
CborValue::Integer(renewal_types::HEADER as i64),
);
map.insert(renewal_params::EXPADD, CborValue::Integer(exp_add));
if let Some(deadline_value) = deadline {
map.insert(renewal_params::DEADLINE, CborValue::Integer(deadline_value));
}
if let Some(name) = header_name {
map.insert(
renewal_params::HEADER_NAME,
CborValue::Text(name.to_string()),
);
}
if let Some(params) = additional_params {
let params_array: Vec<CborValue> = params
.into_iter()
.map(|s| CborValue::Text(s.to_string()))
.collect();
map.insert(
renewal_params::HEADER_PARAMS,
CborValue::Array(params_array),
);
}
map
}
pub fn redirect_renewal(
exp_add: i64,
deadline: Option<i64>,
status_code: Option<i64>,
) -> BTreeMap<i32, CborValue> {
let mut map = BTreeMap::new();
map.insert(
renewal_params::TYPE,
CborValue::Integer(renewal_types::REDIRECT as i64),
);
map.insert(renewal_params::EXPADD, CborValue::Integer(exp_add));
if let Some(deadline_value) = deadline {
map.insert(renewal_params::DEADLINE, CborValue::Integer(deadline_value));
}
if let Some(code) = status_code {
map.insert(renewal_params::STATUS_CODE, CborValue::Integer(code));
}
map
}
}
pub mod catm {
use super::*;
pub fn create(methods: Vec<&str>) -> Vec<CborValue> {
methods
.into_iter()
.map(|s| CborValue::Text(s.to_string()))
.collect()
}
}
pub mod catreplay {
use super::*;
use crate::constants::replay_values;
pub fn create(value: i32) -> CborValue {
CborValue::Integer(value as i64)
}
pub fn permitted() -> CborValue {
CborValue::Integer(replay_values::PERMITTED as i64)
}
pub fn prohibited() -> CborValue {
CborValue::Integer(replay_values::PROHIBITED as i64)
}
pub fn reuse_detection() -> CborValue {
CborValue::Integer(replay_values::REUSE_DETECTION as i64)
}
}
pub mod catv {
use super::*;
pub fn create() -> CborValue {
CborValue::Integer(1)
}
pub fn with_version(version: i64) -> CborValue {
CborValue::Integer(version)
}
}
pub mod catpor {
use super::*;
pub fn create(probability_percent: i64) -> CborValue {
CborValue::Integer(probability_percent)
}
}
pub mod catnip {
use super::*;
pub fn create(ip_addresses: Vec<&str>) -> Vec<CborValue> {
ip_addresses
.into_iter()
.map(|ip| CborValue::Text(ip.to_string()))
.collect()
}
pub fn single(ip_address: &str) -> Vec<CborValue> {
vec![CborValue::Text(ip_address.to_string())]
}
}
pub mod catalpn {
use super::*;
pub fn create(protocols: Vec<&str>) -> Vec<CborValue> {
protocols
.into_iter()
.map(|proto| CborValue::Text(proto.to_string()))
.collect()
}
pub fn http2_only() -> Vec<CborValue> {
vec![CborValue::Text("h2".to_string())]
}
pub fn http1_only() -> Vec<CborValue> {
vec![CborValue::Text("http/1.1".to_string())]
}
}
pub mod cath {
use super::*;
pub fn create(headers: BTreeMap<&str, &str>) -> CborValue {
let mut map = BTreeMap::new();
for (i, (key, value)) in headers.iter().enumerate() {
let mut header_map = BTreeMap::new();
header_map.insert(0, CborValue::Text(key.to_string()));
header_map.insert(1, CborValue::Text(value.to_string()));
map.insert(i as i32, CborValue::Map(header_map));
}
CborValue::Map(map)
}
}
pub mod catgeoiso3166 {
use super::*;
pub fn create(country_codes: Vec<&str>) -> Vec<CborValue> {
country_codes
.into_iter()
.map(|code| CborValue::Text(code.to_string()))
.collect()
}
}
pub mod catgeocoord {
use super::*;
pub fn create(latitude: f64, longitude: f64) -> CborValue {
let mut map = BTreeMap::new();
map.insert(0, CborValue::Integer((latitude * 10_000_000.0) as i64));
map.insert(1, CborValue::Integer((longitude * 10_000_000.0) as i64));
CborValue::Map(map)
}
pub fn with_radius(latitude: f64, longitude: f64, radius_meters: i64) -> CborValue {
let mut map = BTreeMap::new();
map.insert(0, CborValue::Integer((latitude * 10_000_000.0) as i64));
map.insert(1, CborValue::Integer((longitude * 10_000_000.0) as i64));
map.insert(2, CborValue::Integer(radius_meters));
CborValue::Map(map)
}
}
pub mod catgeoalt {
use super::*;
pub fn create(altitude_meters: i64) -> CborValue {
CborValue::Integer(altitude_meters)
}
pub fn range(min_meters: i64, max_meters: i64) -> CborValue {
let mut map = BTreeMap::new();
map.insert(0, CborValue::Integer(min_meters));
map.insert(1, CborValue::Integer(max_meters));
CborValue::Map(map)
}
}
pub mod cattpk {
use super::*;
pub fn create(public_key_hash: Vec<u8>) -> CborValue {
CborValue::Bytes(public_key_hash)
}
pub fn multiple(public_key_hashes: Vec<Vec<u8>>) -> Vec<CborValue> {
public_key_hashes
.into_iter()
.map(CborValue::Bytes)
.collect()
}
}
pub mod catdpop {
use super::*;
pub fn create(config: BTreeMap<i32, CborValue>) -> CborValue {
CborValue::Map(config)
}
pub fn required() -> CborValue {
let mut map = BTreeMap::new();
map.insert(0, CborValue::Integer(1)); CborValue::Map(map)
}
}
pub mod catif {
use super::*;
pub fn create(condition: BTreeMap<i32, CborValue>) -> CborValue {
CborValue::Map(condition)
}
}
pub mod catifdata {
use super::*;
pub fn create(data: BTreeMap<i32, CborValue>) -> CborValue {
CborValue::Map(data)
}
}