mirror of
https://github.com/fosrl/pangolin.git
synced 2026-02-27 15:26:41 +00:00
Fix a couple things wiht destinations
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user