From 674316aa46014179e358cc39a9dc6b7cb81e7cb6 Mon Sep 17 00:00:00 2001 From: Matthias Palmetshofer Date: Wed, 9 Apr 2025 23:42:50 +0200 Subject: [PATCH 01/26] add option to set TLS Server Name --- server/db/schemas/schema.ts | 3 +- server/lib/schemas.ts | 7 +++ server/routers/resource/listResources.ts | 6 ++- server/routers/resource/updateResource.ts | 14 +++++- server/routers/traefik/getTraefikConfig.ts | 19 +++++++- .../resources/[resourceId]/general/page.tsx | 46 +++++++++++++++++-- 6 files changed, 84 insertions(+), 11 deletions(-) diff --git a/server/db/schemas/schema.ts b/server/db/schemas/schema.ts index a8627553..2fe5ac2b 100644 --- a/server/db/schemas/schema.ts +++ b/server/db/schemas/schema.ts @@ -77,7 +77,8 @@ export const resources = sqliteTable("resources", { applyRules: integer("applyRules", { mode: "boolean" }) .notNull() .default(false), - enabled: integer("enabled", { mode: "boolean" }).notNull().default(true) + enabled: integer("enabled", { mode: "boolean" }).notNull().default(true), + tlsServerName: text("tlsServerName").notNull().default("") }); export const targets = sqliteTable("targets", { diff --git a/server/lib/schemas.ts b/server/lib/schemas.ts index f4b7daf3..cf1b40c8 100644 --- a/server/lib/schemas.ts +++ b/server/lib/schemas.ts @@ -9,3 +9,10 @@ export const subdomainSchema = z .min(1, "Subdomain must be at least 1 character long") .transform((val) => val.toLowerCase()); +export const tlsNameSchema = z + .string() + .regex( + /^(?!:\/\/)([a-zA-Z0-9-_]+\.)*[a-zA-Z0-9-_]+$|^$/, + "Invalid subdomain format" + ) + .transform((val) => val.toLowerCase()); \ No newline at end of file diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index 1dba4119..56df9128 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -68,7 +68,8 @@ function queryResources( http: resources.http, protocol: resources.protocol, proxyPort: resources.proxyPort, - enabled: resources.enabled + enabled: resources.enabled, + tlsServerName: resources.tlsServerName }) .from(resources) .leftJoin(sites, eq(resources.siteId, sites.siteId)) @@ -102,7 +103,8 @@ function queryResources( http: resources.http, protocol: resources.protocol, proxyPort: resources.proxyPort, - enabled: resources.enabled + enabled: resources.enabled, + tlsServerName: resources.tlsServerName }) .from(resources) .leftJoin(sites, eq(resources.siteId, sites.siteId)) diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 121b34ed..54802ccc 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -16,7 +16,7 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import config from "@server/lib/config"; -import { subdomainSchema } from "@server/lib/schemas"; +import { subdomainSchema, tlsNameSchema } from "@server/lib/schemas"; const updateResourceParamsSchema = z .object({ @@ -40,7 +40,8 @@ const updateHttpResourceBodySchema = z isBaseDomain: z.boolean().optional(), applyRules: z.boolean().optional(), domainId: z.string().optional(), - enabled: z.boolean().optional() + enabled: z.boolean().optional(), + tlsServerName: z.string().optional() }) .strict() .refine((data) => Object.keys(data).length > 0, { @@ -67,6 +68,15 @@ const updateHttpResourceBodySchema = z { message: "Base domain resources are not allowed" } + ) + .refine( + (data) => { + if (data.tlsServerName) { + return tlsNameSchema.safeParse(data.tlsServerName).success; + } + return true; + }, + { message: "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name." } ); export type UpdateResourceResponse = Resource; diff --git a/server/routers/traefik/getTraefikConfig.ts b/server/routers/traefik/getTraefikConfig.ts index 17e385ed..42a47940 100644 --- a/server/routers/traefik/getTraefikConfig.ts +++ b/server/routers/traefik/getTraefikConfig.ts @@ -40,7 +40,8 @@ export async function traefikConfigProvider( org: { orgId: orgs.orgId }, - enabled: resources.enabled + enabled: resources.enabled, + tlsServerName: resources.tlsServerName }) .from(resources) .innerJoin(sites, eq(sites.siteId, resources.siteId)) @@ -139,6 +140,7 @@ export async function traefikConfigProvider( const routerName = `${resource.resourceId}-router`; const serviceName = `${resource.resourceId}-service`; const fullDomain = `${resource.fullDomain}`; + const transportName = `${resource.resourceId}-transport`; if (!resource.enabled) { continue; @@ -278,6 +280,21 @@ export async function traefikConfigProvider( }) } }; + + // Add the serversTransport if TLS server name is provided + if (resource.tlsServerName) { + if (!config_output.http.serversTransports) { + config_output.http.serversTransports = {}; + } + config_output.http.serversTransports![transportName] = { + serverName: resource.tlsServerName, + //unfortunately the following needs to be set. traefik doesn't merge the default serverTransport settings + // if defined in the static config and here. if not set, self-signed certs won't work + insecureSkipVerify: true + }; + config_output.http.services![serviceName].loadBalancer.serversTransport = transportName; + } + } else { // Non-HTTP (TCP/UDP) configuration const protocol = resource.protocol.toLowerCase(); diff --git a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx index 5d6cc81e..a3fccf26 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx @@ -48,7 +48,7 @@ import { useOrgContext } from "@app/hooks/useOrgContext"; import CustomDomainInput from "../CustomDomainInput"; import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; -import { subdomainSchema } from "@server/lib/schemas"; +import { subdomainSchema, tlsNameSchema } from "@server/lib/schemas"; import { CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"; import { RadioGroup, RadioGroupItem } from "@app/components/ui/radio-group"; import { Label } from "@app/components/ui/label"; @@ -73,7 +73,8 @@ const GeneralFormSchema = z proxyPort: z.number().optional(), http: z.boolean(), isBaseDomain: z.boolean().optional(), - domainId: z.string().optional() + domainId: z.string().optional(), + tlsServerName: z.string().optional() }) .refine( (data) => { @@ -103,6 +104,18 @@ const GeneralFormSchema = z message: "Invalid subdomain", path: ["subdomain"] } + ) + .refine( + (data) => { + if (data.tlsServerName) { + return tlsNameSchema.safeParse(data.tlsServerName).success; + } + return true; + }, + { + message: "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name.", + path: ["tlsServerName"] + } ); const TransferFormSchema = z.object({ @@ -146,7 +159,8 @@ export default function GeneralForm() { proxyPort: resource.proxyPort ? resource.proxyPort : undefined, http: resource.http, isBaseDomain: resource.isBaseDomain ? true : false, - domainId: resource.domainId || undefined + domainId: resource.domainId || undefined, + tlsServerName: resource.http ? resource.tlsServerName || "" : undefined }, mode: "onChange" }); @@ -210,7 +224,8 @@ export default function GeneralForm() { subdomain: data.http ? data.subdomain : undefined, proxyPort: data.proxyPort, isBaseDomain: data.http ? data.isBaseDomain : undefined, - domainId: data.http ? data.domainId : undefined + domainId: data.http ? data.domainId : undefined, + tlsServerName: data.http ? data.tlsServerName : undefined } ) .catch((e) => { @@ -237,7 +252,8 @@ export default function GeneralForm() { subdomain: data.subdomain, proxyPort: data.proxyPort, isBaseDomain: data.isBaseDomain, - fullDomain: resource.fullDomain + fullDomain: resource.fullDomain, + tlsServerName: data.tlsServerName }); router.refresh(); @@ -545,7 +561,27 @@ export default function GeneralForm() { )} /> )} + {/* New TLS Server Name Field */} +
+ + TLS Server Name + + ( + + + + + + + )} + /> +
)} From 517bc7f6325436ef443757dcc87de7b967e5bd31 Mon Sep 17 00:00:00 2001 From: Matthias Palmetshofer Date: Thu, 10 Apr 2025 00:36:34 +0200 Subject: [PATCH 02/26] added table change to new migration script --- server/setup/migrations.ts | 4 +++- server/setup/scripts/1.3.0.ts | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 server/setup/scripts/1.3.0.ts diff --git a/server/setup/migrations.ts b/server/setup/migrations.ts index 77248f62..dbeaeea2 100644 --- a/server/setup/migrations.ts +++ b/server/setup/migrations.ts @@ -19,6 +19,7 @@ import m15 from "./scripts/1.0.0-beta15"; import m16 from "./scripts/1.0.0"; import m17 from "./scripts/1.1.0"; import m18 from "./scripts/1.2.0"; +import m19 from "./scripts/1.3.0"; // THIS CANNOT IMPORT ANYTHING FROM THE SERVER // EXCEPT FOR THE DATABASE AND THE SCHEMA @@ -37,7 +38,8 @@ const migrations = [ { version: "1.0.0-beta.15", run: m15 }, { version: "1.0.0", run: m16 }, { version: "1.1.0", run: m17 }, - { version: "1.2.0", run: m18 } + { version: "1.2.0", run: m18 }, + { version: "1.3.0", run: m19 } // Add new migrations here as they are created ] as const; diff --git a/server/setup/scripts/1.3.0.ts b/server/setup/scripts/1.3.0.ts new file mode 100644 index 00000000..d9a8e959 --- /dev/null +++ b/server/setup/scripts/1.3.0.ts @@ -0,0 +1,23 @@ +import db from "@server/db"; +import { sql } from "drizzle-orm"; + +const version = "1.1.0"; + +export default async function migration() { + console.log(`Running setup script ${version}...`); + + try { + db.transaction((trx) => { + trx.run( + sql`ALTER TABLE 'resources' ADD 'tlsServerName' integer DEFAULT '' NOT NULL;` + ); + }); + + console.log(`Migrated database schema`); + } catch (e) { + console.log("Unable to migrate database schema"); + throw e; + } + + console.log(`${version} migration complete`); +} From 64a2cc23c6629616ae968f07fdbbf05d8e04b926 Mon Sep 17 00:00:00 2001 From: Matthias Palmetshofer Date: Fri, 11 Apr 2025 09:52:34 +0200 Subject: [PATCH 03/26] adjusting field description; fix migration script; trying to resolve conflict in updateResource.ts --- server/routers/resource/updateResource.ts | 3 ++- server/setup/scripts/1.3.0.ts | 4 ++-- .../[orgId]/settings/resources/[resourceId]/general/page.tsx | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 54802ccc..23dea616 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -16,7 +16,8 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import config from "@server/lib/config"; -import { subdomainSchema, tlsNameSchema } from "@server/lib/schemas"; +import { tlsNameSchema } from "@server/lib/schemas"; +import { subdomainSchema } from "@server/lib/schemas"; const updateResourceParamsSchema = z .object({ diff --git a/server/setup/scripts/1.3.0.ts b/server/setup/scripts/1.3.0.ts index d9a8e959..f0b481fc 100644 --- a/server/setup/scripts/1.3.0.ts +++ b/server/setup/scripts/1.3.0.ts @@ -1,7 +1,7 @@ import db from "@server/db"; import { sql } from "drizzle-orm"; -const version = "1.1.0"; +const version = "1.3.0"; export default async function migration() { console.log(`Running setup script ${version}...`); @@ -9,7 +9,7 @@ export default async function migration() { try { db.transaction((trx) => { trx.run( - sql`ALTER TABLE 'resources' ADD 'tlsServerName' integer DEFAULT '' NOT NULL;` + sql`ALTER TABLE 'resources' ADD 'tlsServerName' text DEFAULT '' NOT NULL;` ); }); diff --git a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx index a3fccf26..529b5b97 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx @@ -565,7 +565,7 @@ export default function GeneralForm() {
- TLS Server Name + TLS Server Name (optional) Date: Sun, 13 Apr 2025 18:30:14 -0400 Subject: [PATCH 04/26] add child to user nav bar item --- src/app/navigation.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/navigation.tsx b/src/app/navigation.tsx index 91a1f52c..9075f155 100644 --- a/src/app/navigation.tsx +++ b/src/app/navigation.tsx @@ -35,7 +35,13 @@ export const orgNavItems: SidebarNavItem[] = [ children: [ { title: "Users", - href: "/{orgId}/settings/access/users" + href: "/{orgId}/settings/access/users", + children: [ + { + title: "Invitations", + href: "/{orgId}/settings/access/invitations" + } + ] }, { title: "Roles", From 25c125b96d84b6278882c957a63f8e569899d24a Mon Sep 17 00:00:00 2001 From: Matthias Palmetshofer Date: Tue, 15 Apr 2025 13:17:46 +0200 Subject: [PATCH 05/26] added advanced section to general page & custom host header field --- server/db/schemas/schema.ts | 3 +- server/routers/resource/listResources.ts | 6 +- server/routers/resource/updateResource.ts | 12 +- server/routers/traefik/getTraefikConfig.ts | 26 ++- server/setup/scripts/1.3.0.ts | 3 + .../resources/[resourceId]/general/page.tsx | 187 ++++++++++++++---- 6 files changed, 199 insertions(+), 38 deletions(-) diff --git a/server/db/schemas/schema.ts b/server/db/schemas/schema.ts index 2fe5ac2b..5263161b 100644 --- a/server/db/schemas/schema.ts +++ b/server/db/schemas/schema.ts @@ -78,7 +78,8 @@ export const resources = sqliteTable("resources", { .notNull() .default(false), enabled: integer("enabled", { mode: "boolean" }).notNull().default(true), - tlsServerName: text("tlsServerName").notNull().default("") + tlsServerName: text("tlsServerName").notNull().default(""), + setHostHeader: text("setHostHeader").notNull().default("") }); export const targets = sqliteTable("targets", { diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index 56df9128..72788bf2 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -69,7 +69,8 @@ function queryResources( protocol: resources.protocol, proxyPort: resources.proxyPort, enabled: resources.enabled, - tlsServerName: resources.tlsServerName + tlsServerName: resources.tlsServerName, + setHostHeader: resources.setHostHeader }) .from(resources) .leftJoin(sites, eq(resources.siteId, sites.siteId)) @@ -104,7 +105,8 @@ function queryResources( protocol: resources.protocol, proxyPort: resources.proxyPort, enabled: resources.enabled, - tlsServerName: resources.tlsServerName + tlsServerName: resources.tlsServerName, + setHostHeader: resources.setHostHeader }) .from(resources) .leftJoin(sites, eq(resources.siteId, sites.siteId)) diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 23dea616..7ceb5657 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -42,7 +42,8 @@ const updateHttpResourceBodySchema = z applyRules: z.boolean().optional(), domainId: z.string().optional(), enabled: z.boolean().optional(), - tlsServerName: z.string().optional() + tlsServerName: z.string().optional(), + setHostHeader: z.string().optional() }) .strict() .refine((data) => Object.keys(data).length > 0, { @@ -78,6 +79,15 @@ const updateHttpResourceBodySchema = z return true; }, { message: "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name." } + ) + .refine( + (data) => { + if (data.setHostHeader) { + return tlsNameSchema.safeParse(data.setHostHeader).success; + } + return true; + }, + { message: "Invalid custom Host Header value. Use domain name format, or save empty to unset custom Host Header." } ); export type UpdateResourceResponse = Resource; diff --git a/server/routers/traefik/getTraefikConfig.ts b/server/routers/traefik/getTraefikConfig.ts index 42a47940..8a952546 100644 --- a/server/routers/traefik/getTraefikConfig.ts +++ b/server/routers/traefik/getTraefikConfig.ts @@ -41,7 +41,8 @@ export async function traefikConfigProvider( orgId: orgs.orgId }, enabled: resources.enabled, - tlsServerName: resources.tlsServerName + tlsServerName: resources.tlsServerName, + setHostHeader: resources.setHostHeader }) .from(resources) .innerJoin(sites, eq(sites.siteId, resources.siteId)) @@ -141,6 +142,7 @@ export async function traefikConfigProvider( const serviceName = `${resource.resourceId}-service`; const fullDomain = `${resource.fullDomain}`; const transportName = `${resource.resourceId}-transport`; + const hostHeaderMiddlewareName = `${resource.resourceId}-host-header-middleware`; if (!resource.enabled) { continue; @@ -295,6 +297,28 @@ export async function traefikConfigProvider( config_output.http.services![serviceName].loadBalancer.serversTransport = transportName; } + // Add the host header middleware + if (resource.setHostHeader) { + if (!config_output.http.middlewares) { + config_output.http.middlewares = {}; + } + config_output.http.middlewares[hostHeaderMiddlewareName] = + { + headers: { + customRequestHeaders: { + Host: resource.setHostHeader + } + } + }; + if (!config_output.http.routers![routerName].middlewares) { + config_output.http.routers![routerName].middlewares = []; + } + config_output.http.routers![routerName].middlewares = [ + ...config_output.http.routers![routerName].middlewares, + hostHeaderMiddlewareName + ]; + } + } else { // Non-HTTP (TCP/UDP) configuration const protocol = resource.protocol.toLowerCase(); diff --git a/server/setup/scripts/1.3.0.ts b/server/setup/scripts/1.3.0.ts index f0b481fc..692dacb4 100644 --- a/server/setup/scripts/1.3.0.ts +++ b/server/setup/scripts/1.3.0.ts @@ -11,6 +11,9 @@ export default async function migration() { trx.run( sql`ALTER TABLE 'resources' ADD 'tlsServerName' text DEFAULT '' NOT NULL;` ); + trx.run( + sql`ALTER TABLE 'resources' ADD 'setHostHeader' text DEFAULT '' NOT NULL;` + ); }); console.log(`Migrated database schema`); diff --git a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx index 529b5b97..05d263e6 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx @@ -73,8 +73,7 @@ const GeneralFormSchema = z proxyPort: z.number().optional(), http: z.boolean(), isBaseDomain: z.boolean().optional(), - domainId: z.string().optional(), - tlsServerName: z.string().optional() + domainId: z.string().optional() }) .refine( (data) => { @@ -104,7 +103,18 @@ const GeneralFormSchema = z message: "Invalid subdomain", path: ["subdomain"] } - ) + ); + +const TransferFormSchema = z.object({ + siteId: z.number() +}); + +const AdvancedFormSchema = z + .object({ + http: z.boolean(), + tlsServerName: z.string().optional(), + setHostHeader: z.string().optional() + }) .refine( (data) => { if (data.tlsServerName) { @@ -116,14 +126,23 @@ const GeneralFormSchema = z message: "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name.", path: ["tlsServerName"] } + ) + .refine( + (data) => { + if (data.setHostHeader) { + return tlsNameSchema.safeParse(data.setHostHeader).success; + } + return true; + }, + { + message: "Invalid custom Host Header value. Use domain name format, or save empty to unset the custom Host Header", + path: ["tlsServerName"] + } ); -const TransferFormSchema = z.object({ - siteId: z.number() -}); - type GeneralFormValues = z.infer; type TransferFormValues = z.infer; +type AdvancedFormValues = z.infer; export default function GeneralForm() { const [formKey, setFormKey] = useState(0); @@ -159,8 +178,17 @@ export default function GeneralForm() { proxyPort: resource.proxyPort ? resource.proxyPort : undefined, http: resource.http, isBaseDomain: resource.isBaseDomain ? true : false, - domainId: resource.domainId || undefined, - tlsServerName: resource.http ? resource.tlsServerName || "" : undefined + domainId: resource.domainId || undefined + }, + mode: "onChange" + }); + + const advancedForm = useForm({ + resolver: zodResolver(AdvancedFormSchema), + defaultValues: { + http: resource.http, + tlsServerName: resource.http ? resource.tlsServerName || "" : undefined, + setHostHeader: resource.http ? resource.setHostHeader || "" : undefined }, mode: "onChange" }); @@ -224,8 +252,7 @@ export default function GeneralForm() { subdomain: data.http ? data.subdomain : undefined, proxyPort: data.proxyPort, isBaseDomain: data.http ? data.isBaseDomain : undefined, - domainId: data.http ? data.domainId : undefined, - tlsServerName: data.http ? data.tlsServerName : undefined + domainId: data.http ? data.domainId : undefined } ) .catch((e) => { @@ -252,8 +279,7 @@ export default function GeneralForm() { subdomain: data.subdomain, proxyPort: data.proxyPort, isBaseDomain: data.isBaseDomain, - fullDomain: resource.fullDomain, - tlsServerName: data.tlsServerName + fullDomain: resource.fullDomain }); router.refresh(); @@ -295,6 +321,46 @@ export default function GeneralForm() { setTransferLoading(false); } + async function onSubmitAdvanced(data: AdvancedFormValues) { + setSaveLoading(true); + + const res = await api + .post>( + `resource/${resource?.resourceId}`, + { + tlsServerName: data.http ? data.tlsServerName : undefined, + setHostHeader: data.http ? data.setHostHeader : undefined + } + ) + .catch((e) => { + toast({ + variant: "destructive", + title: "Failed to update resource", + description: formatAxiosError( + e, + "An error occurred while updating the resource" + ) + }); + }); + + if (res && res.status === 200) { + toast({ + title: "Resource updated", + description: "The resource has been updated successfully" + }); + + const resource = res.data.data; + + updateResource({ + tlsServerName: data.tlsServerName, + setHostHeader: data.setHostHeader + }); + + router.refresh(); + } + setSaveLoading(false); + } + async function toggleResourceEnabled(val: boolean) { const res = await api .post>( @@ -561,27 +627,7 @@ export default function GeneralForm() { )} /> )} - {/* New TLS Server Name Field */}
-
- - TLS Server Name (optional) - - ( - - - - - - - )} - /> -
)} @@ -637,6 +683,81 @@ export default function GeneralForm() { + {resource.http && ( + <> + + + Advanced + + Adjust advanced settings for the resource, like customize the Host Header or set a TLS Server Name for SNI based routing. + + + + +
+ + {/* New TLS Server Name Field */} +
+ + TLS Server Name (optional) + + ( + + + + + + + )} + /> +
+ {/* New Custom Host Header Field */} +
+ + Custom Host Header (optional) + + ( + + + + + + + )} + /> +
+
+ +
+
+ + + + +
+ + )} From b59c6e377a4bf4cf43d71322b0d4c5b235a3198e Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:27:48 +0200 Subject: [PATCH 06/26] German translation of section Authentication size --- internationalization/de.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/internationalization/de.md b/internationalization/de.md index 1acd5b12..c84249f7 100644 --- a/internationalization/de.md +++ b/internationalization/de.md @@ -1,3 +1,23 @@ +## Authentication Site + +| EN | DE | Notes | +| -------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------- | +| Powered by [Pangolin](https://github.com/fosrl/pangolin) | Bereitgestellt von [Pangolin](https://github.com/fosrl/pangolin) | | +| Authentication Required | Authentifizierung erforderlich | | +| Choose your preferred method to access {resource} | Wählen Sie Ihre bevorzugte Methode, um auf {resource} zuzugreifen | | +| PIN | PIN | | +| User | Benutzer | | +| 6-digit PIN Code | 6-stelliger PIN-Code | pin login | +| Login in with PIN | Mit PIN anmelden | pin login | +| Email | E-Mail | user login | +| Enter your email | Geben Sie Ihre E-Mail-Adresse ein | user login | +| Password | Passwort | user login | +| Enter your password | Geben Sie Ihr Passwort ein | user login | +| Forgot your password? | Passwort vergessen? | user login | +| Log in | Anmelden | user login | + +--- + ## Login site | EN | DE | Notes | From eb9675c6cf658a930b6d6a72d1f806b74e04b4b2 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:30:45 +0200 Subject: [PATCH 07/26] Turkish translation of section authentication site --- internationalization/tr.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 internationalization/tr.md diff --git a/internationalization/tr.md b/internationalization/tr.md new file mode 100644 index 00000000..f3df8dc6 --- /dev/null +++ b/internationalization/tr.md @@ -0,0 +1,17 @@ +## Authentication Site + +| EN | TR | Notes | +| -------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------- | +| Powered by [Pangolin](https://github.com/fosrl/pangolin) | Pangolin Tarafından Destekleniyor | | +| Authentication Required | Kimlik Doğrulaması Gerekli | | +| Choose your preferred method to access {resource} | {resource}'a erişmek için tercih ettiğiniz yöntemi seçin | | +| PIN | PIN | | +| User | Kullanıcı | | +| 6-digit PIN Code | 6 haneli PIN Kodu | pin login | +| Login in with PIN | PIN ile Giriş Yap | pin login | +| Email | E-posta | user login | +| Enter your email | E-postanızı girin | user login | +| Password | Şifre | user login | +| Enter your password | Şifrenizi girin | user login | +| Forgot your password? | Şifrenizi mi unuttunuz? | user login | +| Log in | Giriş Yap | user login | From 57b96adcd064aac327f073ea85b1559f6e8e7649 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:31:36 +0200 Subject: [PATCH 08/26] turkish translation of section login site --- internationalization/tr.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index f3df8dc6..f972460f 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -15,3 +15,18 @@ | Enter your password | Şifrenizi girin | user login | | Forgot your password? | Şifrenizi mi unuttunuz? | user login | | Log in | Giriş Yap | user login | + +--- + +## Login site + +| EN | TR | Notes | +| --------------------- | ------------------------------------------------------ | ----------- | +| Welcome to Pangolin | Pangolin'e Hoşgeldiniz | | +| Log in to get started | Başlamak için giriş yapın | | +| Email | E-posta | | +| Enter your email | E-posta adresinizi girin | placeholder | +| Password | Şifre | | +| Enter your password | Şifrenizi girin | placeholder | +| Forgot your password? | Şifrenizi mi unuttunuz? | | +| Log in | Giriş Yap | | From 499f75edd1d166acc33b8a7447c6fb7edf287dfb Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:32:26 +0200 Subject: [PATCH 09/26] turkish translation of section organization site after login --- internationalization/tr.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index f972460f..e6ad4ce8 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -30,3 +30,12 @@ | Enter your password | Şifrenizi girin | placeholder | | Forgot your password? | Şifrenizi mi unuttunuz? | | | Log in | Giriş Yap | | + +--- + +# Organization site after successful login + +| EN | TR | Notes | +| ----------------------------------------- | ------------------------------------------------------------------- | ----- | +| Welcome to Pangolin | Pangolin'e Hoşgeldiniz | | +| You're a member of {number} organization. | {number} organizasyonunun üyesiniz. | | From 4707722e6e8ccbef9bd78a42cec5ef6c169bb24a Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:33:06 +0200 Subject: [PATCH 10/26] turkish translation of shared header --- internationalization/tr.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index e6ad4ce8..6e77887d 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -39,3 +39,15 @@ | ----------------------------------------- | ------------------------------------------------------------------- | ----- | | Welcome to Pangolin | Pangolin'e Hoşgeldiniz | | | You're a member of {number} organization. | {number} organizasyonunun üyesiniz. | | + +--- + +## Shared Header, Navbar and Footer + +##### Header + +| EN | TR | Notes | +| ------------------- | -------------------------- | ----- | +| Documentation | Dokümantasyon | | +| Support | Destek | | +| Organization {name} | Organizasyon {name} | | From 285ad45a0e07dc9f7d7ec7ca7481b0fb08530561 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:33:41 +0200 Subject: [PATCH 11/26] turkish translation of organization selector --- internationalization/tr.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 6e77887d..91aeaf02 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -51,3 +51,12 @@ | Documentation | Dokümantasyon | | | Support | Destek | | | Organization {name} | Organizasyon {name} | | + +##### Organization selector + +| EN | TR | Notes | +| ---------------- | ---------------------- | ----- | +| Search… | Ara… | | +| Create | Oluştur | | +| New Organization | Yeni Organizasyon | | +| Organizations | Organizasyonlar | | From 51ac815b23429fd3a57e61020fc42c5b617a02f3 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:34:49 +0200 Subject: [PATCH 12/26] turkish translation of navbar --- internationalization/tr.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 91aeaf02..8a8bf735 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -60,3 +60,13 @@ | Create | Oluştur | | | New Organization | Yeni Organizasyon | | | Organizations | Organizasyonlar | | + +##### Navbar + +| EN | TR | Notes | +| --------------- | ------------------------------- | ----- | +| Sites | Siteler | | +| Resources | Kaynaklar | | +| User & Roles | Kullanıcılar ve Roller | | +| Shareable Links | Paylaşılabilir Linkler | | +| General | Genel | | From 01da3b3225c2b612102c59d734b7e3a93d36edf7 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:36:18 +0200 Subject: [PATCH 13/26] turkish translation of footer --- internationalization/tr.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 8a8bf735..83f1cc5b 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -70,3 +70,15 @@ | User & Roles | Kullanıcılar ve Roller | | | Shareable Links | Paylaşılabilir Linkler | | | General | Genel | | + +##### Footer + +| EN | TR | Notes | +| ------------------------- | ------------------------------------------------ | -------------------- | +| Page {number} of {number} | Sayfa {number} / {number} | | +| Rows per page | Sayfa başına satırlar | | +| Pangolin | Pangolin | Footer'da yer alır | +| Built by Fossorial | Fossorial tarafından oluşturuldu | Footer'da yer alır | +| Open Source | Açık Kaynak | Footer'da yer alır | +| Documentation | Dokümantasyon | Footer'da yer alır | +| {version} | {version} | Footer'da yer alır | From 442775ac90da5412871b114e13cb7363e1253c2c Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:37:56 +0200 Subject: [PATCH 14/26] turkish translation of hero section --- internationalization/tr.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 83f1cc5b..1f1831a8 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -82,3 +82,20 @@ | Open Source | Açık Kaynak | Footer'da yer alır | | Documentation | Dokümantasyon | Footer'da yer alır | | {version} | {version} | Footer'da yer alır | + +--- + +## Main “Sites” + +##### “Hero” section + +| EN | TR | Notes | +| ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ----- | +| Newt (Recommended) | Newt (Tavsiye Edilen) | | +| For the best user experience, use Newt. It uses WireGuard under the hood and allows you to address your private resources by their LAN address on your private network from within the Pangolin dashboard. | En iyi kullanıcı deneyimi için Newt'i kullanın. Newt, arka planda WireGuard kullanır ve Pangolin kontrol paneli üzerinden özel ağınızdaki kaynaklarınıza LAN adresleriyle erişmenizi sağlar. | | +| Runs in Docker | Docker üzerinde çalışır | | +| Runs in shell on macOS, Linux, and Windows | macOS, Linux ve Windows’ta komut satırında çalışır | | +| Install Newt | Newt'i Yükle | | +| Basic WireGuard
| Temel WireGuard
| | +| Compatible with all WireGuard clients
| Tüm WireGuard istemcileriyle uyumlu
| | +| Manual configuration required | Manuel yapılandırma gereklidir | | From 12f627711c5a6e659bb75283799f3ce4470c954a Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:38:44 +0200 Subject: [PATCH 15/26] turkish translation of content --- internationalization/tr.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 1f1831a8..86966f1a 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -99,3 +99,23 @@ | Basic WireGuard
| Temel WireGuard
| | | Compatible with all WireGuard clients
| Tüm WireGuard istemcileriyle uyumlu
| | | Manual configuration required | Manuel yapılandırma gereklidir | | + +##### Content + +| EN | TR | Notes | +| --------------------------------------------------------- | --------------------------------------------------------------------------- | ------------ | +| Manage Sites | Siteleri Yönet | | +| Allow connectivity to your network through secure tunnels | Güvenli tüneller aracılığıyla ağınıza bağlantı sağlayın | | +| Search sites | Siteleri ara | placeholder | +| Add Site | Site Ekle | | +| Name | Ad | Table Header | +| Online | Çevrimiçi | Table Header | +| Site | Site | Table Header | +| Data In | Gelen Veri | Table Header | +| Data Out | Giden Veri | Table Header | +| Connection Type | Bağlantı Türü | Table Header | +| Online | Çevrimiçi | Site state | +| Offline | Çevrimdışı | Site state | +| Edit → | Düzenle → | | +| View settings | Ayarları Görüntüle | Popup | +| Delete | Sil | Popup | From 45a75d0bee090f363457613a44d47acf70d3cd43 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:39:42 +0200 Subject: [PATCH 16/26] turkish translation of Add Site Popup --- internationalization/tr.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 86966f1a..2ba19baf 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -119,3 +119,23 @@ | Edit → | Düzenle → | | | View settings | Ayarları Görüntüle | Popup | | Delete | Sil | Popup | + +##### Add Site Popup + +| EN | TR | Notes | +| ------------------------------------------------------ | ------------------------------------------------------------------------------------------- | ----------- | +| Create Site | Site Oluştur | | +| Create a new site to start connection for this site | Bu site için bağlantıyı başlatmak amacıyla yeni bir site oluşturun | | +| Name | Ad | | +| Site name | Site adı | placeholder | +| This is the name that will be displayed for this site. | Bu, site için görüntülenecek addır. | desc | +| Method | Yöntem | | +| Local | Yerel | | +| Newt | Newt | | +| WireGuard | WireGuard | | +| This is how you will expose connections. | Bağlantılarınızı bu şekilde açığa çıkaracaksınız. | | +| You will only be able to see the configuration once. | Yapılandırmayı yalnızca bir kez görüntüleyebilirsiniz. | | +| Learn how to install Newt on your system | Sisteminizde Newt'in nasıl kurulacağını öğrenin | | +| I have copied the config | Yapılandırmayı kopyaladım | | +| Create Site | Site Oluştur | | +| Close | Kapat | | From 6b5674a107c12170e58fa67f19d9b50c1b97476a Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:42:30 +0200 Subject: [PATCH 17/26] turkish translation of main ressources / hero --- internationalization/tr.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 2ba19baf..df2dfa4a 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -139,3 +139,17 @@ | I have copied the config | Yapılandırmayı kopyaladım | | | Create Site | Site Oluştur | | | Close | Kapat | | + +--- + +## Main “Resources” + +##### “Hero” section + +| EN | TR | Notes | +| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ----- | +| Resources | Kaynaklar | | +| Ressourcen sind Proxy-Server für Anwendungen, die in Ihrem privaten Netzwerk laufen. Erstellen Sie eine Ressource für jede HTTP- oder HTTPS-Anwendung in Ihrem privaten Netzwerk. Jede Ressource muss mit einer Website verbunden sein, um eine private und sichere Verbindung über den verschlüsselten WireGuard-Tunnel zu ermöglichen. | Kaynaklar, özel ağınızda çalışan uygulamalar için proxy sunucularıdır. Özel ağınızdaki her HTTP veya HTTPS uygulaması için bir kaynak oluşturun. Her kaynağın, şifrelenmiş WireGuard tüneli üzerinden özel ve güvenli bağlantı sağlamak üzere bir siteyle ilişkili olması gerekir. | | +| Secure connectivity with WireGuard encryption | WireGuard şifrelemesiyle güvenli bağlantı | | +| Configure multiple authentication methods | Birden çok kimlik doğrulama yöntemini yapılandırın | | +| User and role-based access control | Kullanıcı ve role dayalı erişim kontrolü | | From 0454f0938322751c0843668f42799f2a7da8ae2e Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:43:12 +0200 Subject: [PATCH 18/26] turkish translation of main->content --- internationalization/tr.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index df2dfa4a..21dd5a44 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -153,3 +153,19 @@ | Secure connectivity with WireGuard encryption | WireGuard şifrelemesiyle güvenli bağlantı | | | Configure multiple authentication methods | Birden çok kimlik doğrulama yöntemini yapılandırın | | | User and role-based access control | Kullanıcı ve role dayalı erişim kontrolü | | + +##### Content + +| EN | TR | Notes | +| -------------------------------------------------- | ------------------------------------------------------------- | -------------------- | +| Manage Resources | Kaynakları Yönet | | +| Create secure proxies to your private applications | Özel uygulamalarınız için güvenli proxy’ler oluşturun | | +| Search resources | Kaynakları ara | placeholder | +| Name | Ad | | +| Site | Site | | +| Full URL | Tam URL | | +| Authentication | Kimlik Doğrulama | | +| Not Protected | Korunmayan | authentication state | +| Protected | Korunan | authentication state | +| Edit → | Düzenle → | | +| Add Resource | Kaynak Ekle | | From 976aaca287988e5961d0eab7bd536118cc674d00 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:43:56 +0200 Subject: [PATCH 19/26] turkish translation of Add Resource Popup --- internationalization/tr.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 21dd5a44..464ce77f 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -169,3 +169,21 @@ | Protected | Korunan | authentication state | | Edit → | Düzenle → | | | Add Resource | Kaynak Ekle | | + +##### Add Resource Popup + +| EN | TR | Notes | +| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | ------------- | +| Create Resource | Kaynak Oluştur | | +| Create a new resource to proxy request to your app | Uygulamanıza gelen istekleri yönlendirmek için yeni bir kaynak oluşturun | | +| Name | Ad | | +| My Resource | Kaynağım | name placeholder | +| This is the name that will be displayed for this resource. | Bu, kaynağın görüntülenecek adıdır. | | +| Subdomain | Alt alan adı | | +| Enter subdomain | Alt alan adını girin | | +| This is the fully qualified domain name that will be used to access the resource. | Kaynağa erişmek için kullanılacak tam nitelikli alan adıdır. | | +| Site | Site | | +| Search site… | Site ara… | Site selector popup | +| This is the site that will be used in the dashboard. | Kontrol panelinde kullanılacak sitedir. | | +| Create Resource | Kaynak Oluştur | | +| Close | Kapat | | From 35daf42a556dc777e881dea45bb70c247cfff5bf Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:45:14 +0200 Subject: [PATCH 20/26] =?UTF-8?q?turkish=20translation=20of=20Main=20?= =?UTF-8?q?=E2=80=9CUser=20&=20Roles=E2=80=9D=20->=20Content?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internationalization/tr.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 464ce77f..32fd2fd0 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -187,3 +187,36 @@ | This is the site that will be used in the dashboard. | Kontrol panelinde kullanılacak sitedir. | | | Create Resource | Kaynak Oluştur | | | Close | Kapat | | + +--- + +## Main “User & Roles” + +##### Content + +| EN | TR | Notes | +| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ----------------------------- | +| Manage User & Roles | Kullanıcılar ve Rolleri Yönet | | +| Invite users and add them to roles to manage access to your organization | Organizasyonunuza erişimi yönetmek için kullanıcıları davet edin ve rollere atayın | | +| Users | Kullanıcılar | sidebar item | +| Roles | Roller | sidebar item | +| **User tab** | **Kullanıcı Sekmesi** | | +| Search users | Kullanıcıları ara | placeholder | +| Invite User | Kullanıcı Davet Et | addbutton | +| Email | E-posta | table header | +| Status | Durum | table header | +| Role | Rol | table header | +| Confirmed | Onaylandı | account status | +| Not confirmed (?) | Onaylanmadı (?) | account status | +| Owner | Sahip | role | +| Admin | Yönetici | role | +| Member | Üye | role | +| **Roles Tab** | **Roller Sekmesi** | | +| Search roles | Rolleri ara | placeholder | +| Add Role | Rol Ekle | addbutton | +| Name | Ad | table header | +| Description | Açıklama | table header | +| Admin | Yönetici | role | +| Member | Üye | role | +| Admin role with the most permissions | En fazla yetkiye sahip yönetici rolü | admin role desc | +| Members can only view resources | Üyeler yalnızca kaynakları görüntüleyebilir | member role desc | From 8fb003d7cefd190c96d1e3a7ee5a051855640c9d Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:45:47 +0200 Subject: [PATCH 21/26] turkish translation of Invite User popup --- internationalization/tr.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 32fd2fd0..170e9e32 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -220,3 +220,23 @@ | Member | Üye | role | | Admin role with the most permissions | En fazla yetkiye sahip yönetici rolü | admin role desc | | Members can only view resources | Üyeler yalnızca kaynakları görüntüleyebilir | member role desc | + +##### Invite User popup + +| EN | TR | Notes | +| ----------------- | ----------------------------------------------------------------------- | ----------- | +| Invite User | Kullanıcı Davet Et | | +| Email | E-posta | | +| Enter an email | Bir e-posta adresi girin | placeholder | +| Role | Rol | | +| Select role | Rol seçin | placeholder | +| Gültig für | Geçerlilik Süresi | | +| 1 day | 1 gün | | +| 2 days | 2 gün | | +| 3 days | 3 gün | | +| 4 days | 4 gün | | +| 5 days | 5 gün | | +| 6 days | 6 gün | | +| 7 days | 7 gün | | +| Create Invitation | Davetiye Oluştur | | +| Close | Kapat | | From c286c28d46247c437696d0d949d96252c32c2edb Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:46:38 +0200 Subject: [PATCH 22/26] =?UTF-8?q?turkish=20translation=20of=20Main=20?= =?UTF-8?q?=E2=80=9CShareable=20Links=E2=80=9D=20->=20hero?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internationalization/tr.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 170e9e32..452c89f8 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -240,3 +240,17 @@ | 7 days | 7 gün | | | Create Invitation | Davetiye Oluştur | | | Close | Kapat | | + +--- + +## Main “Shareable Links” + +##### “Hero” section + +| EN | TR | Notes | +| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | ----- | +| Shareable Links | Paylaşılabilir Bağlantılar | | +| Create shareable links to your resources. Links provide temporary or unlimited access to your resource. You can configure the expiration duration of the link when you create one. | Kaynaklarınıza paylaşılabilir bağlantılar oluşturun. Bağlantılar, kaynağınıza geçici veya sınırsız erişim sağlar. Oluştururken bağlantının geçerlilik süresini ayarlayabilirsiniz. | | +| Easy to create and share | Oluşturması ve paylaşması kolay | | +| Configurable expiration duration | Yapılandırılabilir geçerlilik süresi | | +| Secure and revocable | Güvenli ve iptal edilebilir | | From f60f15345f31e87b3d1a1357bb48673b25afbb18 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:47:17 +0200 Subject: [PATCH 23/26] turkish translation of shareable links -> Content --- internationalization/tr.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 452c89f8..de922c81 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -254,3 +254,17 @@ | Easy to create and share | Oluşturması ve paylaşması kolay | | | Configurable expiration duration | Yapılandırılabilir geçerlilik süresi | | | Secure and revocable | Güvenli ve iptal edilebilir | | + +##### Content + +| EN | TR | Notes | +| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | -------------- | +| Manage Shareable Links | Paylaşılabilir Bağlantıları Yönet | | +| Create shareable links to grant temporary or permanent access to your resources | Kaynaklarınıza geçici veya kalıcı erişim sağlamak için paylaşılabilir bağlantılar oluşturun | | +| Search links | Bağlantıları ara | placeholder | +| Create Share Link | Bağlantı Oluştur | addbutton | +| Resource | Kaynak | table header | +| Title | Başlık | table header | +| Created | Oluşturulma Tarihi | table header | +| Expires | Son Kullanma Tarihi | table header | +| No links. Create one to get started. | Bağlantı yok. Başlamak için bir tane oluşturun. | table placeholder | From 65b29161a0b983e0755ba7ac3d48218b2a6fb8da Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:47:53 +0200 Subject: [PATCH 24/26] turkish translation of Create Shareable Link popup --- internationalization/tr.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index de922c81..7d44bfab 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -268,3 +268,25 @@ | Created | Oluşturulma Tarihi | table header | | Expires | Son Kullanma Tarihi | table header | | No links. Create one to get started. | Bağlantı yok. Başlamak için bir tane oluşturun. | table placeholder | + +##### Create Shareable Link popup + +| EN | TR | Notes | +| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | ----------------------- | +| Create Shareable Link | Paylaşılabilir Bağlantı Oluştur | | +| Anyone with this link can access the resource | Bu bağlantıya sahip olan herkes kaynağa erişebilir | | +| Resource | Kaynak | | +| Select resource | Kaynak seçin | | +| Search resources… | Kaynak ara… | resource selector popup | +| Title (optional) | Başlık (isteğe bağlı) | | +| Enter title | Başlık girin | placeholder | +| Expire in | Sona Erme Süresi | | +| Minutes | Dakika | | +| Hours | Saat | | +| Days | Gün | | +| Months | Ay | | +| Years | Yıl | | +| Never expire | Asla sona erme | | +| Expiration time is how long the link will be usable and provide access to the resource. After this time, the link will no longer work, and users who used this link will lose access to the resource. | Bağlantının geçerlilik süresi, bağlantının ne kadar süreyle kullanılabilir olacağını ve kaynağa erişim sağlayacağını belirler. Bu sürenin sonunda bağlantı çalışmaz hale gelir ve bağlantıyı kullananlar kaynağa erişimini kaybeder. | | +| Create Link | Bağlantı Oluştur | | +| Close | Kapat | | From 787ec50a9cc9d098595d803bfcd2ba79731c94d2 Mon Sep 17 00:00:00 2001 From: Taylan Date: Wed, 16 Apr 2025 21:48:50 +0200 Subject: [PATCH 25/26] =?UTF-8?q?turkish=20translation=20of=20Main=20?= =?UTF-8?q?=E2=80=9CGeneral=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internationalization/tr.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/internationalization/tr.md b/internationalization/tr.md index 7d44bfab..9e5bd274 100644 --- a/internationalization/tr.md +++ b/internationalization/tr.md @@ -290,3 +290,21 @@ | Expiration time is how long the link will be usable and provide access to the resource. After this time, the link will no longer work, and users who used this link will lose access to the resource. | Bağlantının geçerlilik süresi, bağlantının ne kadar süreyle kullanılabilir olacağını ve kaynağa erişim sağlayacağını belirler. Bu sürenin sonunda bağlantı çalışmaz hale gelir ve bağlantıyı kullananlar kaynağa erişimini kaybeder. | | | Create Link | Bağlantı Oluştur | | | Close | Kapat | | + +--- + +## Main “General” + +| EN | TR | Notes | +| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | ------------ | +| General | Genel | | +| Configure your organization’s general settings | Organizasyonunuzun genel ayarlarını yapılandırın | | +| General | Genel | sidebar item | +| Organization Settings | Organizasyon Ayarları | | +| Manage your organization details and configuration | Organizasyonunuzun detaylarını ve yapılandırmasını yönetin | | +| Name | Ad | | +| This is the display name of the org | Bu, organizasyonunuzun görüntülenecek adıdır. | | +| Save Settings | Ayarları Kaydet | | +| Danger Zone | Tehlikeli Bölge | | +| Once you delete this org, there is no going back. Please be certain. | Bu organizasyonu sildikten sonra geri dönüş yoktur. Lütfen emin olun. | | +| Delete Organization Data | Organizasyon Verilerini Sil | | From bf8bb1a0df97b493bc1a9162bc422521b8093e5c Mon Sep 17 00:00:00 2001 From: miloschwartz Date: Sun, 20 Apr 2025 20:50:50 -0400 Subject: [PATCH 26/26] adjustment to pr --- server/db/schemas/schema.ts | 4 +- server/routers/traefik/getTraefikConfig.ts | 2 +- .../resources/[resourceId]/general/page.tsx | 162 +++++++++--------- 3 files changed, 85 insertions(+), 83 deletions(-) diff --git a/server/db/schemas/schema.ts b/server/db/schemas/schema.ts index 5263161b..ecb5cd35 100644 --- a/server/db/schemas/schema.ts +++ b/server/db/schemas/schema.ts @@ -78,8 +78,8 @@ export const resources = sqliteTable("resources", { .notNull() .default(false), enabled: integer("enabled", { mode: "boolean" }).notNull().default(true), - tlsServerName: text("tlsServerName").notNull().default(""), - setHostHeader: text("setHostHeader").notNull().default("") + tlsServerName: text("tlsServerName"), + setHostHeader: text("setHostHeader") }); export const targets = sqliteTable("targets", { diff --git a/server/routers/traefik/getTraefikConfig.ts b/server/routers/traefik/getTraefikConfig.ts index 8a952546..d6053430 100644 --- a/server/routers/traefik/getTraefikConfig.ts +++ b/server/routers/traefik/getTraefikConfig.ts @@ -290,7 +290,7 @@ export async function traefikConfigProvider( } config_output.http.serversTransports![transportName] = { serverName: resource.tlsServerName, - //unfortunately the following needs to be set. traefik doesn't merge the default serverTransport settings + //unfortunately the following needs to be set. traefik doesn't merge the default serverTransport settings // if defined in the static config and here. if not set, self-signed certs won't work insecureSkipVerify: true }; diff --git a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx index 05d263e6..cf75a426 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx @@ -122,8 +122,9 @@ const AdvancedFormSchema = z } return true; }, - { - message: "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name.", + { + message: + "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name.", path: ["tlsServerName"] } ) @@ -134,8 +135,9 @@ const AdvancedFormSchema = z } return true; }, - { - message: "Invalid custom Host Header value. Use domain name format, or save empty to unset the custom Host Header", + { + message: + "Invalid custom Host Header value. Use domain name format, or save empty to unset the custom Host Header", path: ["tlsServerName"] } ); @@ -187,8 +189,12 @@ export default function GeneralForm() { resolver: zodResolver(AdvancedFormSchema), defaultValues: { http: resource.http, - tlsServerName: resource.http ? resource.tlsServerName || "" : undefined, - setHostHeader: resource.http ? resource.setHostHeader || "" : undefined + tlsServerName: resource.http + ? resource.tlsServerName || "" + : undefined, + setHostHeader: resource.http + ? resource.setHostHeader || "" + : undefined }, mode: "onChange" }); @@ -683,81 +689,77 @@ export default function GeneralForm() {
- {resource.http && ( - <> - - - Advanced - - Adjust advanced settings for the resource, like customize the Host Header or set a TLS Server Name for SNI based routing. - - - - -
- - {/* New TLS Server Name Field */} -
- - TLS Server Name (optional) - - ( - - - - - - - )} - /> -
- {/* New Custom Host Header Field */} -
- - Custom Host Header (optional) - - ( - - - - - - - )} - /> -
-
- -
-
+ {resource.http && ( + <> + + + + Advanced + + + Adjust advanced settings for the resource, + like customize the Host Header or set a TLS + Server Name for SNI based routing. + + + + +
+ + + TLS Server Name (optional) + + ( + + + + + + + )} + /> - - - - - - )} + + Custom Host Header (optional) + + ( + + + + + + + )} + /> + + +
+
+ + + + +
+ + )}