Restrict the number of sites in the api

This commit is contained in:
Owen
2026-06-02 16:38:04 -07:00
parent 8bcc130947
commit 33fad57bf7
3 changed files with 91 additions and 0 deletions

View File

@@ -173,6 +173,25 @@ const createSiteResourceSchema = z
{ {
message: "At least one of siteIds or siteId must be provided" message: "At least one of siteIds or siteId must be provided"
} }
)
.refine(
(data) => {
if (data.mode !== "ssh") return true;
const isSingleSiteMode =
data.authDaemonMode === "native" ||
(data.pamMode === "push" && data.authDaemonMode === "site") ||
(data.pamMode === "push" && data.authDaemonMode === undefined);
if (!isSingleSiteMode) return true;
const effectiveSiteIds = [
...(data.siteIds ?? []),
...(data.siteId !== undefined ? [data.siteId] : [])
];
const uniqueSiteIds = new Set(effectiveSiteIds);
return uniqueSiteIds.size <= 1;
},
{
message: "Only one site is allowed for this SSH daemon mode"
}
); );
export type CreateSiteResourceBody = z.infer<typeof createSiteResourceSchema>; export type CreateSiteResourceBody = z.infer<typeof createSiteResourceSchema>;

View File

@@ -181,6 +181,25 @@ const updateSiteResourceSchema = z
{ {
message: "At least one of siteIds or siteId must be provided" message: "At least one of siteIds or siteId must be provided"
} }
)
.refine(
(data) => {
if (data.mode !== "ssh") return true;
const isSingleSiteMode =
data.authDaemonMode === "native" ||
(data.pamMode === "push" && data.authDaemonMode === "site") ||
(data.pamMode === "push" && data.authDaemonMode === undefined);
if (!isSingleSiteMode) return true;
const effectiveSiteIds = [
...(data.siteIds ?? []),
...(data.siteId !== undefined ? [data.siteId] : [])
];
const uniqueSiteIds = new Set(effectiveSiteIds);
return uniqueSiteIds.size <= 1;
},
{
message: "Only one site is allowed for this SSH daemon mode"
}
); );
export type UpdateSiteResourceBody = z.infer<typeof updateSiteResourceSchema>; export type UpdateSiteResourceBody = z.infer<typeof updateSiteResourceSchema>;

View File

@@ -1885,6 +1885,36 @@ export function PrivateResourceForm({
"authDaemonPort", "authDaemonPort",
null null
); );
} else if (
v === "push"
) {
// push + site (default) = single site
const curAuthMode =
form.getValues(
"authDaemonMode"
);
if (
curAuthMode !==
"remote" &&
selectedSites.length >
1
) {
const first =
selectedSites.slice(
0,
1
);
setSelectedSites(
first
);
form.setValue(
"siteIds",
first.map(
(s) =>
s.siteId
)
);
}
} }
}} }}
cols={2} cols={2}
@@ -1952,6 +1982,29 @@ export function PrivateResourceForm({
"authDaemonPort", "authDaemonPort",
null null
); );
// site daemon = single site
if (
selectedSites.length >
1
) {
const first =
selectedSites.slice(
0,
1
);
setSelectedSites(
first
);
form.setValue(
"siteIds",
first.map(
(
s
) =>
s.siteId
)
);
}
} }
}} }}
cols={2} cols={2}