perimeterx_fastly_enforcer/modules/
pxconstants.rs

1use serde::Serialize;
2use std::fmt;
3use std::str::FromStr;
4
5// PerimeterX mobile headers
6pub const MOBILE_SDK_HEADER: &str = "x-px-authorization";
7pub const MOBILE_SDK_ORIGINAL_TOKEN_HEADER: &str = "x-px-original-token";
8pub const RISK_API: &str = "/api/v3/risk";
9pub const ACTIVITY_API: &str = "/api/v1/collector/s2s";
10pub const ENFORCER_TRUE_IP_HEADER: &str = "X-PX-ENFORCER-TRUE-IP";
11pub const FIRST_PARTY_MODE_HEADER: &str = "X-PX-FIRST-PARTY";
12pub const FIRST_PARTY_HEADER_VALUE: &str = "1";
13pub const TELEMETRY_HEADER: &str = "x-px-enforcer-telemetry";
14pub const TELEMETRY_PATH: &str = "/api/v2/risk/telemetry";
15pub const PX_MODULE_VERSION: &str = concat!("Fastly WASM v", env!("CARGO_PKG_VERSION"));
16pub const PX_CLIENT_HOST: &str = "https://client.px-cloud.net";
17pub const PX_CAPTCHA_HOST: &str = "https://captcha.px-cloud.net";
18pub const PX_BACKUP_CAPTCHA_HOST: &str = "https://captcha.px-cloud.net";
19pub const KEY_LEN: usize = 32;
20pub const IV_LEN: usize = 16;
21pub const ITERATIONS_UPPER_BOUND: u32 = 5000;
22pub const DEFAULT_CONFIGSTORE_NAME: &str = "PXConfig";
23
24pub const WHITELIST_EXT: &[&str] = &[
25    ".css", ".bmp", ".tif", ".ttf", ".docx", ".woff2", ".js", ".pict", ".tiff", ".eot", ".xlsx",
26    ".jpg", ".csv", ".eps", ".woff", ".xls", ".jpeg", ".doc", ".ejs", ".otf", ".pptx", ".gif",
27    ".pdf", ".swf", ".svg", ".ps", ".ico", ".pls", ".midi", ".svgz", ".class", ".png", ".ppt",
28    ".mid", ".webp", ".jar", ".json", ".xml",
29];
30
31#[derive(PartialEq, Default)]
32pub enum CallReason {
33    #[default]
34    None,
35    NoCookie,
36    NoCookieWVid,
37    CookieDecryptionFailed,
38    CookieValidationFailed,
39    CookieExpired,
40    SensitiveRoute,
41    MobileSdkConnectionError,
42}
43impl fmt::Display for CallReason {
44    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
45        match self {
46            CallReason::None => {
47                write!(f, "none")
48            }
49            CallReason::NoCookie => {
50                write!(f, "no_cookie")
51            }
52            CallReason::NoCookieWVid => {
53                write!(f, "no_cookie_w_vid")
54            }
55            CallReason::CookieDecryptionFailed => {
56                write!(f, "cookie_decryption_failed")
57            }
58            CallReason::CookieValidationFailed => {
59                write!(f, "cookie_validation_failed")
60            }
61            CallReason::CookieExpired => {
62                write!(f, "cookie_expired")
63            }
64            CallReason::SensitiveRoute => {
65                write!(f, "sensitive_route")
66            }
67            CallReason::MobileSdkConnectionError => {
68                write!(f, "mobile_sdk_connection_error")
69            }
70        }
71    }
72}
73
74#[derive(PartialEq, Default)]
75pub enum PassReason {
76    #[default]
77    None,
78    Cookie,
79    Error,
80    S2s,
81}
82
83impl fmt::Display for PassReason {
84    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
85        match self {
86            PassReason::None => {
87                write!(f, "none")
88            }
89            PassReason::Cookie => {
90                write!(f, "cookie")
91            }
92            PassReason::Error => {
93                write!(f, "s2s_error")
94            }
95            PassReason::S2s => {
96                write!(f, "s2s")
97            }
98        }
99    }
100}
101
102#[derive(PartialEq, Default)]
103pub enum BlockReason {
104    #[default]
105    None,
106    CookieScore,
107    ServerScore,
108    Challenge,
109}
110impl fmt::Display for BlockReason {
111    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
112        match self {
113            BlockReason::None => {
114                write!(f, "none")
115            }
116            BlockReason::CookieScore => {
117                write!(f, "cookie_high_score")
118            }
119            BlockReason::ServerScore => {
120                write!(f, "s2s_high_score")
121            }
122            BlockReason::Challenge => {
123                write!(f, "challenge")
124            }
125        }
126    }
127}
128
129#[derive(Default)]
130pub enum S2sErrorReason {
131    #[default]
132    None,
133    FailedOnServer,
134    InvalidResponse,
135    BadRequest,
136    ServerError,
137    Unknown,
138}
139impl fmt::Display for S2sErrorReason {
140    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
141        match self {
142            S2sErrorReason::None => {
143                write!(f, "none")
144            }
145            S2sErrorReason::FailedOnServer => {
146                write!(f, "request_failed_on_server")
147            }
148            S2sErrorReason::InvalidResponse => {
149                write!(f, "invalid_response")
150            }
151            S2sErrorReason::BadRequest => {
152                write!(f, "bad_request")
153            }
154            S2sErrorReason::ServerError => {
155                write!(f, "server_error")
156            }
157            S2sErrorReason::Unknown => {
158                write!(f, "unknown_error")
159            }
160        }
161    }
162}
163
164/// Working mode of the Enforcer
165#[derive(Debug, Default, PartialEq)]
166pub enum PXModuleMode {
167    #[default]
168    Monitor,
169    Blocking,
170}
171impl FromStr for PXModuleMode {
172    type Err = ();
173
174    fn from_str(input: &str) -> Result<Self, Self::Err> {
175        match input {
176            "monitor" => Ok(PXModuleMode::Monitor),
177            "active_blocking" => Ok(PXModuleMode::Blocking),
178            _ => Err(()),
179        }
180    }
181}
182
183impl fmt::Display for PXModuleMode {
184    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
185        write!(f, "{self:?}")
186    }
187}
188
189#[derive(Debug, Default, PartialEq)]
190pub enum CookieOrigin {
191    #[default]
192    Cookie,
193    Header,
194}
195
196#[derive(Default, PartialEq)]
197pub enum CookieVersion {
198    V2,
199    #[default]
200    V3,
201}
202
203#[derive(Debug, Serialize)]
204pub struct RiskHeader {
205    pub name: String,
206    pub value: serde_json::Value,
207}
208pub struct BlockResponse {
209    pub body: String,
210    pub content_type: String,
211}