Skip to content

Commit 0d12d09

Browse files
pedrosousaKianNH
andauthored
[Ruleset Engine] New fields reference (#19214)
--------- Co-authored-by: Kian Newman-Hazel <[email protected]>
1 parent e8c6d82 commit 0d12d09

File tree

71 files changed

+2983
-2455
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+2983
-2455
lines changed

astro.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ export default defineConfig({
193193
"/products/",
194194
"/rules/snippets/examples/?operation=*",
195195
"/rules/transform/examples/?operation=*",
196+
"/ruleset-engine/rules-language/fields/reference/**",
196197
"/workers/examples/?languages=*",
197198
"/workers/examples/?tags=*",
198199
"/workers-ai/models/**",

package-lock.json

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
"puppeteer": "^24.0.0",
7878
"react": "^18.3.1",
7979
"react-dom": "^18.3.1",
80+
"react-markdown": "^9.0.3",
8081
"react-textarea-autosize": "^8.5.7",
8182
"redirects-in-workers": "^0.0.5",
8283
"rehype-autolink-headings": "^7.1.0",

public/_redirects

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,6 @@
750750
/logs/reference/logpush-api-configuration/examples/example-logpush-curl/ /logs/tutorials/examples/example-logpush-curl/ 301
751751

752752
# magic-firewall
753-
/magic-firewall/reference/magic-firewall-fields/ /ruleset-engine/rules-language/fields/magic-firewall/ 301
754753
/magic-firewall/reference/examples/ /magic-firewall/how-to/add-rules/ 301
755754
/magic-firewall/how-to/pcaps-bucket-setup/ /magic-firewall/packet-captures/pcaps-bucket-setup/ 301
756755
/magic-firewall/how-to/collect-pcaps/ /magic-firewall/packet-captures/collect-pcaps/ 301
@@ -934,7 +933,6 @@
934933
/reference-architecture/load-balancing-reference-architecture/ /reference-architecture/architectures/load-balancing/ 301
935934
/reference-architecture/magic-transit-reference-architecture/ /reference-architecture/architectures/magic-transit/ 301
936935
/reference-architecture/multi-vendor-architecture/ /reference-architecture/architectures/multi-vendor/ 301
937-
938936
/reference-architecture/secure-application-delivery-design-guide/ /reference-architecture/design-guides/secure-application-delivery/ 301
939937

940938
# radar
@@ -973,6 +971,15 @@
973971
/rules/url-forwarding/single-redirects/examples/ /rules/url-forwarding/examples/ 301
974972
/rules/url-forwarding/dynamic-redirects/parameters/ /rules/url-forwarding/single-redirects/settings/ 301
975973

974+
# ruleset engine
975+
/ruleset-engine/rules-language/fields/standard-fields/ /ruleset-engine/rules-language/fields/reference/ 301
976+
/ruleset-engine/rules-language/fields/dynamic-fields/ /ruleset-engine/rules-language/fields/reference/ 301
977+
/ruleset-engine/rules-language/fields/uri/ /ruleset-engine/rules-language/fields/reference/ 301
978+
/ruleset-engine/rules-language/fields/http-request-header/ /ruleset-engine/rules-language/fields/reference/ 301
979+
/ruleset-engine/rules-language/fields/http-request-body/ /ruleset-engine/rules-language/fields/reference/ 301
980+
/ruleset-engine/rules-language/fields/http-request-response/ /ruleset-engine/rules-language/fields/reference/ 301
981+
/ruleset-engine/rules-language/fields/magic-firewall/ /magic-firewall/reference/magic-firewall-fields/ 301
982+
976983
# security center
977984
/security-center/indicator-feeds/getting-started/ /security-center/indicator-feeds/ 301
978985
/security-center/indicator-feeds/get-started/ /security-center/indicator-feeds/ 301

src/components/FieldCatalog.jsx

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
import { useState } from "react";
2+
import FieldBadges from "./fields/FieldBadges";
3+
import Markdown from "react-markdown";
4+
5+
const FieldCatalog = ({ fields }) => {
6+
const [filters, setFilters] = useState({
7+
search: "",
8+
categories: [],
9+
keywords: [],
10+
});
11+
const mapped = fields.sort((f1, f2) => {
12+
return f1.name < f2.name ? -1 : 1;
13+
});
14+
15+
const categories = [
16+
...new Set(
17+
fields
18+
.map((field) => field.categories)
19+
.flat()
20+
.sort(),
21+
),
22+
];
23+
24+
// apply filters to the fields list
25+
const fieldList = mapped.filter((field) => {
26+
if (filters.categories.length > 0) {
27+
if (!field.categories?.some((c) => filters.categories.includes(c))) {
28+
return false;
29+
}
30+
}
31+
32+
if (filters.search) {
33+
// search keywords
34+
let keywordFound = field.keywords?.some(
35+
(kw) => kw.indexOf(filters.search) >= 0,
36+
);
37+
38+
if (
39+
!field.name.toLowerCase().includes(filters.search.toLowerCase()) &&
40+
!field.summary.toLowerCase().includes(filters.search.toLowerCase()) &&
41+
!keywordFound
42+
) {
43+
return false;
44+
}
45+
}
46+
47+
return true;
48+
});
49+
50+
return (
51+
<div className="md:flex">
52+
<div className="mr-8 w-full md:w-1/4">
53+
<input
54+
type="text"
55+
className="mb-8 w-full rounded-md border-2 border-gray-200 bg-white px-2 py-2 dark:border-gray-700 dark:bg-gray-800"
56+
placeholder="Search fields"
57+
value={filters.search}
58+
onChange={(e) => setFilters({ ...filters, search: e.target.value })}
59+
/>
60+
61+
<div className="!mb-8 hidden md:block">
62+
<span className="text-sm font-bold uppercase text-gray-600 dark:text-gray-200">
63+
▼ Categories
64+
</span>
65+
66+
{categories.map((category) => (
67+
<label key={category} className="!my-2 block">
68+
<input
69+
type="checkbox"
70+
className="mr-2"
71+
value={category}
72+
onClick={(e) => {
73+
if (e.target.checked) {
74+
setFilters({
75+
...filters,
76+
categories: [...filters.categories, e.target.value],
77+
});
78+
} else {
79+
setFilters({
80+
...filters,
81+
categories: filters.categories.filter(
82+
(f) => f !== e.target.value,
83+
),
84+
});
85+
}
86+
}}
87+
/>{" "}
88+
{category}
89+
</label>
90+
))}
91+
</div>
92+
</div>
93+
94+
<div className="!mt-0 flex w-full flex-wrap items-stretch gap-[1%] self-start md:w-3/4">
95+
{fieldList.length === 0 && (
96+
<div className="flex w-full flex-col justify-center rounded-md border bg-gray-50 py-6 text-center align-middle dark:border-gray-500 dark:bg-gray-800">
97+
<span className="text-lg !font-bold">No fields found</span>
98+
<p>
99+
Try a different search term, or broaden your search by removing
100+
filters.
101+
</p>
102+
</div>
103+
)}
104+
{fieldList.map((field) => {
105+
return (
106+
<a
107+
key={field.name}
108+
className="mb-3 block w-full self-stretch rounded-md border border-solid border-gray-200 p-3 !text-inherit no-underline hover:bg-gray-50 dark:border-gray-700 dark:hover:bg-gray-800 lg:w-[48%]"
109+
href={`/ruleset-engine/rules-language/fields/reference/${field.name}/`}
110+
>
111+
<div className="-mb-1 flex items-center">
112+
<span
113+
className="font-semibold text-lg text-ellipsis overflow-hidden whitespace-nowrap"
114+
title={`${field.name}: ${field.data_type}`}
115+
>
116+
{field.name}
117+
</span>
118+
</div>
119+
<Markdown
120+
className="!mt-2 line-clamp-2 text-sm leading-6"
121+
disallowedElements={["a"]}
122+
unwrapDisallowed={true}
123+
>
124+
{field.summary}
125+
</Markdown>
126+
127+
{field.plan_info_label && (
128+
<div className="!mt-2 text-xs">
129+
<FieldBadges badges={[field.plan_info_label]} />
130+
</div>
131+
)}
132+
</a>
133+
);
134+
})}
135+
</div>
136+
</div>
137+
);
138+
};
139+
140+
export default FieldCatalog;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const FieldBadges = ({ badges }) => {
2+
return (
3+
<ul className="list-none m-0 p-0 inline-flex items-center gap-2 text-xs">
4+
{badges.map((badge) => (
5+
<li
6+
key={badge}
7+
className="bg-gray-100 dark:bg-gray-700 px-2 py-1 rounded-md block !mt-0"
8+
>
9+
{badge}
10+
</li>
11+
))}
12+
</ul>
13+
);
14+
};
15+
16+
export default FieldBadges;

src/content/config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { z, defineCollection } from "astro:content";
22
import { docsSchema, i18nSchema } from "@astrojs/starlight/schema";
3+
import { file } from "astro/loaders";
34
import {
45
appsSchema,
56
changelogsSchema,
@@ -13,6 +14,7 @@ import {
1314
videosSchema,
1415
workersAiSchema,
1516
changelogsNextSchema,
17+
fieldsSchema,
1618
} from "~/schemas";
1719

1820
const partialSchema = z.object({
@@ -78,4 +80,8 @@ export const collections = {
7880
"changelogs-next": defineCollection({
7981
schema: changelogsNextSchema,
8082
}),
83+
fields: defineCollection({
84+
schema: fieldsSchema,
85+
type: "data",
86+
}),
8187
};

src/content/docs/api-shield/security/jwt-validation/transform-rules.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ As an example, to send the `x-send-jwt-claim-user` request header to the origin,
3131
4. Enter a rule name and a filter expression, if applicable.
3232
5. Choose **Set dynamic**.
3333
6. Set the header name to `x-send-jwt-claim-user`.
34-
7. Set the value to `lookup_json_string(http.request.jwt.claims["<TOKEN_CONFIGURATION_ID>"][0], "claim_name")`, where `<TOKEN_CONFIGURATION_ID>` is your token configuration ID found in JWT Validation and `claim_name` is the [JWT claim](/ruleset-engine/rules-language/fields/dynamic-fields/#json-web-tokens-validation-claims) you want to add to the header.
34+
7. Set the value to `lookup_json_string(http.request.jwt.claims["<TOKEN_CONFIGURATION_ID>"][0], "claim_name")`, where `<TOKEN_CONFIGURATION_ID>` is your token configuration ID found in JWT Validation and `claim_name` is the JWT claim you want to add to the header.

src/content/docs/bots/troubleshooting.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ Cloudflare has built an allowlist of good, automated bots, e.g. Google Search En
9090

9191
This allowlist is large based on reverse DNS verification, meaning that the IPs we allow really match the requesting service. In addition to this, Cloudflare uses multiple validation methods including ASN blocks and public lists. If none of these validation types are available for a customer, we use internal Cloudflare data and machine learning to identify legitimate IP addresses from good bots.
9292

93-
To allow traffic from good bots, use the [Verified Bot](/ruleset-engine/rules-language/fields/dynamic-fields/#cfbot_managementverified_bot) field in your WAF custom rule.
93+
To allow traffic from good bots, use the [Verified Bot](/ruleset-engine/rules-language/fields/reference/cf.bot_management.verified_bot/) field in your WAF custom rule.
9494

9595
---
9696

0 commit comments

Comments
 (0)