1 | type Cloudflare = { |
2 | token: string; |
3 | email: string; |
4 | key: string; |
5 | }; |
6 | |
7 | * Create an account ruleset rule |
8 | * Adds a new rule to an account ruleset. The rule will be added to the end of the existing list of rules in the ruleset by default. |
9 | */ |
10 | export async function main( |
11 | auth: Cloudflare, |
12 | ruleset_id: string, |
13 | account_id: string, |
14 | body: ( |
15 | | ({ |
16 | action?: string; |
17 | action_parameters?: { [k: string]: unknown }; |
18 | categories?: string[]; |
19 | description?: string; |
20 | enabled?: boolean; |
21 | expression?: string; |
22 | id?: string; |
23 | last_updated: string; |
24 | logging?: { enabled: boolean; [k: string]: unknown }; |
25 | ref?: string; |
26 | version: string; |
27 | [k: string]: unknown; |
28 | } & { |
29 | action?: "block"; |
30 | action_parameters?: { |
31 | response?: { |
32 | content: string; |
33 | content_type: string; |
34 | status_code: number; |
35 | [k: string]: unknown; |
36 | }; |
37 | [k: string]: unknown; |
38 | }; |
39 | description?: { [k: string]: unknown }; |
40 | [k: string]: unknown; |
41 | }) |
42 | | ({ |
43 | action?: string; |
44 | action_parameters?: { [k: string]: unknown }; |
45 | categories?: string[]; |
46 | description?: string; |
47 | enabled?: boolean; |
48 | expression?: string; |
49 | id?: string; |
50 | last_updated: string; |
51 | logging?: { enabled: boolean; [k: string]: unknown }; |
52 | ref?: string; |
53 | version: string; |
54 | [k: string]: unknown; |
55 | } & { |
56 | action?: "execute"; |
57 | action_parameters?: { |
58 | id: string & { [k: string]: unknown }; |
59 | matched_data?: { public_key: string; [k: string]: unknown }; |
60 | overrides?: { |
61 | action?: string & { [k: string]: unknown }; |
62 | categories?: { |
63 | action?: string & { [k: string]: unknown }; |
64 | category: string & { [k: string]: unknown }; |
65 | enabled?: boolean & { [k: string]: unknown }; |
66 | sensitivity_level?: |
67 | | "default" |
68 | | "medium" |
69 | | "low" |
70 | | ("eoff" & { [k: string]: unknown }); |
71 | [k: string]: unknown; |
72 | }[]; |
73 | enabled?: boolean & { [k: string]: unknown }; |
74 | rules?: { |
75 | action?: string & { [k: string]: unknown }; |
76 | enabled?: boolean & { [k: string]: unknown }; |
77 | id: string & { [k: string]: unknown }; |
78 | score_threshold?: number; |
79 | sensitivity_level?: |
80 | | "default" |
81 | | "medium" |
82 | | "low" |
83 | | ("eoff" & { [k: string]: unknown }); |
84 | [k: string]: unknown; |
85 | }[]; |
86 | sensitivity_level?: |
87 | | "default" |
88 | | "medium" |
89 | | "low" |
90 | | ("eoff" & { [k: string]: unknown }); |
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; |
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?: "log"; |
113 | action_parameters?: {}; |
114 | description?: { [k: string]: unknown }; |
115 | [k: string]: unknown; |
116 | }) |
117 | | ({ |
118 | action?: string; |
119 | action_parameters?: { [k: string]: unknown }; |
120 | categories?: string[]; |
121 | description?: string; |
122 | enabled?: boolean; |
123 | expression?: string; |
124 | id?: string; |
125 | last_updated: string; |
126 | logging?: { enabled: boolean; [k: string]: unknown }; |
127 | ref?: string; |
128 | version: string; |
129 | [k: string]: unknown; |
130 | } & { |
131 | action?: "skip"; |
132 | action_parameters?: { |
133 | phases?: ( |
134 | | "ddos_l4" |
135 | | "ddos_l7" |
136 | | "http_config_settings" |
137 | | "http_custom_errors" |
138 | | "http_log_custom_fields" |
139 | | "http_ratelimit" |
140 | | "http_request_cache_settings" |
141 | | "http_request_dynamic_redirect" |
142 | | "http_request_firewall_custom" |
143 | | "http_request_firewall_managed" |
144 | | "http_request_late_transform" |
145 | | "http_request_origin" |
146 | | "http_request_redirect" |
147 | | "http_request_sanitize" |
148 | | "http_request_sbfm" |
149 | | "http_request_select_configuration" |
150 | | "http_request_transform" |
151 | | "http_response_compression" |
152 | | "http_response_firewall_managed" |
153 | | "http_response_headers_transform" |
154 | | "magic_transit" |
155 | | "magic_transit_ids_managed" |
156 | | ("magic_transit_managed" & { [k: string]: unknown }) |
157 | )[]; |
158 | products?: |
159 | | "bic" |
160 | | "hot" |
161 | | "rateLimit" |
162 | | "securityLevel" |
163 | | "uaBlock" |
164 | | "waf" |
165 | | "zoneLockdown"[]; |
166 | rules?: { [k: string]: (string & { [k: string]: unknown })[] }; |
167 | ruleset?: "current"; |
168 | rulesets?: (string & { [k: string]: unknown })[]; |
169 | [k: string]: unknown; |
170 | }; |
171 | description?: { [k: string]: unknown }; |
172 | [k: string]: unknown; |
173 | }) |
174 | ) & { |
175 | position?: |
176 | | ({ [k: string]: unknown } & { before?: string; [k: string]: unknown }) |
177 | | ({ [k: string]: unknown } & { after?: string; [k: string]: unknown }) |
178 | | ({ [k: string]: unknown } & { index?: number; [k: string]: unknown }); |
179 | [k: string]: unknown; |
180 | } |
181 | ) { |
182 | const url = new URL( |
183 | `https://api.cloudflare.com/client/v4/accounts/${account_id}/rulesets/${ruleset_id}/rules` |
184 | ); |
185 |
|
186 | const response = await fetch(url, { |
187 | method: "POST", |
188 | headers: { |
189 | "X-AUTH-EMAIL": auth.email, |
190 | "X-AUTH-KEY": auth.key, |
191 | "Content-Type": "application/json", |
192 | Authorization: "Bearer " + auth.token, |
193 | }, |
194 | body: JSON.stringify(body), |
195 | }); |
196 | if (!response.ok) { |
197 | const text = await response.text(); |
198 | throw new Error(`${response.status} ${text}`); |
199 | } |
200 | return await response.json(); |
201 | } |
202 |
|