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