feat(api, web): implement policy mode management for agents and rules
Build and Push EvoFirewall Docker Image / build-and-push (push) Successful in 1m46s
Build and Push EvoFirewall Docker Image / create-release (push) Skipped

- Added support for policy modes ('blacklist' and 'whitelist') in agent and policy set management.
- Updated API endpoints to handle policy mode during agent assignment and rule operations.
- Enhanced the web UI to display and manage policy modes for agents and rules, ensuring all assigned sets share a consistent mode.
- Introduced new validation to enforce single policy mode across assigned sets for agents.
- Improved error handling for policy mode conflicts and updated documentation accordingly.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Denozordec
2026-07-21 02:16:51 +07:00
co-authored by Cursor
parent d5784b9f35
commit 90d50c2556
15 changed files with 1261 additions and 266 deletions
+17 -1
View File
@@ -61,6 +61,7 @@ export const policyRuleSchema = z.object({
set_id: z.string(),
priority: z.number().int(),
action: policyActionSchema,
enabled: z.boolean().optional().default(true),
list_id: z.string().nullable().optional(),
cidr: z.string().nullable().optional(),
hostname: z.string().nullable().optional(),
@@ -75,6 +76,7 @@ export const policySetSchema = z.object({
name: z.string(),
description: z.string().nullable().optional(),
enabled: z.boolean(),
policy_mode: policyModeSchema,
rules_count: z.number().int().optional(),
agents_count: z.number().int().optional(),
created_at: z.string(),
@@ -102,19 +104,22 @@ export const createPolicySetBodySchema = z.object({
name: z.string().min(1),
description: z.string().nullable().optional(),
enabled: z.boolean().optional().default(true),
policy_mode: policyModeSchema.optional().default('blacklist'),
})
export const patchPolicySetBodySchema = z.object({
name: z.string().min(1).optional(),
description: z.string().nullable().optional(),
enabled: z.boolean().optional(),
policy_mode: policyModeSchema.optional(),
})
export const createPolicyRuleBodySchema = z
.object({
set_id: z.string().min(1),
priority: z.number().int().min(1).max(10000),
priority: z.number().int().min(1).max(10000).optional(),
action: policyActionSchema,
enabled: z.boolean().optional().default(true),
list_id: z.string().nullable().optional(),
cidr: z.string().nullable().optional(),
hostname: z.string().nullable().optional(),
@@ -132,6 +137,17 @@ export const createPolicyRuleBodySchema = z
}
})
export const patchPolicyRuleBodySchema = z.object({
enabled: z.boolean().optional(),
action: policyActionSchema.optional(),
comment: z.string().nullable().optional(),
priority: z.number().int().min(1).max(10000).optional(),
})
export const reorderPolicyRulesBodySchema = z.object({
ordered_ids: z.array(z.string()).min(1),
})
export const putAgentPolicySetsBodySchema = z.object({
set_ids: z.array(z.string()),
})