1 | type Cloudflare = { |
2 | token: string; |
3 | email: string; |
4 | key: string; |
5 | }; |
6 | |
7 | * Update a zone entry point ruleset |
8 | * Updates a zone entry point ruleset, creating a new version. |
9 | */ |
10 | export async function main( |
11 | auth: Cloudflare, |
12 | ruleset_phase: |
13 | | "ddos_l4" |
14 | | "ddos_l7" |
15 | | "http_config_settings" |
16 | | "http_custom_errors" |
17 | | "http_log_custom_fields" |
18 | | "http_ratelimit" |
19 | | "http_request_cache_settings" |
20 | | "http_request_dynamic_redirect" |
21 | | "http_request_firewall_custom" |
22 | | "http_request_firewall_managed" |
23 | | "http_request_late_transform" |
24 | | "http_request_origin" |
25 | | "http_request_redirect" |
26 | | "http_request_sanitize" |
27 | | "http_request_sbfm" |
28 | | "http_request_select_configuration" |
29 | | "http_request_transform" |
30 | | "http_response_compression" |
31 | | "http_response_firewall_managed" |
32 | | "http_response_headers_transform" |
33 | | "magic_transit" |
34 | | "magic_transit_ids_managed" |
35 | | "magic_transit_managed", |
36 | zone_id: string, |
37 | body: { |
38 | description?: string; |
39 | id: string & { [k: string]: unknown }; |
40 | kind?: "managed" | "custom" | "root" | "zone"; |
41 | last_updated: string; |
42 | name?: string; |
43 | phase?: |
44 | | "ddos_l4" |
45 | | "ddos_l7" |
46 | | "http_config_settings" |
47 | | "http_custom_errors" |
48 | | "http_log_custom_fields" |
49 | | "http_ratelimit" |
50 | | "http_request_cache_settings" |
51 | | "http_request_dynamic_redirect" |
52 | | "http_request_firewall_custom" |
53 | | "http_request_firewall_managed" |
54 | | "http_request_late_transform" |
55 | | "http_request_origin" |
56 | | "http_request_redirect" |
57 | | "http_request_sanitize" |
58 | | "http_request_sbfm" |
59 | | "http_request_select_configuration" |
60 | | "http_request_transform" |
61 | | "http_response_compression" |
62 | | "http_response_firewall_managed" |
63 | | "http_response_headers_transform" |
64 | | "magic_transit" |
65 | | "magic_transit_ids_managed" |
66 | | "magic_transit_managed"; |
67 | version: string; |
68 | [k: string]: unknown; |
69 | } & { |
70 | rules: ( |
71 | | ({ |
72 | action?: string; |
73 | action_parameters?: { [k: string]: unknown }; |
74 | categories?: string[]; |
75 | description?: string; |
76 | enabled?: boolean & boolean; |
77 | expression?: string; |
78 | id?: string; |
79 | last_updated: string; |
80 | logging?: { enabled: boolean; [k: string]: unknown }; |
81 | ref?: string; |
82 | version: string; |
83 | [k: string]: unknown; |
84 | } & { |
85 | action?: "block"; |
86 | action_parameters?: { |
87 | response?: { |
88 | content: string; |
89 | content_type: string; |
90 | status_code: number; |
91 | [k: string]: unknown; |
92 | }; |
93 | [k: string]: unknown; |
94 | }; |
95 | description?: { [k: string]: unknown }; |
96 | [k: string]: unknown; |
97 | }) |
98 | | ({ |
99 | action?: string; |
100 | action_parameters?: { [k: string]: unknown }; |
101 | categories?: string[]; |
102 | description?: string; |
103 | enabled?: boolean & boolean; |
104 | expression?: string; |
105 | id?: string; |
106 | last_updated: string; |
107 | logging?: { enabled: boolean; [k: string]: unknown }; |
108 | ref?: string; |
109 | version: string; |
110 | [k: string]: unknown; |
111 | } & { |
112 | action?: "execute"; |
113 | action_parameters?: { |
114 | id: string & { [k: string]: unknown }; |
115 | matched_data?: { public_key: string; [k: string]: unknown }; |
116 | overrides?: { |
117 | action?: string & { [k: string]: unknown }; |
118 | categories?: { |
119 | action?: string & { [k: string]: unknown }; |
120 | category: string & { [k: string]: unknown }; |
121 | enabled?: boolean & { [k: string]: unknown }; |
122 | sensitivity_level?: |
123 | | "default" |
124 | | "medium" |
125 | | "low" |
126 | | ("eoff" & { [k: string]: unknown }); |
127 | [k: string]: unknown; |
128 | }[]; |
129 | enabled?: boolean & { [k: string]: unknown }; |
130 | rules?: { |
131 | action?: string & { [k: string]: unknown }; |
132 | enabled?: boolean & { [k: string]: unknown }; |
133 | id: string & { [k: string]: unknown }; |
134 | score_threshold?: number; |
135 | sensitivity_level?: |
136 | | "default" |
137 | | "medium" |
138 | | "low" |
139 | | ("eoff" & { [k: string]: unknown }); |
140 | [k: string]: unknown; |
141 | }[]; |
142 | sensitivity_level?: |
143 | | "default" |
144 | | "medium" |
145 | | "low" |
146 | | ("eoff" & { [k: string]: unknown }); |
147 | [k: string]: unknown; |
148 | }; |
149 | [k: string]: unknown; |
150 | }; |
151 | description?: { [k: string]: unknown }; |
152 | [k: string]: unknown; |
153 | }) |
154 | | ({ |
155 | action?: string; |
156 | action_parameters?: { [k: string]: unknown }; |
157 | categories?: string[]; |
158 | description?: string; |
159 | enabled?: boolean & boolean; |
160 | expression?: string; |
161 | id?: string; |
162 | last_updated: string; |
163 | logging?: { enabled: boolean; [k: string]: unknown }; |
164 | ref?: string; |
165 | version: string; |
166 | [k: string]: unknown; |
167 | } & { |
168 | action?: "log"; |
169 | action_parameters?: {}; |
170 | description?: { [k: string]: unknown }; |
171 | [k: string]: unknown; |
172 | }) |
173 | | ({ |
174 | action?: string; |
175 | action_parameters?: { [k: string]: unknown }; |
176 | categories?: string[]; |
177 | description?: string; |
178 | enabled?: boolean & boolean; |
179 | expression?: string; |
180 | id?: string; |
181 | last_updated: string; |
182 | logging?: { enabled: boolean; [k: string]: unknown }; |
183 | ref?: string; |
184 | version: string; |
185 | [k: string]: unknown; |
186 | } & { |
187 | action?: "skip"; |
188 | action_parameters?: { |
189 | phases?: ( |
190 | | "ddos_l4" |
191 | | "ddos_l7" |
192 | | "http_config_settings" |
193 | | "http_custom_errors" |
194 | | "http_log_custom_fields" |
195 | | "http_ratelimit" |
196 | | "http_request_cache_settings" |
197 | | "http_request_dynamic_redirect" |
198 | | "http_request_firewall_custom" |
199 | | "http_request_firewall_managed" |
200 | | "http_request_late_transform" |
201 | | "http_request_origin" |
202 | | "http_request_redirect" |
203 | | "http_request_sanitize" |
204 | | "http_request_sbfm" |
205 | | "http_request_select_configuration" |
206 | | "http_request_transform" |
207 | | "http_response_compression" |
208 | | "http_response_firewall_managed" |
209 | | "http_response_headers_transform" |
210 | | "magic_transit" |
211 | | "magic_transit_ids_managed" |
212 | | ("magic_transit_managed" & { [k: string]: unknown }) |
213 | )[]; |
214 | products?: |
215 | | "bic" |
216 | | "hot" |
217 | | "rateLimit" |
218 | | "securityLevel" |
219 | | "uaBlock" |
220 | | "waf" |
221 | | "zoneLockdown"[]; |
222 | rules?: { [k: string]: (string & { [k: string]: unknown })[] }; |
223 | ruleset?: "current"; |
224 | rulesets?: (string & { [k: string]: unknown })[]; |
225 | [k: string]: unknown; |
226 | }; |
227 | description?: { [k: string]: unknown }; |
228 | [k: string]: unknown; |
229 | }) |
230 | )[]; |
231 | [k: string]: unknown; |
232 | } |
233 | ) { |
234 | const url = new URL( |
235 | `https://api.cloudflare.com/client/v4/zones/${zone_id}/rulesets/phases/${ruleset_phase}/entrypoint` |
236 | ); |
237 |
|
238 | const response = await fetch(url, { |
239 | method: "PUT", |
240 | headers: { |
241 | "X-AUTH-EMAIL": auth.email, |
242 | "X-AUTH-KEY": auth.key, |
243 | "Content-Type": "application/json", |
244 | Authorization: "Bearer " + auth.token, |
245 | }, |
246 | body: JSON.stringify(body), |
247 | }); |
248 | if (!response.ok) { |
249 | const text = await response.text(); |
250 | throw new Error(`${response.status} ${text}`); |
251 | } |
252 | return await response.json(); |
253 | } |
254 |
|