include exit node endpoint in tcp/udp resources

This commit is contained in:
miloschwartz
2026-06-30 21:54:27 -04:00
parent 376dd465b3
commit f4854a3a74
2 changed files with 44 additions and 7 deletions

View File

@@ -1,3 +1,5 @@
import { formatEndpoint, parseEndpoint } from "@server/lib/ip";
export type SiteResourceDestinationInput = { export type SiteResourceDestinationInput = {
mode: "host" | "cidr" | "http" | "ssh"; mode: "host" | "cidr" | "http" | "ssh";
destination: string | null; destination: string | null;
@@ -40,6 +42,7 @@ export type PublicResourceAccessInput = {
ssl: boolean; ssl: boolean;
proxyPort: number | null; proxyPort: number | null;
wildcard: boolean; wildcard: boolean;
exitNodeEndpoint?: string | null;
}; };
export type SiteResourceAccessInput = { export type SiteResourceAccessInput = {
@@ -59,12 +62,20 @@ export type LauncherAccessFields = {
accessUrl: string | null; accessUrl: string | null;
}; };
export function formatPublicResourceAccess( function formatTcpUdpResourceAccess(
resource: PublicResourceAccessInput exitNodeEndpoint: string | null | undefined,
proxyPort: number | null
): LauncherAccessFields { ): LauncherAccessFields {
const browserModes = ["http", "ssh", "rdp", "vnc"]; if (proxyPort == null) {
if (!browserModes.includes(resource.mode)) { return {
const port = resource.proxyPort?.toString() ?? ""; accessDisplay: "",
accessCopyValue: "",
accessUrl: null
};
}
if (!exitNodeEndpoint?.trim()) {
const port = proxyPort.toString();
return { return {
accessDisplay: port, accessDisplay: port,
accessCopyValue: port, accessCopyValue: port,
@@ -72,6 +83,28 @@ export function formatPublicResourceAccess(
}; };
} }
const parsed = parseEndpoint(exitNodeEndpoint);
const host = parsed?.ip ?? exitNodeEndpoint.trim();
const access = formatEndpoint(host, proxyPort);
return {
accessDisplay: access,
accessCopyValue: access,
accessUrl: null
};
}
export function formatPublicResourceAccess(
resource: PublicResourceAccessInput
): LauncherAccessFields {
const browserModes = ["http", "ssh", "rdp", "vnc"];
if (!browserModes.includes(resource.mode)) {
return formatTcpUdpResourceAccess(
resource.exitNodeEndpoint,
resource.proxyPort
);
}
if (!resource.fullDomain) { if (!resource.fullDomain) {
return { return {
accessDisplay: "", accessDisplay: "",

View File

@@ -1,5 +1,6 @@
import { db } from "@server/db"; import { db } from "@server/db";
import { import {
exitNodes,
labels, labels,
launcherViews, launcherViews,
resourceLabels, resourceLabels,
@@ -860,11 +861,13 @@ async function mapPublicResources(
siteId: sites.siteId, siteId: sites.siteId,
siteName: sites.name, siteName: sites.name,
siteType: sites.type, siteType: sites.type,
siteOnline: sites.online siteOnline: sites.online,
exitNodeEndpoint: exitNodes.endpoint
}) })
.from(resources) .from(resources)
.leftJoin(targets, eq(targets.resourceId, resources.resourceId)) .leftJoin(targets, eq(targets.resourceId, resources.resourceId))
.leftJoin(sites, eq(targets.siteId, sites.siteId)) .leftJoin(sites, eq(targets.siteId, sites.siteId))
.leftJoin(exitNodes, eq(sites.exitNodeId, exitNodes.exitNodeId))
.where( .where(
and( and(
inArray(resources.resourceId, resourceIds), inArray(resources.resourceId, resourceIds),
@@ -891,7 +894,8 @@ async function mapPublicResources(
fullDomain: row.fullDomain, fullDomain: row.fullDomain,
ssl: row.ssl, ssl: row.ssl,
proxyPort: row.proxyPort, proxyPort: row.proxyPort,
wildcard: row.wildcard wildcard: row.wildcard,
exitNodeEndpoint: row.exitNodeEndpoint
}); });
result.push({ result.push({