Fix a couple things wiht destinations

This commit is contained in:
Owen
2025-12-05 16:40:43 -05:00
parent d3be1fbf4c
commit 1ee70e04ed
2 changed files with 54 additions and 22 deletions

View File

@@ -55,7 +55,7 @@ const createSiteResourceSchema = z
.safeParse(data.destination).success; .safeParse(data.destination).success;
if (isValidIP) { if (isValidIP) {
return true return true;
} }
// Check if it's a valid domain (hostname pattern, TLD not required) // Check if it's a valid domain (hostname pattern, TLD not required)
@@ -64,13 +64,13 @@ const createSiteResourceSchema = z
const isValidDomain = domainRegex.test(data.destination); const isValidDomain = domainRegex.test(data.destination);
const isValidAlias = data.alias && domainRegex.test(data.alias); const isValidAlias = data.alias && domainRegex.test(data.alias);
return isValidDomain && isValidAlias; // require the alias to be set in the case of domain return isValidDomain && isValidAlias; // require the alias to be set in the case of domain
} }
return true; return true;
}, },
{ {
message: message:
"Destination must be a valid IP address or domain name for host mode" "Destination must be a valid IP address or valid domain AND alias is required"
} }
) )
.refine( .refine(

View File

@@ -59,23 +59,27 @@ const updateSiteResourceSchema = z
.refine( .refine(
(data) => { (data) => {
if (data.mode === "host" && data.destination) { if (data.mode === "host" && data.destination) {
// Check if it's a valid IP address using zod (v4 or v6)
const isValidIP = z const isValidIP = z
.union([z.ipv4(), z.ipv6()]) .union([z.ipv4(), z.ipv6()])
.safeParse(data.destination).success; .safeParse(data.destination).success;
if (isValidIP) {
return true;
}
// Check if it's a valid domain (hostname pattern, TLD not required) // Check if it's a valid domain (hostname pattern, TLD not required)
const domainRegex = const domainRegex =
/^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)*[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/; /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)*[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;
const isValidDomain = domainRegex.test(data.destination); const isValidDomain = domainRegex.test(data.destination);
const isValidAlias = data.alias && domainRegex.test(data.alias);
return isValidIP || isValidDomain; return isValidDomain && isValidAlias; // require the alias to be set in the case of domain
} }
return true; return true;
}, },
{ {
message: message:
"Destination must be a valid IP address or domain name for host mode" "Destination must be a valid IP address or valid domain AND alias is required"
} }
) )
.refine( .refine(
@@ -317,6 +321,7 @@ export async function updateSiteResource(
); );
} }
let oldDestinationStillInUseByASite = false;
// Only update targets on newt if destination changed // Only update targets on newt if destination changed
if (destinationChanged) { if (destinationChanged) {
const oldTargets = generateSubnetProxyTargets( const oldTargets = generateSubnetProxyTargets(
@@ -332,6 +337,26 @@ export async function updateSiteResource(
oldTargets: oldTargets, oldTargets: oldTargets,
newTargets: newTargets newTargets: newTargets
}); });
const oldDestinationStillInUseSites = await trx
.select()
.from(siteResources)
.where(
and(
eq(siteResources.siteId, site.siteId),
eq(
siteResources.destination,
existingSiteResource.destination
),
ne(
siteResources.siteResourceId,
existingSiteResource.siteResourceId
)
)
);
oldDestinationStillInUseByASite =
oldDestinationStillInUseSites.length > 0;
} }
const olmJobs: Promise<void>[] = []; const olmJobs: Promise<void>[] = [];
@@ -341,22 +366,29 @@ export async function updateSiteResource(
updatePeerData( updatePeerData(
client.clientId, client.clientId,
updatedSiteResource.siteId, updatedSiteResource.siteId,
destinationChanged ? { destinationChanged
oldRemoteSubnets: generateRemoteSubnets([ ? {
existingSiteResource oldRemoteSubnets:
]), !oldDestinationStillInUseByASite
newRemoteSubnets: generateRemoteSubnets([ ? generateRemoteSubnets([
updatedSiteResource existingSiteResource
]) ])
} : undefined, : [],
aliasChanged ? { newRemoteSubnets: generateRemoteSubnets([
oldAliases: generateAliasConfig([ updatedSiteResource
existingSiteResource ])
]), }
newAliases: generateAliasConfig([ : undefined,
updatedSiteResource aliasChanged
]) ? {
} : undefined oldAliases: generateAliasConfig([
existingSiteResource
]),
newAliases: generateAliasConfig([
updatedSiteResource
])
}
: undefined
) )
); );
} }