Skip to content

Commit f8ef580

Browse files
committed
Validate configuration file more strictly
1 parent 63ba156 commit f8ef580

2 files changed

Lines changed: 18 additions & 11 deletions

File tree

ssh_zone_handler/types.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
"""Custom types"""
22

3-
from typing import Final, Literal
3+
from typing import Annotated, Final, Literal
44

55
from pydantic import BaseModel, Field, ValidationInfo, field_validator
66

7+
SystemUser = Annotated[str, Field(pattern=r"^[a-z0-9_][a-z0-9_-]*[a-z0-9]$")]
8+
ServiceUnit = Annotated[str, Field(pattern=r"^[a-z0-9][a-z0-9_-]*[a-z0-9]\.service$")]
9+
FwdZone = Annotated[str, Field(pattern=r"^([a-z0-9][a-z0-9-]+[a-z0-9]\.)+[a-z]+$")]
10+
Ptr4Zone = Annotated[str, Field(pattern=r"^[0-9/]+\.([0-9]+\.)+in-addr\.arpa$")]
11+
Ptr6Zone = Annotated[str, Field(pattern=r"^([a-f0-9]\.)+ip6\.arpa$")]
12+
Zone = FwdZone | Ptr4Zone | Ptr6Zone
13+
714
SERVICE_DEFAULTS: Final[dict[str, dict[str, str]]] = {
815
"bind": {
916
"unit": "named.service",
@@ -16,17 +23,17 @@
1623
}
1724

1825

19-
class SystemConf(BaseModel):
26+
class SystemConf(BaseModel, extra="forbid", frozen=True):
2027
"""
2128
Subset of ZoneHandlerConf
2229
"""
2330

24-
log_access_user: str
31+
log_access_user: SystemUser
2532
server_type: Literal["bind", "knot"]
26-
server_user: str = Field(default="", validate_default=True)
27-
systemd_unit: str = Field(default="", validate_default=True)
33+
server_user: SystemUser = Field(default="", validate_default=True)
34+
systemd_unit: ServiceUnit = Field(default="", validate_default=True)
2835

29-
@field_validator("server_user", mode="after")
36+
@field_validator("server_user", mode="before")
3037
def _default_user(cls, user: str, values: ValidationInfo) -> str:
3138
if not user:
3239
try:
@@ -35,7 +42,7 @@ def _default_user(cls, user: str, values: ValidationInfo) -> str:
3542
user = "nobody"
3643
return user
3744

38-
@field_validator("systemd_unit", mode="after")
45+
@field_validator("systemd_unit", mode="before")
3946
def _default_unit(cls, systemd_unit: str, values: ValidationInfo) -> str:
4047
if not systemd_unit:
4148
try:
@@ -45,10 +52,10 @@ def _default_unit(cls, systemd_unit: str, values: ValidationInfo) -> str:
4552
return systemd_unit
4653

4754

48-
class ZoneHandlerConf(BaseModel):
55+
class ZoneHandlerConf(BaseModel, extra="forbid", frozen=True):
4956
"""
50-
zone-handler.json structure
57+
zone-handler.yaml structure
5158
"""
5259

5360
system: SystemConf
54-
zones: dict[str, list[str]]
61+
zones: dict[str, list[Zone]]

tests/test_ssh_zone_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def test_cli_zone_sudoers(caplog, capsys):
102102
sudoers(Path("./tests/data/outdated-config.yaml"))
103103
captured_outdated = caplog.text
104104
assert (
105-
"Invalid server side config file\n\n1 validation error for ZoneHandlerConf"
105+
"Invalid server side config file\n\n2 validation errors for ZoneHandlerConf"
106106
in captured_outdated
107107
)
108108

0 commit comments

Comments
 (0)