Add blocking: blocklists and block/allow rules with BIND response policy zones

jarld downloads blocklists (Adblock, hosts or plain domains), checks them
daily and reloads named only when a list changed; your own block and
allow rules take precedence, and the most specific rule wins. Lists and
rules apply per view (default: every view that offers recursion). Web UI
Blocking page with name checks, jarl blocklist and jarl block, the
/blocking API, blocked counts in the statistics. Database schema 6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adamandClaude Opus 5.5 committed 2026-10-10 09:24:19 +00:00
1 parent 436cd79ec9
commit 9fc23310bd
54 files changed
+4269 -85

No files matched your search

+36
View File
@@ -242,6 +242,17 @@ type StatusResponse struct {
Backup *BackupStatus `json:"backup,omitempty"`
// TOTP is about two-factor login across users (administrators only).
TOTP *TOTPOverview `json:"totp,omitempty"`
// BlocklistErrors are blocklists whose last update failed (for those
// who may see blocking).
BlocklistErrors []BlocklistError `json:"blocklist_errors,omitempty"`
}
// BlocklistError is a blocklist whose last update failed. UpdatedAt is
// the version named keeps using (nil: none yet).
type BlocklistError struct {
Name string `json:"name"`
Error string `json:"error"`
UpdatedAt *time.Time `json:"updated_at,omitempty"`
}
// TOTPOverview is what the dashboard reports about two-factor login.
@@ -471,3 +482,28 @@ type RegistrarChangeResponse struct {
Checks []nscheck.Finding `json:"checks"`
Warnings []string `json:"warnings"`
}
// Blocklist is a blocklist as returned by the API (docs/blocking.md).
type Blocklist struct {
model.Blocklist
// Views are the views it applies to; AutoViews is set when that is
// "every view that offers recursion" (view_ids is empty).
Views []string `json:"views"`
AutoViews bool `json:"auto_views,omitempty"`
// State is ok, waiting (not downloaded yet), error (the last update
// failed; the previous version stays in use), disabled, or idle (it
// applies to no view).
State string `json:"state"`
Status *model.BlocklistStatus `json:"status,omitempty"`
// MemoryMB estimates what named needs for the list, in all its views.
MemoryMB int `json:"memory_mb,omitempty"`
Pending string `json:"pending,omitempty"`
}
// BlockRule is a block or allow rule as returned by the API.
type BlockRule struct {
model.BlockRule
Views []string `json:"views"`
AutoViews bool `json:"auto_views,omitempty"`
Pending string `json:"pending,omitempty"`
}