diff --git a/backend/src/lib/config/env.ts b/backend/src/lib/config/env.ts index 6ab96d3f4..99514556b 100644 --- a/backend/src/lib/config/env.ts +++ b/backend/src/lib/config/env.ts @@ -366,7 +366,7 @@ export const initEnvConfig = (logger?: CustomLogger) => { export const overwriteSchema: { [key: string]: { name: string; - fields: { key: keyof z.input; description?: string }[]; + fields: { key: keyof TEnvConfig; description?: string }[]; }; } = { google_sso: { @@ -395,7 +395,7 @@ export const overwriteSchema: { } ] }, - github: { + gitlab_sso: { name: "GitLab SSO", fields: [ { @@ -415,7 +415,9 @@ export const overwriteSchema: { } }; -const overridableKeys = new Set(Object.values(overwriteSchema).flatMap(({ fields }) => fields.map(({ key }) => key))); +export const overridableKeys = new Set( + Object.values(overwriteSchema).flatMap(({ fields }) => fields.map(({ key }) => key)) +); export const overrideEnvConfig = (config: Record) => { const allowedOverrides = Object.fromEntries( diff --git a/backend/src/server/routes/v1/admin-router.ts b/backend/src/server/routes/v1/admin-router.ts index 8ff7f2c30..e35ac7d50 100644 --- a/backend/src/server/routes/v1/admin-router.ts +++ b/backend/src/server/routes/v1/admin-router.ts @@ -8,7 +8,7 @@ import { SuperAdminSchema, UsersSchema } from "@app/db/schemas"; -import { getConfig } from "@app/lib/config/env"; +import { getConfig, overridableKeys } from "@app/lib/config/env"; import { BadRequestError } from "@app/lib/errors"; import { invalidateCacheLimit, readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { getTelemetryDistinctId } from "@app/server/lib/telemetry"; @@ -112,11 +112,13 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { message: "Page frame content contains unsafe HTML." }) .optional(), - envOverrides: z.record(z.string(), z.string()).optional() + envOverrides: z.record(z.enum(Array.from(overridableKeys) as [string, ...string[]]), z.string()).optional() }), response: { 200: z.object({ - config: SuperAdminSchema.extend({ + config: SuperAdminSchema.omit({ + encryptedEnvOverrides: true + }).extend({ defaultAuthOrgSlug: z.string().nullable() }) }) diff --git a/backend/src/server/routes/v1/secret-sync-routers/cloudflare-pages-sync-router.ts b/backend/src/server/routes/v1/secret-sync-routers/cloudflare-pages-sync-router.ts index 6a70b5837..59b95323c 100644 --- a/backend/src/server/routes/v1/secret-sync-routers/cloudflare-pages-sync-router.ts +++ b/backend/src/server/routes/v1/secret-sync-routers/cloudflare-pages-sync-router.ts @@ -1,10 +1,11 @@ -import { SecretSync } from "@app/services/secret-sync/secret-sync-enums"; -import { registerSyncSecretsEndpoints } from "./secret-sync-endpoints"; import { CloudflarePagesSyncSchema, CreateCloudflarePagesSyncSchema, UpdateCloudflarePagesSyncSchema } from "@app/services/secret-sync/cloudflare-pages/cloudflare-pages-schema"; +import { SecretSync } from "@app/services/secret-sync/secret-sync-enums"; + +import { registerSyncSecretsEndpoints } from "./secret-sync-endpoints"; export const registerCloudflarePagesSyncRouter = async (server: FastifyZodProvider) => registerSyncSecretsEndpoints({ diff --git a/backend/src/services/app-connection/cloudflare/cloudflare-connection-schema.ts b/backend/src/services/app-connection/cloudflare/cloudflare-connection-schema.ts index 64dee9dd5..f3b26a2d6 100644 --- a/backend/src/services/app-connection/cloudflare/cloudflare-connection-schema.ts +++ b/backend/src/services/app-connection/cloudflare/cloudflare-connection-schema.ts @@ -1,6 +1,7 @@ import z from "zod"; import { AppConnections } from "@app/lib/api-docs"; +import { CharacterType, characterValidator } from "@app/lib/validator/validate-string"; import { AppConnection } from "@app/services/app-connection/app-connection-enums"; import { BaseAppConnectionSchema, @@ -9,7 +10,6 @@ import { } from "@app/services/app-connection/app-connection-schemas"; import { CloudflareConnectionMethod } from "./cloudflare-connection-enum"; -import { CharacterType, characterValidator } from "@app/lib/validator/validate-string"; const accountIdCharacterValidator = characterValidator([ CharacterType.AlphaNumeric, diff --git a/backend/src/services/super-admin/super-admin-types.ts b/backend/src/services/super-admin/super-admin-types.ts index 3e5ca349c..b57a015a4 100644 --- a/backend/src/services/super-admin/super-admin-types.ts +++ b/backend/src/services/super-admin/super-admin-types.ts @@ -1,3 +1,5 @@ +import { TEnvConfig } from "@app/lib/config/env"; + export type TAdminSignUpDTO = { email: string; password: string; @@ -78,6 +80,6 @@ export type TAdminIntegrationConfig = { export interface EnvOverrides { [key: string]: { name: string; - fields: { key: string; value: string; hasEnvEntry: boolean; description?: string }[]; + fields: { key: keyof TEnvConfig; value: string; hasEnvEntry: boolean; description?: string }[]; }; } diff --git a/frontend/src/layouts/OrganizationLayout/components/MinimizedOrgSidebar/MinimizedOrgSidebar.tsx b/frontend/src/layouts/OrganizationLayout/components/MinimizedOrgSidebar/MinimizedOrgSidebar.tsx index a005c1359..f4ce9bc40 100644 --- a/frontend/src/layouts/OrganizationLayout/components/MinimizedOrgSidebar/MinimizedOrgSidebar.tsx +++ b/frontend/src/layouts/OrganizationLayout/components/MinimizedOrgSidebar/MinimizedOrgSidebar.tsx @@ -164,7 +164,10 @@ export const MinimizedOrgSidebar = () => { const handleCopyToken = async () => { try { await window.navigator.clipboard.writeText(getAuthToken()); - createNotification({ type: "success", text: "Copied current login session token to clipboard" }); + createNotification({ + type: "success", + text: "Copied current login session token to clipboard" + }); } catch (error) { console.log(error); createNotification({ type: "error", text: "Failed to copy user token to clipboard" }); diff --git a/frontend/src/pages/admin/EnvironmentPage/EnvironmentPage.tsx b/frontend/src/pages/admin/EnvironmentPage/EnvironmentPage.tsx index 668902c76..ea4467131 100644 --- a/frontend/src/pages/admin/EnvironmentPage/EnvironmentPage.tsx +++ b/frontend/src/pages/admin/EnvironmentPage/EnvironmentPage.tsx @@ -2,6 +2,7 @@ import { Helmet } from "react-helmet"; import { useTranslation } from "react-i18next"; import { PageHeader } from "@app/components/v2"; + import { EnvironmentPageForm } from "./components"; export const EnvironmentPage = () => { diff --git a/frontend/src/pages/admin/EnvironmentPage/components/EnvironmentPageForm.tsx b/frontend/src/pages/admin/EnvironmentPage/components/EnvironmentPageForm.tsx index b120d49e0..8e07e37be 100644 --- a/frontend/src/pages/admin/EnvironmentPage/components/EnvironmentPageForm.tsx +++ b/frontend/src/pages/admin/EnvironmentPage/components/EnvironmentPageForm.tsx @@ -1,12 +1,12 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { Controller, useForm, useWatch } from "react-hook-form"; +import { faExclamationTriangle, faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, FormControl, Input, SecretInput, Tooltip } from "@app/components/v2"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faExclamationTriangle, faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; import { useGetEnvOverrides, useUpdateServerConfig } from "@app/hooks/api"; type TForm = Record; @@ -55,14 +55,11 @@ export const EnvironmentPageForm = () => { return Object.values(envOverrides) .map((group) => { - const filteredFields = group.fields.filter((field) => { - const value = formValues?.[field.key] ?? ""; - return ( + const filteredFields = group.fields.filter( + (field) => field.key.toLowerCase().includes(searchTerm) || - (field.description ?? "").toLowerCase().includes(searchTerm) || - value.toLowerCase().includes(searchTerm) - ); - }); + (field.description ?? "").toLowerCase().includes(searchTerm) + ); if (filteredFields.length > 0) { return { ...group, fields: filteredFields }; @@ -103,91 +100,89 @@ export const EnvironmentPageForm = () => { ); return ( - <> -
-
-
-
-

Overrides

-
-

Override specific environment variables.

-
- -
- + +
+
+
+

Overrides

+

Override specific environment variables.

- setSearch(e.target.value)} - leftIcon={} - placeholder="Search for keys, descriptions, and values..." - className="flex-1" - /> -
- {filteredData.map((group) => ( -
- {group!.name} -
-
- {group!.fields.map((field, i) => ( -
-
- {field.key} - {field.description} -
-
- {field.hasEnvEntry && ( - - - - )} - - ( - - - - )} - /> -
+
+ +
+
+ setSearch(e.target.value)} + leftIcon={} + placeholder="Search for keys, descriptions, and values..." + className="flex-1" + /> +
+ {filteredData.map((group) => ( +
+ {group!.name} +
+
+ {group!.fields.map((field, i) => ( +
+
+ {field.key} + {field.description}
- ))} -
+ +
+ {field.hasEnvEntry && ( + + + + )} + + ( + + + + )} + /> +
+
+ ))}
- ))} -
- - +
+ ))} +
+ ); };