perimeterx_fastly_enforcer/modules/
pxconstants.rs1use serde::Serialize;
2use std::fmt;
3use std::str::FromStr;
4
5pub 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#[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}