fix(nixos): validate route protocol fields

This commit is contained in:
2026-10-05 00:04:07 -04:00
parent dc2e86fbe6
commit e6915e8abd

View File

@@ -1,49 +1,4 @@
{ lib, util, ... }:
let
# NOLINT(let_order)
routeType =
protocols: options:
lib.types.submodule {
options = {
domain = lib.mkOption {
type = lib.types.str;
example = "files.alexion.dev";
description = "Public domain for this route.";
};
protocol = lib.mkOption {
type = lib.types.enum protocols;
description = "Public protocol for this route.";
};
}
// options;
};
webRoute =
routeType
[
"http"
"https"
]
{
port = lib.mkOption {
type = lib.types.port;
example = 3923;
description = "HTTP backend port for this route.";
};
};
udpRoute = routeType [ "udp" ] {
ports = lib.mkOption {
type = lib.types.nonEmptyListOf lib.types.port;
example = [
2456
2457
];
description = "UDP ports for this route.";
};
};
in
{
checks = [
{
@@ -54,16 +9,69 @@ in
assertion =
entries:
util.registry.predicates.uniqueValue (entry: entry.value) (
lib.concatMap (entry: map (port: entry // { value = port; }) entry.value.ports) (
lib.filter (entry: entry.value.protocol == "udp") entries
)
lib.concatMap (entry: map (port: entry // { value = port; }) entry.value.ports) entries
);
message = "Route UDP ports must be unique.";
}
{
assertion =
entries:
lib.all (
entry:
let
route = entry.value;
in
!lib.elem route.protocol [
"http"
"https"
]
|| (route.port != null && route.ports == [ ])
) entries;
message = "HTTP and HTTPS routes must set port and not ports.";
}
{
assertion =
entries:
lib.all (
entry: entry.value.protocol != "udp" || (entry.value.port == null && entry.value.ports != [ ])
) entries;
message = "UDP routes must set ports and not port.";
}
];
type = lib.types.oneOf [
webRoute
udpRoute
];
type = lib.types.submodule {
options = {
domain = lib.mkOption {
type = lib.types.str;
example = "files.alexion.dev";
description = "Public domain for this route.";
};
protocol = lib.mkOption {
type = lib.types.enum [
"http"
"https"
"udp"
];
description = "Public protocol for this route.";
};
port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = null;
example = 3923;
description = "HTTP backend port for an HTTP or HTTPS route.";
};
ports = lib.mkOption {
type = lib.types.listOf lib.types.port;
default = [ ];
example = [
2456
2457
];
description = "UDP ports for a UDP route.";
};
};
};
}