From 19a3773880e3f772ad38713c188559a288ed7d90 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 8 Jul 2026 16:23:53 -0400 Subject: [PATCH 01/28] Update ironrdp Ref #3272 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b7196dcf..378a1f26c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@asteasolutions/zod-to-openapi": "8.5.0", "@aws-sdk/client-s3": "3.1056.0", "@devolutions/iron-remote-desktop": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-0.0.0.tgz", - "@devolutions/iron-remote-desktop-rdp": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-rdp-0.0.0.tgz", + "@devolutions/iron-remote-desktop-rdp": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-rdp-0.0.1.tgz", "@headlessui/react": "2.2.10", "@hookform/resolvers": "5.4.0", "@monaco-editor/react": "4.7.0", @@ -1124,9 +1124,9 @@ "integrity": "sha512-9o7PkCw9fdvGTPs0hgsUJG10QleGgcdsSCw1ekLpUOlVXtWCuiuPH+0bPDFhLWxqbVA+8pyVhwqdOI+t1T3TNA==" }, "node_modules/@devolutions/iron-remote-desktop-rdp": { - "version": "0.0.0", - "resolved": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-rdp-0.0.0.tgz", - "integrity": "sha512-O0YVpOJDwUzekH3N2QKj+48WP+56wI0sj4VmaJkGoW5XgyAj2ONn2k3i+vk17Eavx+Vg6vAg3lwYRAOK4kKIDQ==" + "version": "0.0.1", + "resolved": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-rdp-0.0.1.tgz", + "integrity": "sha512-sIHllJ6rJfAgClsUFjJfVGFjIxm6ZQRyGfinwCzHYgwnHAMFE+Kvm0YzR9tg811Fhjm5F6gNUSLAll+7Eh0Deg==" }, "node_modules/@dotenvx/dotenvx": { "version": "1.69.1", diff --git a/package.json b/package.json index aba0c40d8..15ef7bda5 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "dependencies": { "@asteasolutions/zod-to-openapi": "8.5.0", "@devolutions/iron-remote-desktop": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-0.0.0.tgz", - "@devolutions/iron-remote-desktop-rdp": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-rdp-0.0.0.tgz", + "@devolutions/iron-remote-desktop-rdp": "https://static.pangolin.net/packages/devolutions-iron-remote-desktop-rdp-0.0.1.tgz", "@aws-sdk/client-s3": "3.1056.0", "@headlessui/react": "2.2.10", "@hookform/resolvers": "5.4.0", From 67a3d226f55146c8cdbc56868b1ceacebad0e4e2 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 8 Jul 2026 21:15:35 -0400 Subject: [PATCH 02/28] Add session creation --- messages/bg-BG.json | 1 + messages/cs-CZ.json | 1 + messages/da-DK.json | 1 + messages/de-DE.json | 1 + messages/en-US.json | 1 + messages/es-ES.json | 1 + messages/fr-FR.json | 1 + messages/it-IT.json | 1 + messages/ko-KR.json | 1 + messages/nb-NO.json | 1 + messages/nl-NL.json | 1 + messages/pl-PL.json | 1 + messages/pt-PT.json | 1 + messages/ru-RU.json | 1 + messages/tr-TR.json | 1 + messages/zh-CN.json | 1 + messages/zh-TW.json | 1 + server/auth/actions.ts | 1 + server/routers/integration.ts | 10 ++ .../resource/createResourceSessionToken.ts | 133 ++++++++++++++++++ server/routers/resource/index.ts | 1 + src/components/PermissionsSelectBox.tsx | 3 +- 22 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 server/routers/resource/createResourceSessionToken.ts diff --git a/messages/bg-BG.json b/messages/bg-BG.json index 0b8a3cc6a..a26cfc443 100644 --- a/messages/bg-BG.json +++ b/messages/bg-BG.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Генериране на токен за достъп", "actionDeleteAccessToken": "Изтриване на токен за достъп", "actionListAccessTokens": "Изброяване на токени за достъп", + "actionCreateResourceSessionToken": "Създаване на токен за сесия на ресурс", "actionCreateResourceRule": "Създаване на правило за ресурс", "actionDeleteResourceRule": "Изтрийте правило за ресурс", "actionListResourceRules": "Изброяване на правила за ресурс", diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json index 31586b8d3..d821c0642 100644 --- a/messages/cs-CZ.json +++ b/messages/cs-CZ.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Generovat přístupový token", "actionDeleteAccessToken": "Odstranit přístupový token", "actionListAccessTokens": "Seznam přístupových tokenů", + "actionCreateResourceSessionToken": "Vytvořit token relace prostředku", "actionCreateResourceRule": "Vytvořit pravidlo pro zdroj", "actionDeleteResourceRule": "Odstranit pravidlo pro dokument", "actionListResourceRules": "Seznam pravidel zdrojů", diff --git a/messages/da-DK.json b/messages/da-DK.json index f6e0462ed..ba6ca1a88 100644 --- a/messages/da-DK.json +++ b/messages/da-DK.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Generer adgangstoken", "actionDeleteAccessToken": "Slet adgangstoken", "actionListAccessTokens": "Vis adgangstokens", + "actionCreateResourceSessionToken": "Opret ressourcesessionstoken", "actionCreateResourceRule": "Opret ressourceregel", "actionDeleteResourceRule": "Slet ressourceregel", "actionListResourceRules": "Vis ressourceregler", diff --git a/messages/de-DE.json b/messages/de-DE.json index 16edb164a..b1776525e 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Zugriffstoken generieren", "actionDeleteAccessToken": "Zugriffstoken löschen", "actionListAccessTokens": "Zugriffstoken auflisten", + "actionCreateResourceSessionToken": "Ressourcensitzungstoken erstellen", "actionCreateResourceRule": "Ressourcenregel erstellen", "actionDeleteResourceRule": "Ressourcenregel löschen", "actionListResourceRules": "Ressourcenregeln auflisten", diff --git a/messages/en-US.json b/messages/en-US.json index 24735be61..3b07d1ab9 100644 --- a/messages/en-US.json +++ b/messages/en-US.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Generate Access Token", "actionDeleteAccessToken": "Delete Access Token", "actionListAccessTokens": "List Access Tokens", + "actionCreateResourceSessionToken": "Create Resource Session Token", "actionCreateResourceRule": "Create Resource Rule", "actionDeleteResourceRule": "Delete Resource Rule", "actionListResourceRules": "List Resource Rules", diff --git a/messages/es-ES.json b/messages/es-ES.json index 7edeb5990..6045d43e9 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Generar token de acceso", "actionDeleteAccessToken": "Eliminar token de acceso", "actionListAccessTokens": "Lista de Tokens de Acceso", + "actionCreateResourceSessionToken": "Crear token de sesión de recurso", "actionCreateResourceRule": "Crear Regla de Recursos", "actionDeleteResourceRule": "Eliminar Regla de Recurso", "actionListResourceRules": "Lista de Reglas de Recursos", diff --git a/messages/fr-FR.json b/messages/fr-FR.json index d204a2370..cc90cc919 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Générer un jeton d'accès", "actionDeleteAccessToken": "Supprimer un jeton d'accès", "actionListAccessTokens": "Lister les jetons d'accès", + "actionCreateResourceSessionToken": "Créer un jeton de session de ressource", "actionCreateResourceRule": "Créer une règle de ressource", "actionDeleteResourceRule": "Supprimer une règle de ressource", "actionListResourceRules": "Lister les règles de ressource", diff --git a/messages/it-IT.json b/messages/it-IT.json index 156ea239e..eb263b0d1 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Genera Token di Accesso", "actionDeleteAccessToken": "Elimina Token di Accesso", "actionListAccessTokens": "Elenca Token di Accesso", + "actionCreateResourceSessionToken": "Crea token di sessione risorsa", "actionCreateResourceRule": "Crea Regola Risorsa", "actionDeleteResourceRule": "Elimina Regola Risorsa", "actionListResourceRules": "Elenca Regole Risorsa", diff --git a/messages/ko-KR.json b/messages/ko-KR.json index f357fec22..9e5f6ed5c 100644 --- a/messages/ko-KR.json +++ b/messages/ko-KR.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "액세스 토큰 생성", "actionDeleteAccessToken": "액세스 토큰 삭제", "actionListAccessTokens": "액세스 토큰 목록", + "actionCreateResourceSessionToken": "리소스 세션 토큰 생성", "actionCreateResourceRule": "리소스 규칙 생성", "actionDeleteResourceRule": "리소스 규칙 삭제", "actionListResourceRules": "리소스 규칙 목록", diff --git a/messages/nb-NO.json b/messages/nb-NO.json index 37cec416f..ad815ba32 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Generer tilgangstoken", "actionDeleteAccessToken": "Slett tilgangstoken", "actionListAccessTokens": "List opp tilgangstokener", + "actionCreateResourceSessionToken": "Opprett ressurssesjonstoken", "actionCreateResourceRule": "Opprett ressursregel", "actionDeleteResourceRule": "Slett ressursregel", "actionListResourceRules": "List opp ressursregler", diff --git a/messages/nl-NL.json b/messages/nl-NL.json index 860fef6fb..8a19211d6 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Genereer Toegangstoken", "actionDeleteAccessToken": "Verwijder toegangstoken", "actionListAccessTokens": "Lijst toegangstokens", + "actionCreateResourceSessionToken": "Resourcesessietoken maken", "actionCreateResourceRule": "Bronregel aanmaken", "actionDeleteResourceRule": "Verwijder Resource Regel", "actionListResourceRules": "Bron regels weergeven", diff --git a/messages/pl-PL.json b/messages/pl-PL.json index 4ddaf757a..1fc95a73c 100644 --- a/messages/pl-PL.json +++ b/messages/pl-PL.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Wygeneruj token dostępu", "actionDeleteAccessToken": "Usuń token dostępu", "actionListAccessTokens": "Lista tokenów dostępu", + "actionCreateResourceSessionToken": "Utwórz token sesji zasobu", "actionCreateResourceRule": "Utwórz regułę zasobu", "actionDeleteResourceRule": "Usuń regułę zasobu", "actionListResourceRules": "Lista reguł zasobu", diff --git a/messages/pt-PT.json b/messages/pt-PT.json index 1313711e2..762a87e59 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Gerar Token de Acesso", "actionDeleteAccessToken": "Eliminar Token de Acesso", "actionListAccessTokens": "Listar Tokens de Acesso", + "actionCreateResourceSessionToken": "Criar token de sessão de recurso", "actionCreateResourceRule": "Criar Regra de Recurso", "actionDeleteResourceRule": "Eliminar Regra de Recurso", "actionListResourceRules": "Listar Regras de Recurso", diff --git a/messages/ru-RU.json b/messages/ru-RU.json index 91d5bd427..07dc3b7a1 100644 --- a/messages/ru-RU.json +++ b/messages/ru-RU.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Сгенерировать токен доступа", "actionDeleteAccessToken": "Удалить токен доступа", "actionListAccessTokens": "Список токенов доступа", + "actionCreateResourceSessionToken": "Создать токен сеанса ресурса", "actionCreateResourceRule": "Создать правило ресурса", "actionDeleteResourceRule": "Удалить правило ресурса", "actionListResourceRules": "Список правил ресурса", diff --git a/messages/tr-TR.json b/messages/tr-TR.json index 9f6cecd1e..7097b48dc 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "Erişim Jetonu Oluştur", "actionDeleteAccessToken": "Erişim Jetonunu Sil", "actionListAccessTokens": "Erişim Jetonlarını Listele", + "actionCreateResourceSessionToken": "Kaynak Oturum Belirteci Oluştur", "actionCreateResourceRule": "Kaynak Kuralı Oluştur", "actionDeleteResourceRule": "Kaynak Kuralını Sil", "actionListResourceRules": "Kaynak Kurallarını Listele", diff --git a/messages/zh-CN.json b/messages/zh-CN.json index 58b458265..362282d15 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -1462,6 +1462,7 @@ "actionGenerateAccessToken": "生成访问令牌", "actionDeleteAccessToken": "删除访问令牌", "actionListAccessTokens": "访问令牌", + "actionCreateResourceSessionToken": "创建资源会话令牌", "actionCreateResourceRule": "创建资源规则", "actionDeleteResourceRule": "删除资源规则", "actionListResourceRules": "列出资源规则", diff --git a/messages/zh-TW.json b/messages/zh-TW.json index 6eb103d3a..c37430567 100644 --- a/messages/zh-TW.json +++ b/messages/zh-TW.json @@ -1099,6 +1099,7 @@ "actionGenerateAccessToken": "生成訪問令牌", "actionDeleteAccessToken": "刪除訪問令牌", "actionListAccessTokens": "訪問令牌", + "actionCreateResourceSessionToken": "建立資源工作階段權杖", "actionCreateResourceRule": "創建資源規則", "actionDeleteResourceRule": "刪除資源規則", "actionListResourceRules": "列出資源規則", diff --git a/server/auth/actions.ts b/server/auth/actions.ts index e47f94d74..50c98c528 100644 --- a/server/auth/actions.ts +++ b/server/auth/actions.ts @@ -71,6 +71,7 @@ export enum ActionsEnum { setResourceWhitelist = "setResourceWhitelist", getResourceWhitelist = "getResourceWhitelist", generateAccessToken = "generateAccessToken", + createResourceSessionToken = "createResourceSessionToken", deleteAcessToken = "deleteAcessToken", listAccessTokens = "listAccessTokens", createResourceRule = "createResourceRule", diff --git a/server/routers/integration.ts b/server/routers/integration.ts index fb3486fd7..74ea20078 100644 --- a/server/routers/integration.ts +++ b/server/routers/integration.ts @@ -808,6 +808,16 @@ authenticated.post( accessToken.generateAccessToken ); +authenticated.post( + `/resource/:resourceId/session-token`, + verifyApiKeyResourceAccess, + verifyApiKeyUserAccess, + verifyLimits, + verifyApiKeyHasAction(ActionsEnum.createResourceSessionToken), + logActionAudit(ActionsEnum.createResourceSessionToken), + resource.createResourceSessionToken +); + authenticated.delete( `/access-token/:accessTokenId`, verifyApiKeyAccessTokenAccess, diff --git a/server/routers/resource/createResourceSessionToken.ts b/server/routers/resource/createResourceSessionToken.ts new file mode 100644 index 000000000..82f0d0cbf --- /dev/null +++ b/server/routers/resource/createResourceSessionToken.ts @@ -0,0 +1,133 @@ +import { Request, Response, NextFunction } from "express"; +import { z } from "zod"; +import { db } from "@server/db"; +import { resources, users, userOrgs } from "@server/db"; +import { eq, and } from "drizzle-orm"; +import { createResourceSession } from "@server/auth/sessions/resource"; +import HttpCode from "@server/types/HttpCode"; +import createHttpError from "http-errors"; +import { fromError } from "zod-validation-error"; +import logger from "@server/logger"; +import { createSession, generateSessionToken } from "@server/auth/sessions/app"; +import { response } from "@server/lib/response"; + +const createResourceSessionTokenParams = z.strictObject({ + resourceId: z.coerce.number().int().positive() +}); + +const createResourceSessionTokenBody = z.strictObject({ + userId: z.string().nonempty(), + idpId: z.coerce.number().int().positive().optional() +}); + +export type CreateResourceSessionTokenResponse = { + requestToken: string; +}; + +export async function createResourceSessionToken( + req: Request, + res: Response, + next: NextFunction +): Promise { + try { + const parsedParams = createResourceSessionTokenParams.safeParse( + req.params + ); + if (!parsedParams.success) { + return next( + createHttpError( + HttpCode.BAD_REQUEST, + fromError(parsedParams.error).toString() + ) + ); + } + + const parsedBody = createResourceSessionTokenBody.safeParse(req.body); + if (!parsedBody.success) { + return next( + createHttpError( + HttpCode.BAD_REQUEST, + fromError(parsedBody.error).toString() + ) + ); + } + + const { resourceId } = parsedParams.data; + const { userId, idpId } = parsedBody.data; + + const [resource] = await db + .select() + .from(resources) + .where(eq(resources.resourceId, resourceId)) + .limit(1); + + if (!resource) { + return next( + createHttpError( + HttpCode.NOT_FOUND, + `Resource with ID ${resourceId} not found` + ) + ); + } + + const candidates = await db + .select({ userId: users.userId }) + .from(userOrgs) + .innerJoin(users, eq(userOrgs.userId, users.userId)) + .where( + and( + eq(users.userId, userId), + eq(userOrgs.orgId, resource.orgId) + ) + ); + + if (candidates.length === 0) { + return next( + createHttpError( + HttpCode.NOT_FOUND, + `User not found in the organization that owns this resource` + ) + ); + } + + if (candidates.length > 1) { + return next( + createHttpError( + HttpCode.BAD_REQUEST, + "Multiple users match this username (external users from different identity providers). Specify idpId to disambiguate." + ) + ); + } + + const targetUserId = candidates[0].userId; + + const appSessionToken = generateSessionToken(); + const appSession = await createSession(appSessionToken, targetUserId); + + const requestToken = generateSessionToken(); + await createResourceSession({ + resourceId, + token: requestToken, + userSessionId: appSession.sessionId, + isRequestToken: true, + expiresAt: Date.now() + 1000 * 30, // 30 seconds + sessionLength: 1000 * 30, + doNotExtend: true + }); + + logger.debug("Resource session token created successfully"); + + return response(res, { + data: { requestToken }, + success: true, + error: false, + message: "Resource session token created successfully", + status: HttpCode.OK + }); + } catch (error) { + logger.error(error); + return next( + createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred") + ); + } +} diff --git a/server/routers/resource/index.ts b/server/routers/resource/index.ts index 83dbdea2a..4bc9d20f0 100644 --- a/server/routers/resource/index.ts +++ b/server/routers/resource/index.ts @@ -17,6 +17,7 @@ export * from "./getResourceWhitelist"; export * from "./authWithWhitelist"; export * from "./authWithAccessToken"; export * from "./getExchangeToken"; +export * from "./createResourceSessionToken"; export * from "./createResourceRule"; export * from "./deleteResourceRule"; export * from "./listResourceRules"; diff --git a/src/components/PermissionsSelectBox.tsx b/src/components/PermissionsSelectBox.tsx index 8f9236b2b..06d9ff690 100644 --- a/src/components/PermissionsSelectBox.tsx +++ b/src/components/PermissionsSelectBox.tsx @@ -77,7 +77,8 @@ function getActionsCategories(root: boolean) { [t("actionDeleteSiteResource")]: "deleteSiteResource", [t("actionGetSiteResource")]: "getSiteResource", [t("actionListSiteResources")]: "listSiteResources", - [t("actionUpdateSiteResource")]: "updateSiteResource" + [t("actionUpdateSiteResource")]: "updateSiteResource", + [t("actionCreateResourceSessionToken")]: "createResourceSessionToken" }, Target: { From 6d129c073834f8e344373eb9de51d08ccf5efb24 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 8 Jul 2026 21:44:20 -0400 Subject: [PATCH 03/28] Fix #3099 --- server/routers/badger/verifySession.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/routers/badger/verifySession.ts b/server/routers/badger/verifySession.ts index 987d7e061..cf36fef72 100644 --- a/server/routers/badger/verifySession.ts +++ b/server/routers/badger/verifySession.ts @@ -736,11 +736,14 @@ export async function verifyResourceSession( } } - // If headerAuthExtendedCompatibility is activated but no clientHeaderAuth provided, force client to challenge + // If headerAuthExtendedCompatibility is activated but no clientHeaderAuth provided, force client to challenge. + // Skip the challenge when SSO is also enabled so browsers get the SSO redirect instead of a native Basic + // Auth dialog; clients that proactively send Authorization: Basic are still accepted above. if ( headerAuthExtendedCompatibility && headerAuthExtendedCompatibility.extendedCompatibilityIsActivated && - !clientHeaderAuth + !clientHeaderAuth && + !sso ) { return headerAuthChallenged(res, redirectPath, resource.orgId); } From facb1e4cdfc7d8b8401c011af6145cc30f630865 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:11 -0400 Subject: [PATCH 04/28] New translations en-us.json (Spanish) [ci skip] --- messages/es-ES.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/es-ES.json b/messages/es-ES.json index 6045d43e9..a0cee9bf6 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -1462,7 +1462,7 @@ "actionGenerateAccessToken": "Generar token de acceso", "actionDeleteAccessToken": "Eliminar token de acceso", "actionListAccessTokens": "Lista de Tokens de Acceso", - "actionCreateResourceSessionToken": "Crear token de sesión de recurso", + "actionCreateResourceSessionToken": "Crear Token de Sesión de Recurso", "actionCreateResourceRule": "Crear Regla de Recursos", "actionDeleteResourceRule": "Eliminar Regla de Recurso", "actionListResourceRules": "Lista de Reglas de Recursos", From 2ff2e32e9cb9e87cafc98f58b78f033ebaf396bb Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:16 -0400 Subject: [PATCH 05/28] New translations en-us.json (Danish) [ci skip] --- messages/da-DK.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/messages/da-DK.json b/messages/da-DK.json index ba6ca1a88..265bcf873 100644 --- a/messages/da-DK.json +++ b/messages/da-DK.json @@ -1462,7 +1462,7 @@ "actionGenerateAccessToken": "Generer adgangstoken", "actionDeleteAccessToken": "Slet adgangstoken", "actionListAccessTokens": "Vis adgangstokens", - "actionCreateResourceSessionToken": "Opret ressourcesessionstoken", + "actionCreateResourceSessionToken": "Opret ressourcessession token", "actionCreateResourceRule": "Opret ressourceregel", "actionDeleteResourceRule": "Slet ressourceregel", "actionListResourceRules": "Vis ressourceregler", @@ -2547,7 +2547,7 @@ "noRemoteExitNodesAvailableDescription": "Ingen noder er tilgængelige for denne organisation. Opret en node først for at bruge lokale sites.", "exitNode": "Exitnode", "country": "Land", - "countryIsNot": "Country Is Not", + "countryIsNot": "Land er ikke", "rulesMatchCountry": "I øjeblikket baseret på kilde-IP", "region": "Fylke", "selectRegion": "Vælg region", @@ -3269,7 +3269,7 @@ "editInternalResourceDialogAddUsers": "Tilføj brugere", "editInternalResourceDialogAddClients": "Tilføj klienter", "editInternalResourceDialogDestinationLabel": "Destination", - "editInternalResourceDialogDestinationDescription": "Choose where this resource runs and how clients reach it", + "editInternalResourceDialogDestinationDescription": "Vælg, hvor denne ressource kører, og hvordan klienter får adgang til den", "internalResourceFormMultiSiteRoutingHelp": "Valg af flere sites muliggør robust routing og failover for høj tilgængelighed.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Læs mere", "editInternalResourceDialogPortRestrictionsDescription": "Begrens adgang til specifikke TCP/UDP-porte eller tillade/blokere alle porte.", From 11f5cfd4f85a34cbf357ac9ca55a1191627dfd93 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:18 -0400 Subject: [PATCH 06/28] New translations en-us.json (German) [ci skip] --- messages/de-DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/de-DE.json b/messages/de-DE.json index b1776525e..f16d91331 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -3680,7 +3680,7 @@ "resourceLauncherSaveForEveryoneDescription": "Teilen Sie diese Ansicht mit allen Organisationsmitgliedern. Wenn nicht aktiviert, ist die Ansicht nur für Sie sichtbar.", "resourceLauncherMakePersonal": "Persönlich machen", "resourceLauncherFilter": "Filter", - "resourceLauncherFilterWithCount": "Filter, {count} applied", + "resourceLauncherFilterWithCount": "Filter, {count} angewendet", "resourceLauncherSort": "Sortieren", "resourceLauncherSortAscending": "Aufsteigend sortieren", "resourceLauncherSortDescending": "Absteigend sortieren", From b9aedc65feebc63617cfd215590f916cf4b685e9 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:20 -0400 Subject: [PATCH 07/28] New translations en-us.json (Italian) [ci skip] --- messages/it-IT.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/it-IT.json b/messages/it-IT.json index eb263b0d1..0fdf0ed24 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -1462,7 +1462,7 @@ "actionGenerateAccessToken": "Genera Token di Accesso", "actionDeleteAccessToken": "Elimina Token di Accesso", "actionListAccessTokens": "Elenca Token di Accesso", - "actionCreateResourceSessionToken": "Crea token di sessione risorsa", + "actionCreateResourceSessionToken": "Crea Token di Sessione della Risorsa", "actionCreateResourceRule": "Crea Regola Risorsa", "actionDeleteResourceRule": "Elimina Regola Risorsa", "actionListResourceRules": "Elenca Regole Risorsa", From 843b9a0b16b5f5cab56893fd39473a09d830536b Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:23 -0400 Subject: [PATCH 08/28] New translations en-us.json (Dutch) [ci skip] --- messages/nl-NL.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/nl-NL.json b/messages/nl-NL.json index 8a19211d6..ea0e69b03 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -1462,7 +1462,7 @@ "actionGenerateAccessToken": "Genereer Toegangstoken", "actionDeleteAccessToken": "Verwijder toegangstoken", "actionListAccessTokens": "Lijst toegangstokens", - "actionCreateResourceSessionToken": "Resourcesessietoken maken", + "actionCreateResourceSessionToken": "Maak Resource Sessie Token", "actionCreateResourceRule": "Bronregel aanmaken", "actionDeleteResourceRule": "Verwijder Resource Regel", "actionListResourceRules": "Bron regels weergeven", From 199e960f6da16bfcfac010fba9ba15fa6633894b Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:26 -0400 Subject: [PATCH 09/28] New translations en-us.json (Portuguese) [ci skip] --- messages/pt-PT.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/pt-PT.json b/messages/pt-PT.json index 762a87e59..8b63ce459 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -1462,7 +1462,7 @@ "actionGenerateAccessToken": "Gerar Token de Acesso", "actionDeleteAccessToken": "Eliminar Token de Acesso", "actionListAccessTokens": "Listar Tokens de Acesso", - "actionCreateResourceSessionToken": "Criar token de sessão de recurso", + "actionCreateResourceSessionToken": "Criar Token de Sessão de Recurso", "actionCreateResourceRule": "Criar Regra de Recurso", "actionDeleteResourceRule": "Eliminar Regra de Recurso", "actionListResourceRules": "Listar Regras de Recurso", From d71c112959603bc2fb7c5f2d2e5eddfee9233d06 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:30 -0400 Subject: [PATCH 10/28] New translations en-us.json (Turkish) [ci skip] --- messages/tr-TR.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/tr-TR.json b/messages/tr-TR.json index 7097b48dc..76869a12a 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -1462,7 +1462,7 @@ "actionGenerateAccessToken": "Erişim Jetonu Oluştur", "actionDeleteAccessToken": "Erişim Jetonunu Sil", "actionListAccessTokens": "Erişim Jetonlarını Listele", - "actionCreateResourceSessionToken": "Kaynak Oturum Belirteci Oluştur", + "actionCreateResourceSessionToken": "Kaynak Oturum Otomasyonu Oluştur", "actionCreateResourceRule": "Kaynak Kuralı Oluştur", "actionDeleteResourceRule": "Kaynak Kuralını Sil", "actionListResourceRules": "Kaynak Kurallarını Listele", From e22f30c6943dbbbc3a39b8abc3bc9d92373bc4d1 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 09:59:33 -0400 Subject: [PATCH 11/28] New translations en-us.json (Norwegian Bokmal) [ci skip] --- messages/nb-NO.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/nb-NO.json b/messages/nb-NO.json index ad815ba32..2e8928f5c 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -1462,7 +1462,7 @@ "actionGenerateAccessToken": "Generer tilgangstoken", "actionDeleteAccessToken": "Slett tilgangstoken", "actionListAccessTokens": "List opp tilgangstokener", - "actionCreateResourceSessionToken": "Opprett ressurssesjonstoken", + "actionCreateResourceSessionToken": "Opprett ressurs økt-token", "actionCreateResourceRule": "Opprett ressursregel", "actionDeleteResourceRule": "Slett ressursregel", "actionListResourceRules": "List opp ressursregler", From b6ed7627240cac679401ccf8aa213d87a51be846 Mon Sep 17 00:00:00 2001 From: Owen Date: Thu, 9 Jul 2026 10:18:26 -0400 Subject: [PATCH 12/28] Sort before inserting --- server/routers/newt/pingAccumulator.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/server/routers/newt/pingAccumulator.ts b/server/routers/newt/pingAccumulator.ts index f82190790..6d788cc84 100644 --- a/server/routers/newt/pingAccumulator.ts +++ b/server/routers/newt/pingAccumulator.ts @@ -94,7 +94,13 @@ async function flushSitePingsToDb(): Promise { const pingsToFlush = new Map(pendingSitePings); pendingSitePings.clear(); - const entries = Array.from(pingsToFlush.entries()); + // Sort by id ascending so concurrent writers (other app replicas, or + // unrelated single-row updates elsewhere in the app) always acquire row + // locks in the same order. Without this, overlapping batches/updates + // that touch the same rows in different orders can deadlock each other. + const entries = Array.from(pingsToFlush.entries()).sort( + ([a], [b]) => a - b + ); const BATCH_SIZE = 50; for (let i = 0; i < entries.length; i += BATCH_SIZE) { @@ -193,7 +199,11 @@ async function flushClientPingsToDb(): Promise { // ── Flush client pings ───────────────────────────────────────────── if (pingsToFlush.size > 0) { - const entries = Array.from(pingsToFlush.entries()); + // Sort ascending for consistent lock ordering (see note in + // flushSitePingsToDb). + const entries = Array.from(pingsToFlush.entries()).sort( + ([a], [b]) => a - b + ); const BATCH_SIZE = 50; for (let i = 0; i < entries.length; i += BATCH_SIZE) { From 7a0a877dc0f753dc54f5430dba94e90cb5262d5f Mon Sep 17 00:00:00 2001 From: miloschwartz Date: Thu, 9 Jul 2026 10:27:45 -0400 Subject: [PATCH 13/28] fix create private resource ports default to blocked --- messages/en-US.json | 3 ++- .../private/PrivateResourcePortRanges.tsx | 14 ++++++++++---- .../resources/private/[niceId]/general/page.tsx | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/messages/en-US.json b/messages/en-US.json index 3b07d1ab9..c077f9a48 100644 --- a/messages/en-US.json +++ b/messages/en-US.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Close", "createInternalResourceDialogCreateClientResource": "Create Private Resource", "createInternalResourceDialogCreateClientResourceDescription": "Create a new resource that will only be accessible to clients connected to the organization", + "privateResourceGeneralDescription": "Configure the name, identifier, and other general resource settings.", "privateResourceCreatePageSeeAll": "See All Private Resources", "privateResourceAllowIcmpPing": "Allow ICMP Ping", "privateResourceNetworkAccess": "Network Access", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Add Users", "editInternalResourceDialogAddClients": "Add Clients", "editInternalResourceDialogDestinationLabel": "Destination", - "editInternalResourceDialogDestinationDescription": "Choose where this resource runs and how clients reach it", + "editInternalResourceDialogDestinationDescription": "Configure how clients reach this resource.", "internalResourceFormMultiSiteRoutingHelp": "Selecting multiple sites enables resilient routing and failover for high availability.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Learn more", "editInternalResourceDialogPortRestrictionsDescription": "Restrict access to specific TCP/UDP ports or allow/block all ports.", diff --git a/src/app/[orgId]/settings/resources/private/PrivateResourcePortRanges.tsx b/src/app/[orgId]/settings/resources/private/PrivateResourcePortRanges.tsx index 7af87dd9c..e4b6d727c 100644 --- a/src/app/[orgId]/settings/resources/private/PrivateResourcePortRanges.tsx +++ b/src/app/[orgId]/settings/resources/private/PrivateResourcePortRanges.tsx @@ -106,17 +106,23 @@ export function PrivateResourceNetworkAccessFields({ embedInParentGrid = false }: PrivateResourceNetworkAccessFieldsProps) { const t = useTranslations(); + const resolvedInitialTcp = initialTcp !== undefined ? initialTcp : "*"; + const resolvedInitialUdp = initialUdp !== undefined ? initialUdp : "*"; const [tcpPortMode, setTcpPortMode] = useState(() => - getPortModeFromString(initialTcp) + getPortModeFromString(resolvedInitialTcp) ); const [udpPortMode, setUdpPortMode] = useState(() => - getPortModeFromString(initialUdp) + getPortModeFromString(resolvedInitialUdp) ); const [tcpCustomPorts, setTcpCustomPorts] = useState(() => - initialTcp && initialTcp !== "*" ? initialTcp : "" + resolvedInitialTcp && resolvedInitialTcp !== "*" + ? resolvedInitialTcp + : "" ); const [udpCustomPorts, setUdpCustomPorts] = useState(() => - initialUdp && initialUdp !== "*" ? initialUdp : "" + resolvedInitialUdp && resolvedInitialUdp !== "*" + ? resolvedInitialUdp + : "" ); useEffect(() => { diff --git a/src/app/[orgId]/settings/resources/private/[niceId]/general/page.tsx b/src/app/[orgId]/settings/resources/private/[niceId]/general/page.tsx index 80cdc41ea..6e1a9fdeb 100644 --- a/src/app/[orgId]/settings/resources/private/[niceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/private/[niceId]/general/page.tsx @@ -64,7 +64,7 @@ export default function PrivateResourceGeneralPage() { {t("resourceGeneral")} - {t("resourceGeneralDescription")} + {t("privateResourceGeneralDescription")} From 3b0ee8d9d49a4c29e96694441e197de99d0ec187 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:02 -0400 Subject: [PATCH 14/28] New translations en-us.json (Spanish) [ci skip] --- messages/es-ES.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/es-ES.json b/messages/es-ES.json index a0cee9bf6..9bc4c83a1 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Cerrar", "createInternalResourceDialogCreateClientResource": "Crear recurso privado", "createInternalResourceDialogCreateClientResourceDescription": "Crear un nuevo recurso que sólo será accesible a los clientes conectados a la organización", + "privateResourceGeneralDescription": "Configura el nombre, identificador y otros ajustes generales del recurso.", "privateResourceCreatePageSeeAll": "Ver todos los recursos privados", "privateResourceAllowIcmpPing": "Permitir ping ICMP", "privateResourceNetworkAccess": "Acceso de red", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Agregar usuarios", "editInternalResourceDialogAddClients": "Agregar clientes", "editInternalResourceDialogDestinationLabel": "Destino", - "editInternalResourceDialogDestinationDescription": "Elija dónde se ejecuta este recurso y cómo lo alcanzan los clientes", + "editInternalResourceDialogDestinationDescription": "Configura cómo los clientes acceden a este recurso.", "internalResourceFormMultiSiteRoutingHelp": "Seleccionar múltiples sitios habilita el enrutamiento resistente y la conmutación por error para alta disponibilidad.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Más información", "editInternalResourceDialogPortRestrictionsDescription": "Restringir el acceso a puertos TCP/UDP específicos o permitir/bloquear todos los puertos.", From 54209c2390c06d9946c2b8bbe4679fff326b7fdd Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:04 -0400 Subject: [PATCH 15/28] New translations en-us.json (Bulgarian) [ci skip] --- messages/bg-BG.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/bg-BG.json b/messages/bg-BG.json index a26cfc443..2d455afa8 100644 --- a/messages/bg-BG.json +++ b/messages/bg-BG.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Затвори", "createInternalResourceDialogCreateClientResource": "Създаване на частен ресурс", "createInternalResourceDialogCreateClientResourceDescription": "Създайте нов ресурс, който ще бъде достъпен само за клиенти, свързани към организацията", + "privateResourceGeneralDescription": "Конфигурирайте името, идентификатора и другите общи настройки на ресурса.", "privateResourceCreatePageSeeAll": "Вижте всички частни ресурси", "privateResourceAllowIcmpPing": "Разрешете ICMP Ping", "privateResourceNetworkAccess": "Достъп до мрежата", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Добавяне на потребители.", "editInternalResourceDialogAddClients": "Добавяне на клиенти.", "editInternalResourceDialogDestinationLabel": "Дестинация.", - "editInternalResourceDialogDestinationDescription": "Изберете къде работи този ресурс и как клиентите го достигат", + "editInternalResourceDialogDestinationDescription": "Конфигурирайте как клиентите да достигнат до този ресурс.", "internalResourceFormMultiSiteRoutingHelp": "Избирайки няколко сайта, се осигурява сигурен път и пренасочване при висока достъпност.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Научете повече", "editInternalResourceDialogPortRestrictionsDescription": "Ограничете достъпа до конкретни TCP/UDP портове или позволете/блокирайте всички портове.", From 80bee900aa178e78bc0b3abc35af500d550e64ff Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:06 -0400 Subject: [PATCH 16/28] New translations en-us.json (Czech) [ci skip] --- messages/cs-CZ.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json index d821c0642..f456ee3b9 100644 --- a/messages/cs-CZ.json +++ b/messages/cs-CZ.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Zavřít", "createInternalResourceDialogCreateClientResource": "Vytvořit soukromý zdroj", "createInternalResourceDialogCreateClientResourceDescription": "Vytvořte nový zdroj, který bude přístupný pouze klientům připojeným k organizaci", + "privateResourceGeneralDescription": "Nastavte název, identifikátor a další obecná nastavení zdroje.", "privateResourceCreatePageSeeAll": "Zobrazit všechny privátní zdroje", "privateResourceAllowIcmpPing": "Povolit ICMP ping", "privateResourceNetworkAccess": "Přístup k síti", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Přidat uživatele", "editInternalResourceDialogAddClients": "Přidat klienty", "editInternalResourceDialogDestinationLabel": "Cíl", - "editInternalResourceDialogDestinationDescription": "Vyberte, kde bude tento zdroj spuštěn a jak ho klienti dosáhnou", + "editInternalResourceDialogDestinationDescription": "Nakonfigurujte, jak klienti dosáhnou tohoto zdroje.", "internalResourceFormMultiSiteRoutingHelp": "Výběrem více webů se povolí odolné směrování a přepojení pro vysokou dostupnost.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Zjistit více", "editInternalResourceDialogPortRestrictionsDescription": "Omezte přístup na specifické TCP/UDP porty nebo povolte/blokujte všechny porty.", From c527ce6562cac3b12715351c8104d2eec74cb822 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:08 -0400 Subject: [PATCH 17/28] New translations en-us.json (Danish) [ci skip] --- messages/da-DK.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/da-DK.json b/messages/da-DK.json index 265bcf873..ce08bff23 100644 --- a/messages/da-DK.json +++ b/messages/da-DK.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Luk", "createInternalResourceDialogCreateClientResource": "Opret privat ressource", "createInternalResourceDialogCreateClientResourceDescription": "Opret en ny ressource som kun vil være tilgængelig for kunder som er forbundet til organisationen", + "privateResourceGeneralDescription": "Konfigurer navnet, identifikatoren, og andre generelle indstillinger for ressourcen.", "privateResourceCreatePageSeeAll": "Se alle private ressourcer", "privateResourceAllowIcmpPing": "Tillad ICMP-ping", "privateResourceNetworkAccess": "Netværksadgang", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Tilføj brugere", "editInternalResourceDialogAddClients": "Tilføj klienter", "editInternalResourceDialogDestinationLabel": "Destination", - "editInternalResourceDialogDestinationDescription": "Vælg, hvor denne ressource kører, og hvordan klienter får adgang til den", + "editInternalResourceDialogDestinationDescription": "Konfigurer hvordan klienter får adgang til denne ressource.", "internalResourceFormMultiSiteRoutingHelp": "Valg af flere sites muliggør robust routing og failover for høj tilgængelighed.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Læs mere", "editInternalResourceDialogPortRestrictionsDescription": "Begrens adgang til specifikke TCP/UDP-porte eller tillade/blokere alle porte.", From 8301511efee6dad9decda2adcd5fa3463fd4e2d3 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:10 -0400 Subject: [PATCH 18/28] New translations en-us.json (German) [ci skip] --- messages/de-DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/de-DE.json b/messages/de-DE.json index f16d91331..dc7dbb808 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Schließen", "createInternalResourceDialogCreateClientResource": "Private Ressource erstellen", "createInternalResourceDialogCreateClientResourceDescription": "Erstelle eine neue Ressource, die nur für Clients zugänglich ist, die mit der Organisation verbunden sind", + "privateResourceGeneralDescription": "Konfigurieren Sie den Namen, die Kennung und andere allgemeine Ressourceneinstellungen.", "privateResourceCreatePageSeeAll": "Alle privaten Ressourcen anzeigen", "privateResourceAllowIcmpPing": "ICMP-Ping zulassen", "privateResourceNetworkAccess": "Netzwerkzugriff", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Nutzer hinzufügen", "editInternalResourceDialogAddClients": "Clients hinzufügen", "editInternalResourceDialogDestinationLabel": "Ziel", - "editInternalResourceDialogDestinationDescription": "Wählen Sie aus, wo diese Ressource läuft und wie Clients darauf zugreifen können", + "editInternalResourceDialogDestinationDescription": "Konfigurieren Sie, wie Clients diese Ressource erreichen.", "internalResourceFormMultiSiteRoutingHelp": "Durch die Auswahl mehrerer Seiten wird ein ausfallsicheres Routing und Failover für hohe Verfügbarkeit ermöglicht.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Mehr erfahren", "editInternalResourceDialogPortRestrictionsDescription": "Den Zugriff auf bestimmte TCP/UDP-Ports beschränken oder alle Ports erlauben/blockieren.", From be50fd45860ade6042b07d6b1c428c95307674ed Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:12 -0400 Subject: [PATCH 19/28] New translations en-us.json (Italian) [ci skip] --- messages/it-IT.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/it-IT.json b/messages/it-IT.json index 0fdf0ed24..ebb398334 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Chiudi", "createInternalResourceDialogCreateClientResource": "Crea Risorsa Privata", "createInternalResourceDialogCreateClientResourceDescription": "Crea una nuova risorsa che sarà accessibile solo ai client connessi all'organizzazione", + "privateResourceGeneralDescription": "Configura il nome, l'identificativo e altre impostazioni generali delle risorse.", "privateResourceCreatePageSeeAll": "Vedi Tutte le Risorse Private", "privateResourceAllowIcmpPing": "Consenti ICMP Ping", "privateResourceNetworkAccess": "Accesso alla Rete", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Aggiungi Utenti", "editInternalResourceDialogAddClients": "Aggiungi Clienti", "editInternalResourceDialogDestinationLabel": "Destinazione", - "editInternalResourceDialogDestinationDescription": "Scegli dove eseguire questa risorsa e come i client lo raggiungono", + "editInternalResourceDialogDestinationDescription": "Configura come i client raggiungono questa risorsa.", "internalResourceFormMultiSiteRoutingHelp": "Selezionare più siti consente un routing resiliente e Failover per alta disponibilità.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Scopri di più", "editInternalResourceDialogPortRestrictionsDescription": "Limita l'accesso a porte TCP/UDP specifiche o consenti/blocca tutte le porte.", From 272a5737b02ce1ed0de52af0f3670dfb318bead3 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:14 -0400 Subject: [PATCH 20/28] New translations en-us.json (Korean) [ci skip] --- messages/ko-KR.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/ko-KR.json b/messages/ko-KR.json index 9e5f6ed5c..d8c929ead 100644 --- a/messages/ko-KR.json +++ b/messages/ko-KR.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "닫기", "createInternalResourceDialogCreateClientResource": "사이트 리소스 생성", "createInternalResourceDialogCreateClientResourceDescription": "선택한 사이트에 연결된 클라이언트에 접근할 새 리소스를 생성합니다", + "privateResourceGeneralDescription": "이름, 식별자, 기타 일반 리소스 설정을 구성합니다.", "privateResourceCreatePageSeeAll": "모든 개인 리소스 보기", "privateResourceAllowIcmpPing": "ICMP 핑 허용", "privateResourceNetworkAccess": "네트워크 접근", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "사용자 추가", "editInternalResourceDialogAddClients": "클라이언트 추가", "editInternalResourceDialogDestinationLabel": "대상지", - "editInternalResourceDialogDestinationDescription": "이 리소스가 실행되는 위치와 고객이 도달하는 방법 선택", + "editInternalResourceDialogDestinationDescription": "클라이언트가 이 리소스에 어떻게 도달하는지 구성합니다.", "internalResourceFormMultiSiteRoutingHelp": "다중 사이트를 선택하면 높은 가용성을 위해 회복력 있는 라우팅 및 페일오버가 가능해집니다.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "자세히 알아보기", "editInternalResourceDialogPortRestrictionsDescription": "특정 TCP/UDP 포트에 대한 접근을 제한하거나 모든 포트를 허용/차단하십시오.", From 035e324e5aa9ee08a5b0ccc7b86f4386d0afaba6 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:16 -0400 Subject: [PATCH 21/28] New translations en-us.json (Dutch) [ci skip] --- messages/nl-NL.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/nl-NL.json b/messages/nl-NL.json index ea0e69b03..506a4a5b3 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Sluiten", "createInternalResourceDialogCreateClientResource": "Privé bron maken", "createInternalResourceDialogCreateClientResourceDescription": "Maak een nieuwe bron aan die alleen toegankelijk is voor klanten die verbonden zijn met de organisatie", + "privateResourceGeneralDescription": "Configureer de naam, identificatie en andere algemene resource-instellingen.", "privateResourceCreatePageSeeAll": "Bekijk Alle Privébronnen", "privateResourceAllowIcmpPing": "Sta ICMP Ping toe", "privateResourceNetworkAccess": "Netwerktoegang", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Gebruikers toevoegen", "editInternalResourceDialogAddClients": "Clienten toevoegen", "editInternalResourceDialogDestinationLabel": "Bestemming", - "editInternalResourceDialogDestinationDescription": "Kies waar deze bron draait en hoe clients deze bereiken", + "editInternalResourceDialogDestinationDescription": "Configureer hoe klanten toegang krijgen tot deze resource.", "internalResourceFormMultiSiteRoutingHelp": "Selecteren van meerdere sites maakt veerkrachtige routing en failover mogelijk voor hoge beschikbaarheid.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Meer informatie", "editInternalResourceDialogPortRestrictionsDescription": "Beperk toegang tot specifieke TCP/UDP-poorten of sta alle poorten toe/blokkeer.", From caa398ae546a0ed6a09a033edadee5ef02f68296 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:18 -0400 Subject: [PATCH 22/28] New translations en-us.json (Polish) [ci skip] --- messages/pl-PL.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/pl-PL.json b/messages/pl-PL.json index 1fc95a73c..718579932 100644 --- a/messages/pl-PL.json +++ b/messages/pl-PL.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Zamknij", "createInternalResourceDialogCreateClientResource": "Utwórz zasób prywatny", "createInternalResourceDialogCreateClientResourceDescription": "Utwórz nowy zasób, który będzie dostępny tylko dla klientów podłączonych do organizacji", + "privateResourceGeneralDescription": "Skonfiguruj nazwę, identyfikator i inne ogólne ustawienia zasobów.", "privateResourceCreatePageSeeAll": "Zobacz wszystkie zasoby prywatne", "privateResourceAllowIcmpPing": "Zezwalaj na ping ICMP", "privateResourceNetworkAccess": "Dostęp do sieci", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Dodaj użytkowników", "editInternalResourceDialogAddClients": "Dodaj klientów", "editInternalResourceDialogDestinationLabel": "Miejsce docelowe", - "editInternalResourceDialogDestinationDescription": "Wybierz, gdzie ten zasób działa i jak klienci go osiągają", + "editInternalResourceDialogDestinationDescription": "Skonfiguruj sposób, w jaki klienci docierają do tego zasobu.", "internalResourceFormMultiSiteRoutingHelp": "Wybór wielu stron umożliwia odporne trasowanie i awarię dla wysokiej dostępności.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Dowiedz się więcej", "editInternalResourceDialogPortRestrictionsDescription": "Ogranicz dostęp do konkretnych portów TCP/UDP lub zezwól/zablokuj wszystkie porty.", From 17b4fd9a44beea345f043b7017f317b4ece32b26 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:20 -0400 Subject: [PATCH 23/28] New translations en-us.json (Portuguese) [ci skip] --- messages/pt-PT.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/pt-PT.json b/messages/pt-PT.json index 8b63ce459..c0d65e0fb 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Fechar", "createInternalResourceDialogCreateClientResource": "Criar Recurso Privado", "createInternalResourceDialogCreateClientResourceDescription": "Criar um novo recurso que só será acessível para clientes conectados à organização", + "privateResourceGeneralDescription": "Configure o nome, identificador e outras configurações gerais de recursos.", "privateResourceCreatePageSeeAll": "Ver Todos os Recursos Privados", "privateResourceAllowIcmpPing": "Permitir ICMP Ping", "privateResourceNetworkAccess": "Acesso à Rede", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Adicionar Usuários", "editInternalResourceDialogAddClients": "Adicionar Clientes", "editInternalResourceDialogDestinationLabel": "Destino", - "editInternalResourceDialogDestinationDescription": "Escolha onde este recurso é executado e como os clientes o acessam", + "editInternalResourceDialogDestinationDescription": "Configure como os clientes acessam este recurso.", "internalResourceFormMultiSiteRoutingHelp": "Selecionar múltiplos sites permite roteamento resiliente e failover para alta disponibilidade.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Saiba mais", "editInternalResourceDialogPortRestrictionsDescription": "Restrinja o acesso a portas TCP/UDP específicas ou permita/bloqueie todas as portas.", From 7ae99731f43e0abb90ee44f97e6d07e3162a81b2 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:22 -0400 Subject: [PATCH 24/28] New translations en-us.json (Russian) [ci skip] --- messages/ru-RU.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/messages/ru-RU.json b/messages/ru-RU.json index 07dc3b7a1..53bf7b015 100644 --- a/messages/ru-RU.json +++ b/messages/ru-RU.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Закрыть", "createInternalResourceDialogCreateClientResource": "Создать приватный ресурс", "createInternalResourceDialogCreateClientResourceDescription": "Создать новый ресурс, который будет доступен только клиентам, подключенным к организации", + "privateResourceGeneralDescription": "Настройте имя, идентификатор и другие общие параметры ресурса.", "privateResourceCreatePageSeeAll": "Посмотреть все частные ресурсы", "privateResourceAllowIcmpPing": "Разрешить ICMP Ping", "privateResourceNetworkAccess": "Сетевой доступ", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Добавить пользователей", "editInternalResourceDialogAddClients": "Добавить клиентов", "editInternalResourceDialogDestinationLabel": "Пункт назначения", - "editInternalResourceDialogDestinationDescription": "Выберите, где этот ресурс работает и как к нему получают доступ клиенты", + "editInternalResourceDialogDestinationDescription": "Настройте, как клиенты получают доступ к этому ресурсу.", "internalResourceFormMultiSiteRoutingHelp": "Выбор нескольких сайтов позволяет обеспечить отказоустойчивую маршрутизацию и фейловер для высокой доступности.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Узнать больше", "editInternalResourceDialogPortRestrictionsDescription": "Ограничьте доступ к определенным TCP/UDP-портам или разрешите/заблокируйте все порты.", @@ -3680,7 +3681,7 @@ "resourceLauncherSaveForEveryoneDescription": "Поделитесь этим видом со всеми членами организации. Если не отмечено, видимость только для вас.", "resourceLauncherMakePersonal": "Сделать личным", "resourceLauncherFilter": "Фильтр", - "resourceLauncherFilterWithCount": "Filter, {count} applied", + "resourceLauncherFilterWithCount": "Фильтр, применено {count}", "resourceLauncherSort": "Сортировать", "resourceLauncherSortAscending": "Сортировать по возрастанию", "resourceLauncherSortDescending": "Сортировать по убыванию", From 11bbd028fc09827c83cc284c7eeb7fcdef9029f2 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:24 -0400 Subject: [PATCH 25/28] New translations en-us.json (Turkish) [ci skip] --- messages/tr-TR.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/tr-TR.json b/messages/tr-TR.json index 76869a12a..6ab5d026d 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Kapat", "createInternalResourceDialogCreateClientResource": "Özel Kaynak Oluştur", "createInternalResourceDialogCreateClientResourceDescription": "Seçilen siteye bağlı istemcilere erişilebilir olacak yeni bir kaynak oluşturun", + "privateResourceGeneralDescription": "Kaynağın adı, tanımlayıcı ve diğer genel ayarlarını yapılandırın.", "privateResourceCreatePageSeeAll": "Tüm Özel Kaynakları Gör", "privateResourceAllowIcmpPing": "ICMP Ping İzne Ver", "privateResourceNetworkAccess": "Ağ Erişimi", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Kullanıcılar Ekle", "editInternalResourceDialogAddClients": "Müşteriler Ekle", "editInternalResourceDialogDestinationLabel": "Hedef", - "editInternalResourceDialogDestinationDescription": "Bu kaynağın nerede çalıştığını ve istemcilerin ona nasıl eriştiğini seçin", + "editInternalResourceDialogDestinationDescription": "Bu kaynağa müşterilerin nasıl erişeceğini yapılandırın.", "internalResourceFormMultiSiteRoutingHelp": "Birden fazla site seçmek, yüksek kullanılabilirlik için dirençli yönlendirme ve yedeklik sağlar.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Daha fazla bilgi", "editInternalResourceDialogPortRestrictionsDescription": "Belirtilen TCP/UDP portlarına erişimi kısıtlayın veya tüm portlara izin/engelleme verin.", From 54acdbe2829b7b52d4593ca518f29789516786b8 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:27 -0400 Subject: [PATCH 26/28] New translations en-us.json (Chinese Simplified) [ci skip] --- messages/zh-CN.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/zh-CN.json b/messages/zh-CN.json index 362282d15..3d34fef2e 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "关闭", "createInternalResourceDialogCreateClientResource": "创建私有资源", "createInternalResourceDialogCreateClientResourceDescription": "创建一个新资源只能为连接到组织的客户端访问", + "privateResourceGeneralDescription": "配置名称、标识符和其他一般资源设置。", "privateResourceCreatePageSeeAll": "查看所有私人资源", "privateResourceAllowIcmpPing": "允许 ICMP Ping", "privateResourceNetworkAccess": "网络访问", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "添加用户", "editInternalResourceDialogAddClients": "添加客户端", "editInternalResourceDialogDestinationLabel": "目标", - "editInternalResourceDialogDestinationDescription": "选择该资源运行位置及客户端访问方式", + "editInternalResourceDialogDestinationDescription": "配置客户端如何访问此资源。", "internalResourceFormMultiSiteRoutingHelp": "选择多个站点可以实现高可用性的弹性路由和故障转移。", "internalResourceFormMultiSiteRoutingHelpLearnMore": "了解更多", "editInternalResourceDialogPortRestrictionsDescription": "限制访问特定的TCP/UDP端口或允许/阻止所有端口。", From 3e7b9d7bff29d711c26708f99c397b48cbda387d Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:29 -0400 Subject: [PATCH 27/28] New translations en-us.json (Norwegian Bokmal) [ci skip] --- messages/nb-NO.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/nb-NO.json b/messages/nb-NO.json index 2e8928f5c..1e0d6a1a3 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Lukk", "createInternalResourceDialogCreateClientResource": "Opprett privat ressurs", "createInternalResourceDialogCreateClientResourceDescription": "Opprett en ny ressurs som bare vil være tilgjengelig for kunder som er koblet til organisasjonen", + "privateResourceGeneralDescription": "Konfigurer navnet, identifikatoren og andre generelle ressursinnstillinger.", "privateResourceCreatePageSeeAll": "Se alle private ressurser", "privateResourceAllowIcmpPing": "Tillat ICMP Ping", "privateResourceNetworkAccess": "Nettverkstilgang", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Legg til brukere", "editInternalResourceDialogAddClients": "Legg til klienter", "editInternalResourceDialogDestinationLabel": "Destinasjon", - "editInternalResourceDialogDestinationDescription": "Velg hvor denne ressursen kjører og hvordan klienter når den", + "editInternalResourceDialogDestinationDescription": "Konfigurer hvordan klienter får tilgang til denne ressursen.", "internalResourceFormMultiSiteRoutingHelp": "Valg av flere nettsteder muliggjør motstandskraftig ruting og failover for høy tilgjengelighet.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "Lær mer", "editInternalResourceDialogPortRestrictionsDescription": "Begrens tilgang til spesifikke TCP/UDP-porter eller tillate/blokkere alle porter.", From 21d9199978a23bd7f1bb62baa99262b258baec4a Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Thu, 9 Jul 2026 10:34:31 -0400 Subject: [PATCH 28/28] New translations en-us.json (French) [ci skip] --- messages/fr-FR.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/messages/fr-FR.json b/messages/fr-FR.json index cc90cc919..4084ceae8 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -2393,6 +2393,7 @@ "createInternalResourceDialogClose": "Fermer", "createInternalResourceDialogCreateClientResource": "Créer une ressource privée", "createInternalResourceDialogCreateClientResourceDescription": "Créer une nouvelle ressource qui ne sera accessible qu'aux clients connectés à l'organisation", + "privateResourceGeneralDescription": "Configurez le nom, l'identifiant et d'autres paramètres généraux de la ressource.", "privateResourceCreatePageSeeAll": "Voir toutes les ressources privées", "privateResourceAllowIcmpPing": "Autoriser le ping ICMP", "privateResourceNetworkAccess": "Accès au réseau", @@ -3269,7 +3270,7 @@ "editInternalResourceDialogAddUsers": "Ajouter des utilisateurs", "editInternalResourceDialogAddClients": "Ajouter des clients", "editInternalResourceDialogDestinationLabel": "Destination", - "editInternalResourceDialogDestinationDescription": "Choisissez où cette ressource fonctionne et comment les clients l'atteignent", + "editInternalResourceDialogDestinationDescription": "Configurez comment les clients accèdent à cette ressource.", "internalResourceFormMultiSiteRoutingHelp": "La sélection de plusieurs sites permet un routage résilient et un basculement pour une haute disponibilité.", "internalResourceFormMultiSiteRoutingHelpLearnMore": "En savoir plus", "editInternalResourceDialogPortRestrictionsDescription": "Restreindre l'accès à des ports TCP/UDP spécifiques ou autoriser/bloquer tous les ports.",