diff --git a/backend/e2e-test/routes/v3/secret-reference.spec.ts b/backend/e2e-test/routes/v3/secret-reference.spec.ts index 560565342..a5d8ba61d 100644 --- a/backend/e2e-test/routes/v3/secret-reference.spec.ts +++ b/backend/e2e-test/routes/v3/secret-reference.spec.ts @@ -314,8 +314,8 @@ describe("Secret expansion", () => { expect(listSecrets.imports).toEqual( expect.arrayContaining([ expect.objectContaining({ - secretPath: `/__reserve_replication_${secretImportFromProdToDev.id}`, - environment: seedData1.environment.slug, + secretPath: "/deep/nested", + environment: "prod", secrets: expect.arrayContaining([ expect.objectContaining({ secretKey: "NESTED_KEY_1", diff --git a/backend/package-lock.json b/backend/package-lock.json index f22fd0b7b..c6ac0b147 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -25,6 +25,7 @@ "@fastify/multipart": "8.3.1", "@fastify/passport": "^2.4.0", "@fastify/rate-limit": "^9.0.0", + "@fastify/reply-from": "^9.8.0", "@fastify/request-context": "^5.1.0", "@fastify/session": "^10.7.0", "@fastify/static": "^7.0.4", @@ -8044,6 +8045,42 @@ "toad-cache": "^3.3.0" } }, + "node_modules/@fastify/reply-from": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@fastify/reply-from/-/reply-from-9.8.0.tgz", + "integrity": "sha512-bPNVaFhEeNI0Lyl6404YZaPFokudCplidE3QoOcr78yOy6H9sYw97p5KPYvY/NJNUHfFtvxOaSAHnK+YSiv/Mg==", + "license": "MIT", + "dependencies": { + "@fastify/error": "^3.0.0", + "end-of-stream": "^1.4.4", + "fast-content-type-parse": "^1.1.0", + "fast-querystring": "^1.0.0", + "fastify-plugin": "^4.0.0", + "toad-cache": "^3.7.0", + "undici": "^5.19.1" + } + }, + "node_modules/@fastify/reply-from/node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@fastify/reply-from/node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/@fastify/request-context": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@fastify/request-context/-/request-context-5.1.0.tgz", @@ -29330,9 +29367,10 @@ } }, "node_modules/toad-cache": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", - "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", "engines": { "node": ">=12" } diff --git a/backend/package.json b/backend/package.json index cc02186e9..0c8464eaf 100644 --- a/backend/package.json +++ b/backend/package.json @@ -37,7 +37,7 @@ "build": "tsup --sourcemap", "build:frontend": "npm run build --prefix ../frontend", "start": "node --enable-source-maps dist/main.mjs", - "type:check": "tsc --noEmit", + "type:check": "node --max-old-space-size=8192 ./node_modules/.bin/tsc --noEmit", "lint:fix": "node --max-old-space-size=8192 ./node_modules/.bin/eslint --fix --ext js,ts ./src", "lint": "node --max-old-space-size=8192 ./node_modules/.bin/eslint 'src/**/*.ts'", "test:unit": "vitest run -c vitest.unit.config.ts", @@ -145,6 +145,7 @@ "@fastify/multipart": "8.3.1", "@fastify/passport": "^2.4.0", "@fastify/rate-limit": "^9.0.0", + "@fastify/reply-from": "^9.8.0", "@fastify/request-context": "^5.1.0", "@fastify/session": "^10.7.0", "@fastify/static": "^7.0.4", diff --git a/backend/src/@types/fastify.d.ts b/backend/src/@types/fastify.d.ts index 01194351d..b0a5fbb45 100644 --- a/backend/src/@types/fastify.d.ts +++ b/backend/src/@types/fastify.d.ts @@ -1,13 +1,13 @@ import "fastify"; -import { Redis } from "ioredis"; +import { Cluster, Redis } from "ioredis"; import { TUsers } from "@app/db/schemas"; import { TAccessApprovalPolicyServiceFactory } from "@app/ee/services/access-approval-policy/access-approval-policy-types"; import { TAccessApprovalRequestServiceFactory } from "@app/ee/services/access-approval-request/access-approval-request-types"; import { TAssumePrivilegeServiceFactory } from "@app/ee/services/assume-privilege/assume-privilege-types"; import { TAuditLogServiceFactory, TCreateAuditLogDTO } from "@app/ee/services/audit-log/audit-log-types"; -import { TAuditLogStreamServiceFactory } from "@app/ee/services/audit-log-stream/audit-log-stream-types"; +import { TAuditLogStreamServiceFactory } from "@app/ee/services/audit-log-stream/audit-log-stream-service"; import { TCertificateAuthorityCrlServiceFactory } from "@app/ee/services/certificate-authority-crl/certificate-authority-crl-types"; import { TCertificateEstServiceFactory } from "@app/ee/services/certificate-est/certificate-est-service"; import { TDynamicSecretServiceFactory } from "@app/ee/services/dynamic-secret/dynamic-secret-types"; @@ -84,6 +84,7 @@ import { TIntegrationServiceFactory } from "@app/services/integration/integratio import { TIntegrationAuthServiceFactory } from "@app/services/integration-auth/integration-auth-service"; import { TMicrosoftTeamsServiceFactory } from "@app/services/microsoft-teams/microsoft-teams-service"; import { TNotificationServiceFactory } from "@app/services/notification/notification-service"; +import { TOfflineUsageReportServiceFactory } from "@app/services/offline-usage-report/offline-usage-report-service"; import { TOrgRoleServiceFactory } from "@app/services/org/org-role-service"; import { TOrgServiceFactory } from "@app/services/org/org-service"; import { TOrgAdminServiceFactory } from "@app/services/org-admin/org-admin-service"; @@ -162,6 +163,7 @@ declare module "fastify" { }; // identity injection. depending on which kinda of token the information is filled in auth auth: TAuthMode; + shouldForwardWritesToPrimaryInstance: boolean; permission: { authMethod: ActorAuthMethod; type: ActorType; @@ -195,7 +197,7 @@ declare module "fastify" { } interface FastifyInstance { - redis: Redis; + redis: Redis | Cluster; services: { login: TAuthLoginFactory; password: TAuthPasswordFactory; @@ -305,6 +307,7 @@ declare module "fastify" { sse: TServerSentEventsService; identityAuthTemplate: TIdentityAuthTemplateServiceFactory; notification: TNotificationServiceFactory; + offlineUsageReport: TOfflineUsageReportServiceFactory; }; // this is exclusive use for middlewares in which we need to inject data // everywhere else access using service layer diff --git a/backend/src/db/migrations/20250903191434_audit-log-stream-v2.ts b/backend/src/db/migrations/20250903191434_audit-log-stream-v2.ts new file mode 100644 index 000000000..a70dcb8b9 --- /dev/null +++ b/backend/src/db/migrations/20250903191434_audit-log-stream-v2.ts @@ -0,0 +1,221 @@ +import { Knex } from "knex"; + +import { inMemoryKeyStore } from "@app/keystore/memory"; +import { crypto } from "@app/lib/crypto/cryptography"; +import { KmsDataKey } from "@app/services/kms/kms-types"; +import { superAdminDALFactory } from "@app/services/super-admin/super-admin-dal"; + +import { SecretKeyEncoding, TableName } from "../schemas"; +import { getMigrationEnvConfig } from "./utils/env-config"; +import { createCircularCache } from "./utils/ring-buffer"; +import { getMigrationEncryptionServices } from "./utils/services"; + +const BATCH_SIZE = 500; +export async function up(knex: Knex): Promise { + if (await knex.schema.hasTable(TableName.AuditLogStream)) { + const hasProvider = await knex.schema.hasColumn(TableName.AuditLogStream, "provider"); + const hasEncryptedCredentials = await knex.schema.hasColumn(TableName.AuditLogStream, "encryptedCredentials"); + + await knex.schema.alterTable(TableName.AuditLogStream, (t) => { + if (!hasProvider) t.string("provider").notNullable().defaultTo("custom"); + if (!hasEncryptedCredentials) t.binary("encryptedCredentials"); + + // This column will no longer be used but we're not dropping it so that we can have a backup in case the migration goes wrong + t.string("url").nullable().alter(); + }); + + if (!hasEncryptedCredentials) { + const superAdminDAL = superAdminDALFactory(knex); + const envConfig = await getMigrationEnvConfig(superAdminDAL); + const keyStore = inMemoryKeyStore(); + + const { kmsService } = await getMigrationEncryptionServices({ envConfig, keyStore, db: knex }); + + const orgEncryptionRingBuffer = + createCircularCache>>(25); + + const logStreams = await knex(TableName.AuditLogStream).select( + "id", + "orgId", + + "url", + "encryptedHeadersAlgorithm", + "encryptedHeadersCiphertext", + "encryptedHeadersIV", + "encryptedHeadersKeyEncoding", + "encryptedHeadersTag" + ); + + const updatedLogStreams = await Promise.all( + logStreams.map(async (el) => { + let orgKmsService = orgEncryptionRingBuffer.getItem(el.orgId); + if (!orgKmsService) { + orgKmsService = await kmsService.createCipherPairWithDataKey( + { + type: KmsDataKey.Organization, + orgId: el.orgId + }, + knex + ); + orgEncryptionRingBuffer.push(el.orgId, orgKmsService); + } + + const provider = "custom"; + let credentials; + + if ( + el.encryptedHeadersTag && + el.encryptedHeadersIV && + el.encryptedHeadersCiphertext && + el.encryptedHeadersKeyEncoding + ) { + const decryptedHeaders = crypto + .encryption() + .symmetric() + .decryptWithRootEncryptionKey({ + tag: el.encryptedHeadersTag, + iv: el.encryptedHeadersIV, + ciphertext: el.encryptedHeadersCiphertext, + keyEncoding: el.encryptedHeadersKeyEncoding as SecretKeyEncoding + }); + + credentials = { + url: el.url, + headers: JSON.parse(decryptedHeaders) + }; + } else { + credentials = { + url: el.url, + headers: [] + }; + } + + const encryptedCredentials = orgKmsService.encryptor({ + plainText: Buffer.from(JSON.stringify(credentials), "utf8") + }).cipherTextBlob; + + return { + id: el.id, + orgId: el.orgId, + url: el.url, + provider, + encryptedCredentials + }; + }) + ); + + for (let i = 0; i < updatedLogStreams.length; i += BATCH_SIZE) { + // eslint-disable-next-line no-await-in-loop + await knex(TableName.AuditLogStream) + .insert(updatedLogStreams.slice(i, i + BATCH_SIZE)) + .onConflict("id") + .merge(); + } + + await knex.schema.alterTable(TableName.AuditLogStream, (t) => { + t.binary("encryptedCredentials").notNullable().alter(); + }); + } + } +} + +// IMPORTANT: The down migration does not utilize the existing "url" and encrypted header columns +// because we're taking the latest data from the credentials column and re-encrypting it into relevant columns +// +// If this down migration was to fail, you can fall-back to the existing URL and encrypted header columns to retrieve +// data that was created prior to this migration + +export async function down(knex: Knex): Promise { + if (await knex.schema.hasTable(TableName.AuditLogStream)) { + const hasProvider = await knex.schema.hasColumn(TableName.AuditLogStream, "provider"); + const hasEncryptedCredentials = await knex.schema.hasColumn(TableName.AuditLogStream, "encryptedCredentials"); + + if (hasEncryptedCredentials) { + const superAdminDAL = superAdminDALFactory(knex); + const envConfig = await getMigrationEnvConfig(superAdminDAL); + const keyStore = inMemoryKeyStore(); + + const { kmsService } = await getMigrationEncryptionServices({ envConfig, keyStore, db: knex }); + + const orgEncryptionRingBuffer = + createCircularCache>>(25); + + const logStreamsToRevert = await knex(TableName.AuditLogStream) + .select("id", "orgId", "encryptedCredentials") + .where("provider", "custom") + .whereNotNull("encryptedCredentials"); + + const updatedLogStreams = await Promise.all( + logStreamsToRevert.map(async (el) => { + let orgKmsService = orgEncryptionRingBuffer.getItem(el.orgId); + if (!orgKmsService) { + orgKmsService = await kmsService.createCipherPairWithDataKey( + { + type: KmsDataKey.Organization, + orgId: el.orgId + }, + knex + ); + orgEncryptionRingBuffer.push(el.orgId, orgKmsService); + } + + const decryptedCredentials = orgKmsService + .decryptor({ + cipherTextBlob: el.encryptedCredentials + }) + .toString(); + + const credentials: { url: string; headers: { key: string; value: string }[] } = + JSON.parse(decryptedCredentials); + + const originalUrl: string = credentials.url; + + const encryptedHeadersResult = crypto + .encryption() + .symmetric() + .encryptWithRootEncryptionKey(JSON.stringify(credentials.headers), envConfig); + + const encryptedHeadersAlgorithm: string = encryptedHeadersResult.algorithm; + const encryptedHeadersCiphertext: string = encryptedHeadersResult.ciphertext; + const encryptedHeadersIV: string = encryptedHeadersResult.iv; + const encryptedHeadersKeyEncoding: string = encryptedHeadersResult.encoding; + const encryptedHeadersTag: string = encryptedHeadersResult.tag; + + return { + id: el.id, + orgId: el.orgId, + encryptedCredentials: el.encryptedCredentials, + + url: originalUrl, + encryptedHeadersAlgorithm, + encryptedHeadersCiphertext, + encryptedHeadersIV, + encryptedHeadersKeyEncoding, + encryptedHeadersTag + }; + }) + ); + + for (let i = 0; i < updatedLogStreams.length; i += BATCH_SIZE) { + // eslint-disable-next-line no-await-in-loop + await knex(TableName.AuditLogStream) + .insert(updatedLogStreams.slice(i, i + BATCH_SIZE)) + .onConflict("id") + .merge(); + } + + await knex(TableName.AuditLogStream) + .where((qb) => { + void qb.whereNot("provider", "custom").orWhereNull("url"); + }) + .del(); + } + + await knex.schema.alterTable(TableName.AuditLogStream, (t) => { + t.string("url").notNullable().alter(); + + if (hasProvider) t.dropColumn("provider"); + if (hasEncryptedCredentials) t.dropColumn("encryptedCredentials"); + }); + } +} diff --git a/backend/src/db/schemas/audit-log-streams.ts b/backend/src/db/schemas/audit-log-streams.ts index 901dd8d27..a3f6bafba 100644 --- a/backend/src/db/schemas/audit-log-streams.ts +++ b/backend/src/db/schemas/audit-log-streams.ts @@ -5,11 +5,13 @@ import { z } from "zod"; +import { zodBuffer } from "@app/lib/zod"; + import { TImmutableDBKeys } from "./models"; export const AuditLogStreamsSchema = z.object({ id: z.string().uuid(), - url: z.string(), + url: z.string().nullable().optional(), encryptedHeadersCiphertext: z.string().nullable().optional(), encryptedHeadersIV: z.string().nullable().optional(), encryptedHeadersTag: z.string().nullable().optional(), @@ -17,7 +19,9 @@ export const AuditLogStreamsSchema = z.object({ encryptedHeadersKeyEncoding: z.string().nullable().optional(), orgId: z.string().uuid(), createdAt: z.date(), - updatedAt: z.date() + updatedAt: z.date(), + provider: z.string().default("custom"), + encryptedCredentials: zodBuffer }); export type TAuditLogStreams = z.infer; diff --git a/backend/src/ee/routes/v1/audit-log-stream-router.ts b/backend/src/ee/routes/v1/audit-log-stream-router.ts deleted file mode 100644 index 17bd9e64b..000000000 --- a/backend/src/ee/routes/v1/audit-log-stream-router.ts +++ /dev/null @@ -1,215 +0,0 @@ -import { z } from "zod"; - -import { AUDIT_LOG_STREAMS } from "@app/lib/api-docs"; -import { readLimit } from "@app/server/config/rateLimiter"; -import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; -import { SanitizedAuditLogStreamSchema } from "@app/server/routes/sanitizedSchemas"; -import { AuthMode } from "@app/services/auth/auth-type"; - -export const registerAuditLogStreamRouter = async (server: FastifyZodProvider) => { - server.route({ - method: "POST", - url: "/", - config: { - rateLimit: readLimit - }, - schema: { - description: "Create an Audit Log Stream.", - security: [ - { - bearerAuth: [] - } - ], - body: z.object({ - url: z.string().min(1).describe(AUDIT_LOG_STREAMS.CREATE.url), - headers: z - .object({ - key: z.string().min(1).trim().describe(AUDIT_LOG_STREAMS.CREATE.headers.key), - value: z.string().min(1).trim().describe(AUDIT_LOG_STREAMS.CREATE.headers.value) - }) - .describe(AUDIT_LOG_STREAMS.CREATE.headers.desc) - .array() - .optional() - }), - response: { - 200: z.object({ - auditLogStream: SanitizedAuditLogStreamSchema - }) - } - }, - onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - handler: async (req) => { - const auditLogStream = await server.services.auditLogStream.create({ - actorId: req.permission.id, - actor: req.permission.type, - actorOrgId: req.permission.orgId, - actorAuthMethod: req.permission.authMethod, - url: req.body.url, - headers: req.body.headers - }); - - return { auditLogStream }; - } - }); - - server.route({ - method: "PATCH", - url: "/:id", - config: { - rateLimit: readLimit - }, - schema: { - description: "Update an Audit Log Stream by ID.", - security: [ - { - bearerAuth: [] - } - ], - params: z.object({ - id: z.string().describe(AUDIT_LOG_STREAMS.UPDATE.id) - }), - body: z.object({ - url: z.string().optional().describe(AUDIT_LOG_STREAMS.UPDATE.url), - headers: z - .object({ - key: z.string().min(1).trim().describe(AUDIT_LOG_STREAMS.UPDATE.headers.key), - value: z.string().min(1).trim().describe(AUDIT_LOG_STREAMS.UPDATE.headers.value) - }) - .describe(AUDIT_LOG_STREAMS.UPDATE.headers.desc) - .array() - .optional() - }), - response: { - 200: z.object({ - auditLogStream: SanitizedAuditLogStreamSchema - }) - } - }, - onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - handler: async (req) => { - const auditLogStream = await server.services.auditLogStream.updateById({ - actorId: req.permission.id, - actor: req.permission.type, - actorOrgId: req.permission.orgId, - actorAuthMethod: req.permission.authMethod, - id: req.params.id, - url: req.body.url, - headers: req.body.headers - }); - - return { auditLogStream }; - } - }); - - server.route({ - method: "DELETE", - url: "/:id", - config: { - rateLimit: readLimit - }, - schema: { - description: "Delete an Audit Log Stream by ID.", - security: [ - { - bearerAuth: [] - } - ], - params: z.object({ - id: z.string().describe(AUDIT_LOG_STREAMS.DELETE.id) - }), - response: { - 200: z.object({ - auditLogStream: SanitizedAuditLogStreamSchema - }) - } - }, - onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - handler: async (req) => { - const auditLogStream = await server.services.auditLogStream.deleteById({ - actorId: req.permission.id, - actor: req.permission.type, - actorOrgId: req.permission.orgId, - actorAuthMethod: req.permission.authMethod, - id: req.params.id - }); - - return { auditLogStream }; - } - }); - - server.route({ - method: "GET", - url: "/:id", - config: { - rateLimit: readLimit - }, - schema: { - description: "Get an Audit Log Stream by ID.", - security: [ - { - bearerAuth: [] - } - ], - params: z.object({ - id: z.string().describe(AUDIT_LOG_STREAMS.GET_BY_ID.id) - }), - response: { - 200: z.object({ - auditLogStream: SanitizedAuditLogStreamSchema.extend({ - headers: z - .object({ - key: z.string(), - value: z.string() - }) - .array() - .optional() - }) - }) - } - }, - onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - handler: async (req) => { - const auditLogStream = await server.services.auditLogStream.getById({ - actorId: req.permission.id, - actor: req.permission.type, - actorOrgId: req.permission.orgId, - actorAuthMethod: req.permission.authMethod, - id: req.params.id - }); - - return { auditLogStream }; - } - }); - - server.route({ - method: "GET", - url: "/", - config: { - rateLimit: readLimit - }, - schema: { - description: "List Audit Log Streams.", - security: [ - { - bearerAuth: [] - } - ], - response: { - 200: z.object({ - auditLogStreams: SanitizedAuditLogStreamSchema.array() - }) - } - }, - onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - handler: async (req) => { - const auditLogStreams = await server.services.auditLogStream.list({ - actorId: req.permission.id, - actor: req.permission.type, - actorOrgId: req.permission.orgId, - actorAuthMethod: req.permission.authMethod - }); - - return { auditLogStreams }; - } - }); -}; diff --git a/backend/src/ee/routes/v1/audit-log-stream-routers/audit-log-stream-endpoints.ts b/backend/src/ee/routes/v1/audit-log-stream-routers/audit-log-stream-endpoints.ts new file mode 100644 index 000000000..816fc62fb --- /dev/null +++ b/backend/src/ee/routes/v1/audit-log-stream-routers/audit-log-stream-endpoints.ts @@ -0,0 +1,142 @@ +import { z } from "zod"; + +import { LogProvider } from "@app/ee/services/audit-log-stream/audit-log-stream-enums"; +import { TAuditLogStream } from "@app/ee/services/audit-log-stream/audit-log-stream-types"; +import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { AuthMode } from "@app/services/auth/auth-type"; + +export const registerAuditLogStreamEndpoints = ({ + server, + provider, + createSchema, + updateSchema, + sanitizedResponseSchema +}: { + server: FastifyZodProvider; + provider: LogProvider; + createSchema: z.ZodType<{ + credentials: T["credentials"]; + }>; + updateSchema: z.ZodType<{ + credentials: T["credentials"]; + }>; + sanitizedResponseSchema: z.ZodTypeAny; +}) => { + server.route({ + method: "GET", + url: "/:logStreamId", + config: { + rateLimit: readLimit + }, + schema: { + params: z.object({ + logStreamId: z.string().uuid() + }), + response: { + 200: z.object({ + auditLogStream: sanitizedResponseSchema + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: async (req) => { + const { logStreamId } = req.params; + + const auditLogStream = await server.services.auditLogStream.getById(logStreamId, provider, req.permission); + + return { auditLogStream }; + } + }); + + server.route({ + method: "POST", + url: "/", + config: { + rateLimit: writeLimit + }, + schema: { + body: createSchema, + response: { + 200: z.object({ + auditLogStream: sanitizedResponseSchema + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: async (req) => { + const { credentials } = req.body; + + const auditLogStream = await server.services.auditLogStream.create( + { + provider, + credentials + }, + req.permission + ); + + return { auditLogStream }; + } + }); + + server.route({ + method: "PATCH", + url: "/:logStreamId", + config: { + rateLimit: writeLimit + }, + schema: { + params: z.object({ + logStreamId: z.string().uuid() + }), + body: updateSchema, + response: { + 200: z.object({ + auditLogStream: sanitizedResponseSchema + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: async (req) => { + const { logStreamId } = req.params; + const { credentials } = req.body; + + const auditLogStream = await server.services.auditLogStream.updateById( + { + logStreamId, + provider, + credentials + }, + req.permission + ); + + return { auditLogStream }; + } + }); + + server.route({ + method: "DELETE", + url: "/:logStreamId", + config: { + rateLimit: writeLimit + }, + schema: { + params: z.object({ + logStreamId: z.string().uuid() + }), + response: { + 200: z.object({ + auditLogStream: sanitizedResponseSchema + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: async (req) => { + const { logStreamId } = req.params; + + const auditLogStream = await server.services.auditLogStream.deleteById(logStreamId, provider, req.permission); + + return { auditLogStream }; + } + }); +}; diff --git a/backend/src/ee/routes/v1/audit-log-stream-routers/audit-log-stream-router.ts b/backend/src/ee/routes/v1/audit-log-stream-routers/audit-log-stream-router.ts new file mode 100644 index 000000000..bf10e48bf --- /dev/null +++ b/backend/src/ee/routes/v1/audit-log-stream-routers/audit-log-stream-router.ts @@ -0,0 +1,73 @@ +import { z } from "zod"; + +import { + CustomProviderListItemSchema, + SanitizedCustomProviderSchema +} from "@app/ee/services/audit-log-stream/custom/custom-provider-schemas"; +import { + DatadogProviderListItemSchema, + SanitizedDatadogProviderSchema +} from "@app/ee/services/audit-log-stream/datadog/datadog-provider-schemas"; +import { + SanitizedSplunkProviderSchema, + SplunkProviderListItemSchema +} from "@app/ee/services/audit-log-stream/splunk/splunk-provider-schemas"; +import { readLimit } from "@app/server/config/rateLimiter"; +import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { AuthMode } from "@app/services/auth/auth-type"; + +const SanitizedAuditLogStreamSchema = z.union([ + SanitizedCustomProviderSchema, + SanitizedDatadogProviderSchema, + SanitizedSplunkProviderSchema +]); + +const ProviderOptionsSchema = z.discriminatedUnion("provider", [ + CustomProviderListItemSchema, + DatadogProviderListItemSchema, + SplunkProviderListItemSchema +]); + +export const registerAuditLogStreamRouter = async (server: FastifyZodProvider) => { + server.route({ + method: "GET", + url: "/options", + config: { + rateLimit: readLimit + }, + schema: { + response: { + 200: z.object({ + providerOptions: ProviderOptionsSchema.array() + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: () => { + const providerOptions = server.services.auditLogStream.listProviderOptions(); + + return { providerOptions }; + } + }); + + server.route({ + method: "GET", + url: "/", + config: { + rateLimit: readLimit + }, + schema: { + response: { + 200: z.object({ + auditLogStreams: SanitizedAuditLogStreamSchema.array() + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: async (req) => { + const auditLogStreams = await server.services.auditLogStream.list(req.permission); + + return { auditLogStreams }; + } + }); +}; diff --git a/backend/src/ee/routes/v1/audit-log-stream-routers/index.ts b/backend/src/ee/routes/v1/audit-log-stream-routers/index.ts new file mode 100644 index 000000000..ea3d48b30 --- /dev/null +++ b/backend/src/ee/routes/v1/audit-log-stream-routers/index.ts @@ -0,0 +1,51 @@ +import { LogProvider } from "@app/ee/services/audit-log-stream/audit-log-stream-enums"; +import { + CreateCustomProviderLogStreamSchema, + SanitizedCustomProviderSchema, + UpdateCustomProviderLogStreamSchema +} from "@app/ee/services/audit-log-stream/custom/custom-provider-schemas"; +import { + CreateDatadogProviderLogStreamSchema, + SanitizedDatadogProviderSchema, + UpdateDatadogProviderLogStreamSchema +} from "@app/ee/services/audit-log-stream/datadog/datadog-provider-schemas"; +import { + CreateSplunkProviderLogStreamSchema, + SanitizedSplunkProviderSchema, + UpdateSplunkProviderLogStreamSchema +} from "@app/ee/services/audit-log-stream/splunk/splunk-provider-schemas"; + +import { registerAuditLogStreamEndpoints } from "./audit-log-stream-endpoints"; + +export * from "./audit-log-stream-router"; + +export const AUDIT_LOG_STREAM_REGISTER_ROUTER_MAP: Record Promise> = + { + [LogProvider.Custom]: async (server: FastifyZodProvider) => { + registerAuditLogStreamEndpoints({ + server, + provider: LogProvider.Custom, + sanitizedResponseSchema: SanitizedCustomProviderSchema, + createSchema: CreateCustomProviderLogStreamSchema, + updateSchema: UpdateCustomProviderLogStreamSchema + }); + }, + [LogProvider.Datadog]: async (server: FastifyZodProvider) => { + registerAuditLogStreamEndpoints({ + server, + provider: LogProvider.Datadog, + sanitizedResponseSchema: SanitizedDatadogProviderSchema, + createSchema: CreateDatadogProviderLogStreamSchema, + updateSchema: UpdateDatadogProviderLogStreamSchema + }); + }, + [LogProvider.Splunk]: async (server: FastifyZodProvider) => { + registerAuditLogStreamEndpoints({ + server, + provider: LogProvider.Splunk, + sanitizedResponseSchema: SanitizedSplunkProviderSchema, + createSchema: CreateSplunkProviderLogStreamSchema, + updateSchema: UpdateSplunkProviderLogStreamSchema + }); + } + }; diff --git a/backend/src/ee/routes/v1/github-org-sync-router.ts b/backend/src/ee/routes/v1/github-org-sync-router.ts index 3f33a5d8f..0d7279928 100644 --- a/backend/src/ee/routes/v1/github-org-sync-router.ts +++ b/backend/src/ee/routes/v1/github-org-sync-router.ts @@ -126,4 +126,39 @@ export const registerGithubOrgSyncRouter = async (server: FastifyZodProvider) => return { githubOrgSyncConfig }; } }); + + server.route({ + url: "/sync-all-teams", + method: "POST", + config: { + rateLimit: writeLimit + }, + onRequest: verifyAuth([AuthMode.JWT]), + schema: { + response: { + 200: z.object({ + totalUsers: z.number(), + errors: z.array(z.string()), + createdTeams: z.array(z.string()), + updatedTeams: z.array(z.string()), + removedMemberships: z.number(), + syncDuration: z.number() + }) + } + }, + handler: async (req) => { + const result = await server.services.githubOrgSync.syncAllTeams({ + orgPermission: req.permission + }); + + return { + totalUsers: result.totalUsers, + errors: result.errors, + createdTeams: result.createdTeams, + updatedTeams: result.updatedTeams, + removedMemberships: result.removedMemberships, + syncDuration: result.syncDuration + }; + } + }); }; diff --git a/backend/src/ee/routes/v1/index.ts b/backend/src/ee/routes/v1/index.ts index ab9503f58..8bf066013 100644 --- a/backend/src/ee/routes/v1/index.ts +++ b/backend/src/ee/routes/v1/index.ts @@ -3,7 +3,7 @@ import { registerProjectTemplateRouter } from "@app/ee/routes/v1/project-templat import { registerAccessApprovalPolicyRouter } from "./access-approval-policy-router"; import { registerAccessApprovalRequestRouter } from "./access-approval-request-router"; import { registerAssumePrivilegeRouter } from "./assume-privilege-router"; -import { registerAuditLogStreamRouter } from "./audit-log-stream-router"; +import { AUDIT_LOG_STREAM_REGISTER_ROUTER_MAP, registerAuditLogStreamRouter } from "./audit-log-stream-routers"; import { registerCaCrlRouter } from "./certificate-authority-crl-router"; import { registerDynamicSecretLeaseRouter } from "./dynamic-secret-lease-router"; import { registerKubernetesDynamicSecretLeaseRouter } from "./dynamic-secret-lease-routers/kubernetes-lease-router"; @@ -114,7 +114,21 @@ export const registerV1EERoutes = async (server: FastifyZodProvider) => { await server.register(registerSecretRouter, { prefix: "/secrets" }); await server.register(registerSecretVersionRouter, { prefix: "/secret" }); await server.register(registerGroupRouter, { prefix: "/groups" }); - await server.register(registerAuditLogStreamRouter, { prefix: "/audit-log-streams" }); + + await server.register( + async (auditLogStreamRouter) => { + await auditLogStreamRouter.register(registerAuditLogStreamRouter); + + // Provider-specific endpoints + await Promise.all( + Object.entries(AUDIT_LOG_STREAM_REGISTER_ROUTER_MAP).map(([provider, router]) => + auditLogStreamRouter.register(router, { prefix: `/${provider}` }) + ) + ); + }, + { prefix: "/audit-log-streams" } + ); + await server.register(registerUserAdditionalPrivilegeRouter, { prefix: "/user-project-additional-privilege" }); await server.register( async (privilegeRouter) => { diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-enums.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-enums.ts new file mode 100644 index 000000000..9c03dc2bd --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-enums.ts @@ -0,0 +1,5 @@ +export enum LogProvider { + Datadog = "datadog", + Splunk = "splunk", + Custom = "custom" +} diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-factory.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-factory.ts new file mode 100644 index 000000000..f70dc02a0 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-factory.ts @@ -0,0 +1,13 @@ +import { LogProvider } from "./audit-log-stream-enums"; +import { TAuditLogStreamCredentials, TLogStreamFactory } from "./audit-log-stream-types"; +import { CustomProviderFactory } from "./custom/custom-provider-factory"; +import { DatadogProviderFactory } from "./datadog/datadog-provider-factory"; +import { SplunkProviderFactory } from "./splunk/splunk-provider-factory"; + +type TLogStreamFactoryImplementation = TLogStreamFactory; + +export const LOG_STREAM_FACTORY_MAP: Record = { + [LogProvider.Datadog]: DatadogProviderFactory as TLogStreamFactoryImplementation, + [LogProvider.Splunk]: SplunkProviderFactory as TLogStreamFactoryImplementation, + [LogProvider.Custom]: CustomProviderFactory as TLogStreamFactoryImplementation +}; diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-fns.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-fns.ts index dc93f238e..87a7736a3 100644 --- a/backend/src/ee/services/audit-log-stream/audit-log-stream-fns.ts +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-fns.ts @@ -1,21 +1,70 @@ -export function providerSpecificPayload(url: string) { - const { hostname } = new URL(url); +import { TAuditLogStreams } from "@app/db/schemas"; +import { TKmsServiceFactory } from "@app/services/kms/kms-service"; +import { KmsDataKey } from "@app/services/kms/kms-types"; - const payload: Record = {}; +import { TAuditLogStream, TAuditLogStreamCredentials } from "./audit-log-stream-types"; +import { getCustomProviderListItem } from "./custom/custom-provider-fns"; +import { getDatadogProviderListItem } from "./datadog/datadog-provider-fns"; +import { getSplunkProviderListItem } from "./splunk/splunk-provider-fns"; - switch (hostname) { - case "http-intake.logs.datadoghq.com": - case "http-intake.logs.us3.datadoghq.com": - case "http-intake.logs.us5.datadoghq.com": - case "http-intake.logs.datadoghq.eu": - case "http-intake.logs.ap1.datadoghq.com": - case "http-intake.logs.ddog-gov.com": - payload.ddsource = "infisical"; - payload.service = "audit-logs"; - break; - default: - break; - } +export const listProviderOptions = () => { + return [getDatadogProviderListItem(), getSplunkProviderListItem(), getCustomProviderListItem()].sort((a, b) => + a.name.localeCompare(b.name) + ); +}; - return payload; -} +export const encryptLogStreamCredentials = async ({ + orgId, + credentials, + kmsService +}: { + orgId: string; + credentials: TAuditLogStreamCredentials; + kmsService: Pick; +}) => { + const { encryptor } = await kmsService.createCipherPairWithDataKey({ + type: KmsDataKey.Organization, + orgId + }); + + const { cipherTextBlob: encryptedCredentialsBlob } = encryptor({ + plainText: Buffer.from(JSON.stringify(credentials)) + }); + + return encryptedCredentialsBlob; +}; + +export const decryptLogStreamCredentials = async ({ + orgId, + encryptedCredentials, + kmsService +}: { + orgId: string; + encryptedCredentials: Buffer; + kmsService: Pick; +}) => { + const { decryptor } = await kmsService.createCipherPairWithDataKey({ + type: KmsDataKey.Organization, + orgId + }); + + const decryptedPlainTextBlob = decryptor({ + cipherTextBlob: encryptedCredentials + }); + + return JSON.parse(decryptedPlainTextBlob.toString()) as TAuditLogStreamCredentials; +}; + +export const decryptLogStream = async ( + logStream: TAuditLogStreams, + kmsService: Pick +) => { + return { + ...logStream, + credentials: await decryptLogStreamCredentials({ + encryptedCredentials: logStream.encryptedCredentials, + orgId: logStream.orgId, + kmsService + }) + } as TAuditLogStream; +}; diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-schemas.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-schemas.ts new file mode 100644 index 000000000..4fba79107 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-schemas.ts @@ -0,0 +1,14 @@ +import { AuditLogStreamsSchema } from "@app/db/schemas"; + +export const BaseProviderSchema = AuditLogStreamsSchema.omit({ + encryptedCredentials: true, + provider: true, + + // Old "archived" values + encryptedHeadersAlgorithm: true, + encryptedHeadersCiphertext: true, + encryptedHeadersIV: true, + encryptedHeadersKeyEncoding: true, + encryptedHeadersTag: true, + url: true +}); diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts index 46d2782b3..5dd0fd4ba 100644 --- a/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts @@ -1,242 +1,252 @@ import { ForbiddenError } from "@casl/ability"; -import { RawAxiosRequestHeaders } from "axios"; +import { AxiosError } from "axios"; -import { SecretKeyEncoding } from "@app/db/schemas"; -import { getConfig } from "@app/lib/config/env"; -import { request } from "@app/lib/config/request"; -import { crypto } from "@app/lib/crypto/cryptography"; -import { BadRequestError, NotFoundError, UnauthorizedError } from "@app/lib/errors"; -import { blockLocalAndPrivateIpAddresses } from "@app/lib/validator"; +import { TAuditLogs } from "@app/db/schemas"; +import { + decryptLogStream, + decryptLogStreamCredentials, + encryptLogStreamCredentials, + listProviderOptions +} from "@app/ee/services/audit-log-stream/audit-log-stream-fns"; +import { BadRequestError, NotFoundError } from "@app/lib/errors"; +import { logger } from "@app/lib/logger"; +import { OrgServiceActor } from "@app/lib/types"; +import { TKmsServiceFactory } from "@app/services/kms/kms-service"; -import { AUDIT_LOG_STREAM_TIMEOUT } from "../audit-log/audit-log-queue"; import { TLicenseServiceFactory } from "../license/license-service"; import { OrgPermissionActions, OrgPermissionSubjects } from "../permission/org-permission"; import { TPermissionServiceFactory } from "../permission/permission-service-types"; import { TAuditLogStreamDALFactory } from "./audit-log-stream-dal"; -import { providerSpecificPayload } from "./audit-log-stream-fns"; -import { LogStreamHeaders, TAuditLogStreamServiceFactory } from "./audit-log-stream-types"; +import { LogProvider } from "./audit-log-stream-enums"; +import { LOG_STREAM_FACTORY_MAP } from "./audit-log-stream-factory"; +import { TAuditLogStream, TCreateAuditLogStreamDTO, TUpdateAuditLogStreamDTO } from "./audit-log-stream-types"; +import { TCustomProviderCredentials } from "./custom/custom-provider-types"; -type TAuditLogStreamServiceFactoryDep = { +export type TAuditLogStreamServiceFactoryDep = { auditLogStreamDAL: TAuditLogStreamDALFactory; permissionService: Pick; licenseService: Pick; + kmsService: Pick; }; +export type TAuditLogStreamServiceFactory = ReturnType; + export const auditLogStreamServiceFactory = ({ auditLogStreamDAL, permissionService, - licenseService -}: TAuditLogStreamServiceFactoryDep): TAuditLogStreamServiceFactory => { - const create: TAuditLogStreamServiceFactory["create"] = async ({ - url, - actor, - headers = [], - actorId, - actorOrgId, - actorAuthMethod - }) => { - if (!actorOrgId) throw new UnauthorizedError({ message: "No organization ID attached to authentication token" }); - - const plan = await licenseService.getPlan(actorOrgId); + licenseService, + kmsService +}: TAuditLogStreamServiceFactoryDep) => { + const create = async ({ provider, credentials }: TCreateAuditLogStreamDTO, actor: OrgServiceActor) => { + const plan = await licenseService.getPlan(actor.orgId); if (!plan.auditLogStreams) { throw new BadRequestError({ - message: "Failed to create audit log streams due to plan restriction. Upgrade plan to create group." + message: "Failed to create Audit Log Stream: Plan restriction. Upgrade plan to continue." }); } const { permission } = await permissionService.getOrgPermission( - actor, - actorId, - actorOrgId, - actorAuthMethod, - actorOrgId + actor.type, + actor.id, + actor.orgId, + actor.authMethod, + actor.orgId ); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Create, OrgPermissionSubjects.Settings); - const appCfg = getConfig(); - if (appCfg.isCloud) await blockLocalAndPrivateIpAddresses(url); - - const totalStreams = await auditLogStreamDAL.find({ orgId: actorOrgId }); + const totalStreams = await auditLogStreamDAL.find({ orgId: actor.orgId }); if (totalStreams.length >= plan.auditLogStreamLimit) { throw new BadRequestError({ - message: - "Failed to create audit log streams due to plan limit reached. Kindly contact Infisical to add more streams." + message: "Failed to create Audit Log Stream: Plan limit reached. Contact Infisical to increase quota." }); } - // testing connection first - const streamHeaders: RawAxiosRequestHeaders = { "Content-Type": "application/json" }; - if (headers.length) - headers.forEach(({ key, value }) => { - streamHeaders[key] = value; - }); + const factory = LOG_STREAM_FACTORY_MAP[provider](); + const validatedCredentials = await factory.validateCredentials({ credentials }); - await request - .post( - url, - { ...providerSpecificPayload(url), ping: "ok" }, - { - headers: streamHeaders, - // request timeout - timeout: AUDIT_LOG_STREAM_TIMEOUT, - // connection timeout - signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) - } - ) - .catch((err) => { - throw new BadRequestError({ message: `Failed to connect with upstream source: ${(err as Error)?.message}` }); - }); + const encryptedCredentials = await encryptLogStreamCredentials({ + credentials: validatedCredentials, + orgId: actor.orgId, + kmsService + }); - const encryptedHeaders = headers - ? crypto.encryption().symmetric().encryptWithRootEncryptionKey(JSON.stringify(headers)) - : undefined; const logStream = await auditLogStreamDAL.create({ - orgId: actorOrgId, - url, - ...(encryptedHeaders - ? { - encryptedHeadersCiphertext: encryptedHeaders.ciphertext, - encryptedHeadersIV: encryptedHeaders.iv, - encryptedHeadersTag: encryptedHeaders.tag, - encryptedHeadersAlgorithm: encryptedHeaders.algorithm, - encryptedHeadersKeyEncoding: encryptedHeaders.encoding - } - : {}) + orgId: actor.orgId, + provider, + encryptedCredentials }); - return logStream; + + return { ...logStream, credentials: validatedCredentials } as TAuditLogStream; }; - const updateById: TAuditLogStreamServiceFactory["updateById"] = async ({ - id, - url, - actor, - headers = [], - actorId, - actorOrgId, - actorAuthMethod - }) => { - if (!actorOrgId) throw new UnauthorizedError({ message: "No organization ID attached to authentication token" }); - - const plan = await licenseService.getPlan(actorOrgId); - if (!plan.auditLogStreams) + const updateById = async ( + { logStreamId, provider, credentials }: TUpdateAuditLogStreamDTO, + actor: OrgServiceActor + ) => { + const plan = await licenseService.getPlan(actor.orgId); + if (!plan.auditLogStreams) { throw new BadRequestError({ - message: "Failed to update audit log streams due to plan restriction. Upgrade plan to create group." + message: "Failed to update Audit Log Stream: Plan restriction. Upgrade plan to continue." }); + } - const logStream = await auditLogStreamDAL.findById(id); - if (!logStream) throw new NotFoundError({ message: `Audit log stream with ID '${id}' not found` }); + const logStream = await auditLogStreamDAL.findById(logStreamId); + if (!logStream) throw new NotFoundError({ message: `Audit Log Stream with ID '${logStreamId}' not found` }); + + const { permission } = await permissionService.getOrgPermission( + actor.type, + actor.id, + actor.orgId, + actor.authMethod, + logStream.orgId + ); - const { orgId } = logStream; - const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Edit, OrgPermissionSubjects.Settings); - const appCfg = getConfig(); - if (url && appCfg.isCloud) await blockLocalAndPrivateIpAddresses(url); - // testing connection first - const streamHeaders: RawAxiosRequestHeaders = { "Content-Type": "application/json" }; - if (headers.length) - headers.forEach(({ key, value }) => { - streamHeaders[key] = value; - }); + const finalCredentials = { ...credentials }; - await request - .post( - url || logStream.url, - { ...providerSpecificPayload(url || logStream.url), ping: "ok" }, - { - headers: streamHeaders, - // request timeout - timeout: AUDIT_LOG_STREAM_TIMEOUT, - // connection timeout - signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) - } - ) - .catch((err) => { - throw new Error(`Failed to connect with the source ${(err as Error)?.message}`); - }); + // For the "Custom" provider, we must handle masked header values ('******'). + // These are placeholders from the frontend for secrets that haven't been changed. + // We need to replace them with the original, unmasked values from the database. + if ( + provider === LogProvider.Custom && + "headers" in finalCredentials && + Array.isArray(finalCredentials.headers) && + finalCredentials.headers.some((header) => header.value === "******") + ) { + const decryptedOldCredentials = (await decryptLogStreamCredentials({ + encryptedCredentials: logStream.encryptedCredentials, + orgId: logStream.orgId, + kmsService + })) as TCustomProviderCredentials; - const encryptedHeaders = headers - ? crypto.encryption().symmetric().encryptWithRootEncryptionKey(JSON.stringify(headers)) - : undefined; - const updatedLogStream = await auditLogStreamDAL.updateById(id, { - url, - ...(encryptedHeaders - ? { - encryptedHeadersCiphertext: encryptedHeaders.ciphertext, - encryptedHeadersIV: encryptedHeaders.iv, - encryptedHeadersTag: encryptedHeaders.tag, - encryptedHeadersAlgorithm: encryptedHeaders.algorithm, - encryptedHeadersKeyEncoding: encryptedHeaders.encoding + const oldHeadersMap = decryptedOldCredentials.headers.reduce>((acc, header) => { + acc[header.key] = header.value; + return acc; + }, {}); + + const finalHeaders: { key: string; value: string }[] = []; + for (const header of finalCredentials.headers) { + if (header.value === "******") { + const oldValue = oldHeadersMap[header.key]; + if (oldValue) { + finalHeaders.push({ key: header.key, value: oldValue }); } - : {}) + } else { + finalHeaders.push(header); + } + } + finalCredentials.headers = finalHeaders; + } + + const factory = LOG_STREAM_FACTORY_MAP[provider](); + const validatedCredentials = await factory.validateCredentials({ credentials: finalCredentials }); + + const encryptedCredentials = await encryptLogStreamCredentials({ + credentials: validatedCredentials, + orgId: actor.orgId, + kmsService }); - return updatedLogStream; + + const updatedLogStream = await auditLogStreamDAL.updateById(logStreamId, { + encryptedCredentials + }); + + return { ...updatedLogStream, credentials: validatedCredentials } as TAuditLogStream; }; - const deleteById: TAuditLogStreamServiceFactory["deleteById"] = async ({ - id, - actor, - actorId, - actorOrgId, - actorAuthMethod - }) => { - if (!actorOrgId) throw new UnauthorizedError({ message: "No organization ID attached to authentication token" }); + const deleteById = async (logStreamId: string, provider: LogProvider, actor: OrgServiceActor) => { + const logStream = await auditLogStreamDAL.findById(logStreamId); + if (!logStream) throw new NotFoundError({ message: `Audit Log Stream with ID '${logStreamId}' not found` }); - const logStream = await auditLogStreamDAL.findById(id); - if (!logStream) throw new NotFoundError({ message: `Audit log stream with ID '${id}' not found` }); + const { permission } = await permissionService.getOrgPermission( + actor.type, + actor.id, + actor.orgId, + actor.authMethod, + logStream.orgId + ); - const { orgId } = logStream; - const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Delete, OrgPermissionSubjects.Settings); - const deletedLogStream = await auditLogStreamDAL.deleteById(id); - return deletedLogStream; + if (logStream.provider !== provider) { + throw new BadRequestError({ + message: `Audit Log Stream with ID '${logStreamId}' is not for provider '${provider}'` + }); + } + + const deletedLogStream = await auditLogStreamDAL.deleteById(logStreamId); + + return decryptLogStream(deletedLogStream, kmsService); }; - const getById: TAuditLogStreamServiceFactory["getById"] = async ({ - id, - actor, - actorId, - actorOrgId, - actorAuthMethod - }) => { - const logStream = await auditLogStreamDAL.findById(id); - if (!logStream) throw new NotFoundError({ message: `Audit log stream with ID '${id}' not found` }); + const getById = async (logStreamId: string, provider: LogProvider, actor: OrgServiceActor) => { + const logStream = await auditLogStreamDAL.findById(logStreamId); - const { orgId } = logStream; - const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); - ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); + if (!logStream) throw new NotFoundError({ message: `Audit log stream with ID '${logStreamId}' not found` }); - const headers = - logStream?.encryptedHeadersCiphertext && logStream?.encryptedHeadersIV && logStream?.encryptedHeadersTag - ? (JSON.parse( - crypto - .encryption() - .symmetric() - .decryptWithRootEncryptionKey({ - tag: logStream.encryptedHeadersTag, - iv: logStream.encryptedHeadersIV, - ciphertext: logStream.encryptedHeadersCiphertext, - keyEncoding: logStream.encryptedHeadersKeyEncoding as SecretKeyEncoding - }) - ) as LogStreamHeaders[]) - : undefined; - - return { ...logStream, headers }; - }; - - const list: TAuditLogStreamServiceFactory["list"] = async ({ actor, actorId, actorOrgId, actorAuthMethod }) => { const { permission } = await permissionService.getOrgPermission( - actor, - actorId, - actorOrgId, - actorAuthMethod, - actorOrgId + actor.type, + actor.id, + logStream.orgId, + actor.authMethod, + actor.orgId ); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); - const logStreams = await auditLogStreamDAL.find({ orgId: actorOrgId }); - return logStreams; + if (logStream.provider !== provider) { + throw new BadRequestError({ + message: `Audit Log Stream with ID '${logStreamId}' is not for provider '${provider}'` + }); + } + + return decryptLogStream(logStream, kmsService); + }; + + const list = async (actor: OrgServiceActor) => { + const { permission } = await permissionService.getOrgPermission( + actor.type, + actor.id, + actor.orgId, + actor.authMethod, + actor.orgId + ); + + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); + + const logStreams = await auditLogStreamDAL.find({ orgId: actor.orgId }); + + return Promise.all(logStreams.map((stream) => decryptLogStream(stream, kmsService))); + }; + + const streamLog = async (orgId: string, auditLog: TAuditLogs) => { + const logStreams = await auditLogStreamDAL.find({ orgId }); + await Promise.allSettled( + logStreams.map(async ({ provider, encryptedCredentials }) => { + const credentials = await decryptLogStreamCredentials({ + encryptedCredentials, + orgId, + kmsService + }); + + const factory = LOG_STREAM_FACTORY_MAP[provider as LogProvider](); + + try { + await factory.streamLog({ + credentials, + auditLog + }); + } catch (error) { + logger.error( + error, + `Failed to stream audit log [auditLogId=${auditLog.id}] [provider=${provider}] [orgId=${orgId}]${error instanceof AxiosError ? `: ${error.message}` : ""}` + ); + throw error; + } + }) + ); }; return { @@ -244,6 +254,8 @@ export const auditLogStreamServiceFactory = ({ updateById, deleteById, getById, - list + list, + listProviderOptions, + streamLog }; }; diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts index 4c4a5609e..d0f78f632 100644 --- a/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts @@ -1,48 +1,38 @@ -import { TAuditLogStreams } from "@app/db/schemas"; -import { TOrgPermission } from "@app/lib/types"; +import { TAuditLogs } from "@app/db/schemas"; -export type LogStreamHeaders = { - key: string; - value: string; +import { LogProvider } from "./audit-log-stream-enums"; +import { TCustomProvider, TCustomProviderCredentials } from "./custom/custom-provider-types"; +import { TDatadogProvider, TDatadogProviderCredentials } from "./datadog/datadog-provider-types"; +import { TSplunkProvider, TSplunkProviderCredentials } from "./splunk/splunk-provider-types"; + +export type TAuditLogStream = TDatadogProvider | TSplunkProvider | TCustomProvider; + +export type TAuditLogStreamCredentials = + | TDatadogProviderCredentials + | TSplunkProviderCredentials + | TCustomProviderCredentials; + +export type TCreateAuditLogStreamDTO = { + provider: LogProvider; + credentials: TAuditLogStreamCredentials; }; -export type TCreateAuditLogStreamDTO = Omit & { - url: string; - headers?: LogStreamHeaders[]; +export type TUpdateAuditLogStreamDTO = { + logStreamId: string; + provider: LogProvider; + credentials: TAuditLogStreamCredentials; }; -export type TUpdateAuditLogStreamDTO = Omit & { - id: string; - url?: string; - headers?: LogStreamHeaders[]; -}; +export type TLogStreamFactoryValidateCredentials = (input: { + credentials: C; +}) => Promise; -export type TDeleteAuditLogStreamDTO = Omit & { - id: string; -}; +export type TLogStreamFactoryStreamLog = (input: { + credentials: C; + auditLog: TAuditLogs; +}) => Promise; -export type TListAuditLogStreamDTO = Omit; - -export type TGetDetailsAuditLogStreamDTO = Omit & { - id: string; -}; - -export type TAuditLogStreamServiceFactory = { - create: (arg: TCreateAuditLogStreamDTO) => Promise; - updateById: (arg: TUpdateAuditLogStreamDTO) => Promise; - deleteById: (arg: TDeleteAuditLogStreamDTO) => Promise; - getById: (arg: TGetDetailsAuditLogStreamDTO) => Promise<{ - headers: LogStreamHeaders[] | undefined; - orgId: string; - url: string; - id: string; - createdAt: Date; - updatedAt: Date; - encryptedHeadersCiphertext?: string | null | undefined; - encryptedHeadersIV?: string | null | undefined; - encryptedHeadersTag?: string | null | undefined; - encryptedHeadersAlgorithm?: string | null | undefined; - encryptedHeadersKeyEncoding?: string | null | undefined; - }>; - list: (arg: TListAuditLogStreamDTO) => Promise; +export type TLogStreamFactory = () => { + validateCredentials: TLogStreamFactoryValidateCredentials; + streamLog: TLogStreamFactoryStreamLog; }; diff --git a/backend/src/ee/services/audit-log-stream/custom/custom-provider-factory.ts b/backend/src/ee/services/audit-log-stream/custom/custom-provider-factory.ts new file mode 100644 index 000000000..6e397638c --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/custom/custom-provider-factory.ts @@ -0,0 +1,67 @@ +import { RawAxiosRequestHeaders } from "axios"; + +import { request } from "@app/lib/config/request"; +import { BadRequestError } from "@app/lib/errors"; +import { blockLocalAndPrivateIpAddresses } from "@app/lib/validator"; + +import { AUDIT_LOG_STREAM_TIMEOUT } from "../../audit-log/audit-log-queue"; +import { TLogStreamFactoryStreamLog, TLogStreamFactoryValidateCredentials } from "../audit-log-stream-types"; +import { TCustomProviderCredentials } from "./custom-provider-types"; + +export const CustomProviderFactory = () => { + const validateCredentials: TLogStreamFactoryValidateCredentials = async ({ + credentials + }) => { + const { url, headers } = credentials; + + await blockLocalAndPrivateIpAddresses(url); + + const streamHeaders: RawAxiosRequestHeaders = { "Content-Type": "application/json" }; + if (headers.length) { + headers.forEach(({ key, value }) => { + streamHeaders[key] = value; + }); + } + + await request + .post( + url, + { ping: "ok" }, + { + headers: streamHeaders, + timeout: AUDIT_LOG_STREAM_TIMEOUT, + signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) + } + ) + .catch((err) => { + throw new BadRequestError({ message: `Failed to connect with upstream source: ${(err as Error)?.message}` }); + }); + + return credentials; + }; + + const streamLog: TLogStreamFactoryStreamLog = async ({ credentials, auditLog }) => { + const { url, headers } = credentials; + + await blockLocalAndPrivateIpAddresses(url); + + const streamHeaders: RawAxiosRequestHeaders = { "Content-Type": "application/json" }; + + if (headers.length) { + headers.forEach(({ key, value }) => { + streamHeaders[key] = value; + }); + } + + await request.post(url, auditLog, { + headers: streamHeaders, + timeout: AUDIT_LOG_STREAM_TIMEOUT, + signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) + }); + }; + + return { + validateCredentials, + streamLog + }; +}; diff --git a/backend/src/ee/services/audit-log-stream/custom/custom-provider-fns.ts b/backend/src/ee/services/audit-log-stream/custom/custom-provider-fns.ts new file mode 100644 index 000000000..27b8bbf72 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/custom/custom-provider-fns.ts @@ -0,0 +1,8 @@ +import { LogProvider } from "../audit-log-stream-enums"; + +export const getCustomProviderListItem = () => { + return { + name: "Custom" as const, + provider: LogProvider.Custom as const + }; +}; diff --git a/backend/src/ee/services/audit-log-stream/custom/custom-provider-schemas.ts b/backend/src/ee/services/audit-log-stream/custom/custom-provider-schemas.ts new file mode 100644 index 000000000..d960d0fe9 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/custom/custom-provider-schemas.ts @@ -0,0 +1,50 @@ +import RE2 from "re2"; +import { z } from "zod"; + +import { LogProvider } from "../audit-log-stream-enums"; +import { BaseProviderSchema } from "../audit-log-stream-schemas"; + +export const CustomProviderCredentialsSchema = z.object({ + url: z.string().url().trim().min(1).max(255), + headers: z + .object({ + key: z + .string() + .min(1) + .refine((val) => new RE2(/^[^\n\r]+$/).test(val), "Header keys cannot contain newlines or carriage returns"), + value: z + .string() + .min(1) + .refine((val) => new RE2(/^[^\n\r]+$/).test(val), "Header values cannot contain newlines or carriage returns") + }) + .array() +}); + +const BaseCustomProviderSchema = BaseProviderSchema.extend({ provider: z.literal(LogProvider.Custom) }); + +export const CustomProviderSchema = BaseCustomProviderSchema.extend({ + credentials: CustomProviderCredentialsSchema +}); + +export const SanitizedCustomProviderSchema = BaseCustomProviderSchema.extend({ + credentials: z.object({ + url: CustomProviderCredentialsSchema.shape.url, + // Return header keys and a redacted value + headers: CustomProviderCredentialsSchema.shape.headers.transform((headers) => + headers.map((header) => ({ ...header, value: "******" })) + ) + }) +}); + +export const CustomProviderListItemSchema = z.object({ + name: z.literal("Custom"), + provider: z.literal(LogProvider.Custom) +}); + +export const CreateCustomProviderLogStreamSchema = z.object({ + credentials: CustomProviderCredentialsSchema +}); + +export const UpdateCustomProviderLogStreamSchema = z.object({ + credentials: CustomProviderCredentialsSchema +}); diff --git a/backend/src/ee/services/audit-log-stream/custom/custom-provider-types.ts b/backend/src/ee/services/audit-log-stream/custom/custom-provider-types.ts new file mode 100644 index 000000000..9b2de8347 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/custom/custom-provider-types.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; + +import { CustomProviderCredentialsSchema, CustomProviderSchema } from "./custom-provider-schemas"; + +export type TCustomProvider = z.infer; + +export type TCustomProviderCredentials = z.infer; diff --git a/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-factory.ts b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-factory.ts new file mode 100644 index 000000000..ec55784da --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-factory.ts @@ -0,0 +1,67 @@ +import { RawAxiosRequestHeaders } from "axios"; + +import { getConfig } from "@app/lib/config/env"; +import { request } from "@app/lib/config/request"; +import { BadRequestError } from "@app/lib/errors"; +import { blockLocalAndPrivateIpAddresses } from "@app/lib/validator"; + +import { AUDIT_LOG_STREAM_TIMEOUT } from "../../audit-log/audit-log-queue"; +import { TLogStreamFactoryStreamLog, TLogStreamFactoryValidateCredentials } from "../audit-log-stream-types"; +import { TDatadogProviderCredentials } from "./datadog-provider-types"; + +function createPayload(event: Record) { + const appCfg = getConfig(); + + const ddtags = [`env:${appCfg.NODE_ENV || "unknown"}`].join(","); + + return { + ...event, + hostname: new URL(appCfg.SITE_URL || "http://infisical").hostname, + ddsource: "infisical", + service: "infisical", + ddtags + }; +} + +export const DatadogProviderFactory = () => { + const validateCredentials: TLogStreamFactoryValidateCredentials = async ({ + credentials + }) => { + const { url, token } = credentials; + + await blockLocalAndPrivateIpAddresses(url); + + const streamHeaders: RawAxiosRequestHeaders = { "Content-Type": "application/json", "DD-API-KEY": token }; + + await request + .post(url, createPayload({ ping: "ok" }), { + headers: streamHeaders, + timeout: AUDIT_LOG_STREAM_TIMEOUT, + signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) + }) + .catch((err) => { + throw new BadRequestError({ message: `Failed to connect with Datadog: ${(err as Error)?.message}` }); + }); + + return credentials; + }; + + const streamLog: TLogStreamFactoryStreamLog = async ({ credentials, auditLog }) => { + const { url, token } = credentials; + + await blockLocalAndPrivateIpAddresses(url); + + const streamHeaders: RawAxiosRequestHeaders = { "Content-Type": "application/json", "DD-API-KEY": token }; + + await request.post(url, createPayload(auditLog), { + headers: streamHeaders, + timeout: AUDIT_LOG_STREAM_TIMEOUT, + signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) + }); + }; + + return { + validateCredentials, + streamLog + }; +}; diff --git a/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-fns.ts b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-fns.ts new file mode 100644 index 000000000..ec68fdb39 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-fns.ts @@ -0,0 +1,8 @@ +import { LogProvider } from "../audit-log-stream-enums"; + +export const getDatadogProviderListItem = () => { + return { + name: "Datadog" as const, + provider: LogProvider.Datadog as const + }; +}; diff --git a/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-schemas.ts b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-schemas.ts new file mode 100644 index 000000000..0445d79f2 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-schemas.ts @@ -0,0 +1,38 @@ +import RE2 from "re2"; +import { z } from "zod"; + +import { LogProvider } from "../audit-log-stream-enums"; +import { BaseProviderSchema } from "../audit-log-stream-schemas"; + +export const DatadogProviderCredentialsSchema = z.object({ + url: z.string().url().trim().min(1).max(255), + token: z + .string() + .trim() + .refine((val) => new RE2(/^[a-fA-F0-9]{32}$/).test(val), "Invalid Datadog API key format") +}); + +const BaseDatadogProviderSchema = BaseProviderSchema.extend({ provider: z.literal(LogProvider.Datadog) }); + +export const DatadogProviderSchema = BaseDatadogProviderSchema.extend({ + credentials: DatadogProviderCredentialsSchema +}); + +export const SanitizedDatadogProviderSchema = BaseDatadogProviderSchema.extend({ + credentials: DatadogProviderCredentialsSchema.pick({ + url: true + }) +}); + +export const DatadogProviderListItemSchema = z.object({ + name: z.literal("Datadog"), + provider: z.literal(LogProvider.Datadog) +}); + +export const CreateDatadogProviderLogStreamSchema = z.object({ + credentials: DatadogProviderCredentialsSchema +}); + +export const UpdateDatadogProviderLogStreamSchema = z.object({ + credentials: DatadogProviderCredentialsSchema +}); diff --git a/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-types.ts b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-types.ts new file mode 100644 index 000000000..e7f6a1f28 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/datadog/datadog-provider-types.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; + +import { DatadogProviderCredentialsSchema, DatadogProviderSchema } from "./datadog-provider-schemas"; + +export type TDatadogProvider = z.infer; + +export type TDatadogProviderCredentials = z.infer; diff --git a/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-factory.ts b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-factory.ts new file mode 100644 index 000000000..72fc90ce2 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-factory.ts @@ -0,0 +1,84 @@ +import { RawAxiosRequestHeaders } from "axios"; + +import { getConfig } from "@app/lib/config/env"; +import { request } from "@app/lib/config/request"; +import { BadRequestError } from "@app/lib/errors"; +import { blockLocalAndPrivateIpAddresses } from "@app/lib/validator"; + +import { AUDIT_LOG_STREAM_TIMEOUT } from "../../audit-log/audit-log-queue"; +import { TLogStreamFactoryStreamLog, TLogStreamFactoryValidateCredentials } from "../audit-log-stream-types"; +import { TSplunkProviderCredentials } from "./splunk-provider-types"; + +function createPayload(event: Record) { + const appCfg = getConfig(); + + return { + time: Math.floor(Date.now() / 1000), + ...(appCfg.SITE_URL && { host: new URL(appCfg.SITE_URL).host }), + source: "infisical", + sourcetype: "_json", + event + }; +} + +async function createSplunkUrl(hostname: string) { + let parsedHostname: string; + try { + parsedHostname = new URL(`https://${hostname}`).hostname; + } catch (error) { + throw new BadRequestError({ message: `Invalid Splunk hostname provided: ${(error as Error).message}` }); + } + + await blockLocalAndPrivateIpAddresses(`https://${parsedHostname}`); + + return `https://${parsedHostname}:8088/services/collector/event`; +} + +export const SplunkProviderFactory = () => { + const validateCredentials: TLogStreamFactoryValidateCredentials = async ({ + credentials + }) => { + const { hostname, token } = credentials; + + const url = await createSplunkUrl(hostname); + + const streamHeaders: RawAxiosRequestHeaders = { + "Content-Type": "application/json", + Authorization: `Splunk ${token}` + }; + + await request + .post(url, createPayload({ ping: "ok" }), { + headers: streamHeaders, + timeout: AUDIT_LOG_STREAM_TIMEOUT, + signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) + }) + .catch((err) => { + throw new BadRequestError({ message: `Failed to connect with Splunk: ${(err as Error)?.message}` }); + }); + + return credentials; + }; + + const streamLog: TLogStreamFactoryStreamLog = async ({ credentials, auditLog }) => { + const { hostname, token } = credentials; + + const url = await createSplunkUrl(hostname); + + const streamHeaders: RawAxiosRequestHeaders = { + "Content-Type": "application/json", + Authorization: `Splunk ${token}` + }; + + await request.post(url, createPayload(auditLog), { + headers: streamHeaders, + timeout: AUDIT_LOG_STREAM_TIMEOUT, + signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) + }); + }; + + return { + validateCredentials, + streamLog + }; +}; diff --git a/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-fns.ts b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-fns.ts new file mode 100644 index 000000000..e2ea2e316 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-fns.ts @@ -0,0 +1,8 @@ +import { LogProvider } from "../audit-log-stream-enums"; + +export const getSplunkProviderListItem = () => { + return { + name: "Splunk" as const, + provider: LogProvider.Splunk as const + }; +}; diff --git a/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-schemas.ts b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-schemas.ts new file mode 100644 index 000000000..ab28db616 --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-schemas.ts @@ -0,0 +1,59 @@ +import { z } from "zod"; + +import { LogProvider } from "../audit-log-stream-enums"; +import { BaseProviderSchema } from "../audit-log-stream-schemas"; + +export const SplunkProviderCredentialsSchema = z.object({ + hostname: z + .string() + .trim() + .min(1) + .max(255) + .superRefine((val, ctx) => { + if (val.includes("://")) { + ctx.addIssue({ + code: "custom", + message: "Hostname should not include protocol" + }); + return; + } + + try { + const url = new URL(`https://${val}`); + if (url.hostname !== val) { + ctx.addIssue({ + code: "custom", + message: "Must be a valid hostname without port or path" + }); + } + } catch { + ctx.addIssue({ code: "custom", message: "Invalid hostname" }); + } + }), + token: z.string().uuid().trim().min(1) +}); + +const BaseSplunkProviderSchema = BaseProviderSchema.extend({ provider: z.literal(LogProvider.Splunk) }); + +export const SplunkProviderSchema = BaseSplunkProviderSchema.extend({ + credentials: SplunkProviderCredentialsSchema +}); + +export const SanitizedSplunkProviderSchema = BaseSplunkProviderSchema.extend({ + credentials: SplunkProviderCredentialsSchema.pick({ + hostname: true + }) +}); + +export const SplunkProviderListItemSchema = z.object({ + name: z.literal("Splunk"), + provider: z.literal(LogProvider.Splunk) +}); + +export const CreateSplunkProviderLogStreamSchema = z.object({ + credentials: SplunkProviderCredentialsSchema +}); + +export const UpdateSplunkProviderLogStreamSchema = z.object({ + credentials: SplunkProviderCredentialsSchema +}); diff --git a/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-types.ts b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-types.ts new file mode 100644 index 000000000..11f7c8fcb --- /dev/null +++ b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-types.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; + +import { SplunkProviderCredentialsSchema, SplunkProviderSchema } from "./splunk-provider-schemas"; + +export type TSplunkProvider = z.infer; + +export type TSplunkProviderCredentials = z.infer; diff --git a/backend/src/ee/services/audit-log/audit-log-queue.ts b/backend/src/ee/services/audit-log/audit-log-queue.ts index 0914b8f6b..6b286c2ec 100644 --- a/backend/src/ee/services/audit-log/audit-log-queue.ts +++ b/backend/src/ee/services/audit-log/audit-log-queue.ts @@ -1,22 +1,14 @@ -import { AxiosError, RawAxiosRequestHeaders } from "axios"; - -import { SecretKeyEncoding } from "@app/db/schemas"; -import { request } from "@app/lib/config/request"; -import { crypto } from "@app/lib/crypto/cryptography"; -import { logger } from "@app/lib/logger"; +import { TAuditLogStreamServiceFactory } from "@app/ee/services/audit-log-stream/audit-log-stream-service"; import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue"; import { TProjectDALFactory } from "@app/services/project/project-dal"; -import { TAuditLogStreamDALFactory } from "../audit-log-stream/audit-log-stream-dal"; -import { providerSpecificPayload } from "../audit-log-stream/audit-log-stream-fns"; -import { LogStreamHeaders } from "../audit-log-stream/audit-log-stream-types"; import { TLicenseServiceFactory } from "../license/license-service"; import { TAuditLogDALFactory } from "./audit-log-dal"; import { TCreateAuditLogDTO } from "./audit-log-types"; type TAuditLogQueueServiceFactoryDep = { auditLogDAL: TAuditLogDALFactory; - auditLogStreamDAL: Pick; + auditLogStreamService: Pick; queueService: TQueueServiceFactory; projectDAL: Pick; licenseService: Pick; @@ -35,7 +27,7 @@ export const auditLogQueueServiceFactory = async ({ queueService, projectDAL, licenseService, - auditLogStreamDAL + auditLogStreamService }: TAuditLogQueueServiceFactoryDep): Promise => { const pushToLog = async (data: TCreateAuditLogDTO) => { await queueService.queue(QueueName.AuditLog, QueueJobs.AuditLog, data, { @@ -86,60 +78,7 @@ export const auditLogQueueServiceFactory = async ({ userAgentType }); - const logStreams = orgId ? await auditLogStreamDAL.find({ orgId }) : []; - await Promise.allSettled( - logStreams.map( - async ({ - url, - encryptedHeadersTag, - encryptedHeadersIV, - encryptedHeadersKeyEncoding, - encryptedHeadersCiphertext - }) => { - const streamHeaders = - encryptedHeadersIV && encryptedHeadersCiphertext && encryptedHeadersTag - ? (JSON.parse( - crypto - .encryption() - .symmetric() - .decryptWithRootEncryptionKey({ - keyEncoding: encryptedHeadersKeyEncoding as SecretKeyEncoding, - iv: encryptedHeadersIV, - tag: encryptedHeadersTag, - ciphertext: encryptedHeadersCiphertext - }) - ) as LogStreamHeaders[]) - : []; - - const headers: RawAxiosRequestHeaders = { "Content-Type": "application/json" }; - - if (streamHeaders.length) - streamHeaders.forEach(({ key, value }) => { - headers[key] = value; - }); - - try { - const response = await request.post( - url, - { ...providerSpecificPayload(url), ...auditLog }, - { - headers, - // request timeout - timeout: AUDIT_LOG_STREAM_TIMEOUT, - // connection timeout - signal: AbortSignal.timeout(AUDIT_LOG_STREAM_TIMEOUT) - } - ); - return response; - } catch (error) { - logger.error( - `Failed to stream audit log [url=${url}] for org [orgId=${orgId}] [error=${(error as AxiosError).message}]` - ); - return error; - } - } - ) - ); + await auditLogStreamService.streamLog(orgId, auditLog); } }); diff --git a/backend/src/ee/services/audit-log/audit-log-service.ts b/backend/src/ee/services/audit-log/audit-log-service.ts index 06186d54b..ece5edaf9 100644 --- a/backend/src/ee/services/audit-log/audit-log-service.ts +++ b/backend/src/ee/services/audit-log/audit-log-service.ts @@ -6,9 +6,9 @@ import { getConfig } from "@app/lib/config/env"; import { BadRequestError } from "@app/lib/errors"; import { ActorType } from "@app/services/auth/auth-type"; -import { OrgPermissionActions, OrgPermissionSubjects } from "../permission/org-permission"; +import { OrgPermissionAuditLogsActions, OrgPermissionSubjects } from "../permission/org-permission"; import { TPermissionServiceFactory } from "../permission/permission-service-types"; -import { ProjectPermissionActions, ProjectPermissionSub } from "../permission/project-permission"; +import { ProjectPermissionAuditLogsActions, ProjectPermissionSub } from "../permission/project-permission"; import { TAuditLogDALFactory } from "./audit-log-dal"; import { TAuditLogQueueServiceFactory } from "./audit-log-queue"; import { EventType, TAuditLogServiceFactory } from "./audit-log-types"; @@ -41,7 +41,10 @@ export const auditLogServiceFactory = ({ actorOrgId, actionProjectType: ActionProjectType.Any }); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.AuditLogs); + ForbiddenError.from(permission).throwUnlessCan( + ProjectPermissionAuditLogsActions.Read, + ProjectPermissionSub.AuditLogs + ); } else { // Organization-wide logs const { permission } = await permissionService.getOrgPermission( @@ -52,7 +55,10 @@ export const auditLogServiceFactory = ({ actorOrgId ); - ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.AuditLogs); + ForbiddenError.from(permission).throwUnlessCan( + OrgPermissionAuditLogsActions.Read, + OrgPermissionSubjects.AuditLogs + ); } // If project ID is not provided, then we need to return all the audit logs for the organization itself. diff --git a/backend/src/ee/services/dynamic-secret/providers/cassandra.ts b/backend/src/ee/services/dynamic-secret/providers/cassandra.ts index 294a9a723..32efd9848 100644 --- a/backend/src/ee/services/dynamic-secret/providers/cassandra.ts +++ b/backend/src/ee/services/dynamic-secret/providers/cassandra.ts @@ -30,7 +30,7 @@ const generateUsername = (usernameTemplate?: string | null, identity?: { name: s export const CassandraProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretCassandraSchema.parseAsync(inputs); - const hostIps = await Promise.all( + await Promise.all( providerInputs.host .split(",") .filter(Boolean) @@ -48,10 +48,10 @@ export const CassandraProvider = (): TDynamicProviderFns => { allowedExpressions: (val) => ["username"].includes(val) }); - return { ...providerInputs, hostIps }; + return { ...providerInputs }; }; - const $getClient = async (providerInputs: z.infer & { hostIps: string[] }) => { + const $getClient = async (providerInputs: z.infer) => { const sslOptions = providerInputs.ca ? { rejectUnauthorized: false, ca: providerInputs.ca } : undefined; const client = new cassandra.Client({ sslOptions, @@ -64,7 +64,7 @@ export const CassandraProvider = (): TDynamicProviderFns => { }, keyspace: providerInputs.keyspace, localDataCenter: providerInputs?.localDataCenter, - contactPoints: providerInputs.hostIps + contactPoints: providerInputs.host.split(",") }); return client; }; diff --git a/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts b/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts index bde62fc61..f4d43f23f 100644 --- a/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts +++ b/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts @@ -28,14 +28,14 @@ const generateUsername = (usernameTemplate?: string | null, identity?: { name: s export const ElasticSearchProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretElasticSearchSchema.parseAsync(inputs); - const [hostIp] = await verifyHostInputValidity(providerInputs.host); - return { ...providerInputs, hostIp }; + await verifyHostInputValidity(providerInputs.host); + return { ...providerInputs }; }; - const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { + const $getClient = async (providerInputs: z.infer) => { const connection = new ElasticSearchClient({ node: { - url: new URL(`${providerInputs.hostIp}:${providerInputs.port}`), + url: new URL(`${providerInputs.host}:${providerInputs.port}`), ...(providerInputs.ca && { ssl: { rejectUnauthorized: false, diff --git a/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts b/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts index dfae417f6..db1d30dfa 100644 --- a/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts +++ b/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts @@ -28,15 +28,15 @@ const generateUsername = (usernameTemplate?: string | null, identity?: { name: s export const MongoDBProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretMongoDBSchema.parseAsync(inputs); - const [hostIp] = await verifyHostInputValidity(providerInputs.host); - return { ...providerInputs, hostIp }; + await verifyHostInputValidity(providerInputs.host); + return { ...providerInputs }; }; - const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { + const $getClient = async (providerInputs: z.infer) => { const isSrv = !providerInputs.port; const uri = isSrv - ? `mongodb+srv://${providerInputs.hostIp}` - : `mongodb://${providerInputs.hostIp}:${providerInputs.port}`; + ? `mongodb+srv://${providerInputs.host}` + : `mongodb://${providerInputs.host}:${providerInputs.port}`; const client = new MongoClient(uri, { auth: { diff --git a/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts b/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts index 2660d9d8a..f3a0470b0 100644 --- a/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts +++ b/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts @@ -87,13 +87,13 @@ async function deleteRabbitMqUser({ axiosInstance, usernameToDelete }: TDeleteRa export const RabbitMqProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretRabbitMqSchema.parseAsync(inputs); - const [hostIp] = await verifyHostInputValidity(providerInputs.host); - return { ...providerInputs, hostIp }; + await verifyHostInputValidity(providerInputs.host); + return { ...providerInputs }; }; - const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { + const $getClient = async (providerInputs: z.infer) => { const axiosInstance = axios.create({ - baseURL: `${providerInputs.hostIp}:${providerInputs.port}/api`, + baseURL: `${providerInputs.host}:${providerInputs.port}/api`, auth: { username: providerInputs.username, password: providerInputs.password diff --git a/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts b/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts index b84859484..34f77d465 100644 --- a/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts +++ b/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts @@ -36,7 +36,7 @@ export const SapAseProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretSapAseSchema.parseAsync(inputs); - const [hostIp] = await verifyHostInputValidity(providerInputs.host); + await verifyHostInputValidity(providerInputs.host); validateHandlebarTemplate("SAP ASE creation", providerInputs.creationStatement, { allowedExpressions: (val) => ["username", "password"].includes(val) }); @@ -45,16 +45,13 @@ export const SapAseProvider = (): TDynamicProviderFns => { allowedExpressions: (val) => ["username"].includes(val) }); } - return { ...providerInputs, hostIp }; + return { ...providerInputs }; }; - const $getClient = async ( - providerInputs: z.infer & { hostIp: string }, - useMaster?: boolean - ) => { + const $getClient = async (providerInputs: z.infer, useMaster?: boolean) => { const connectionString = `DRIVER={FreeTDS};` + - `SERVER=${providerInputs.hostIp};` + + `SERVER=${providerInputs.host};` + `PORT=${providerInputs.port};` + `DATABASE=${useMaster ? "master" : providerInputs.database};` + `UID=${providerInputs.username};` + diff --git a/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts b/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts index 53b88a192..bc7400a36 100644 --- a/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts +++ b/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts @@ -37,7 +37,7 @@ export const SapHanaProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretSapHanaSchema.parseAsync(inputs); - const [hostIp] = await verifyHostInputValidity(providerInputs.host); + await verifyHostInputValidity(providerInputs.host); validateHandlebarTemplate("SAP Hana creation", providerInputs.creationStatement, { allowedExpressions: (val) => ["username", "password", "expiration"].includes(val) }); @@ -49,12 +49,12 @@ export const SapHanaProvider = (): TDynamicProviderFns => { validateHandlebarTemplate("SAP Hana revoke", providerInputs.revocationStatement, { allowedExpressions: (val) => ["username"].includes(val) }); - return { ...providerInputs, hostIp }; + return { ...providerInputs }; }; - const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { + const $getClient = async (providerInputs: z.infer) => { const client = hdb.createClient({ - host: providerInputs.hostIp, + host: providerInputs.host, port: providerInputs.port, user: providerInputs.username, password: providerInputs.password, diff --git a/backend/src/ee/services/dynamic-secret/providers/sql-database.ts b/backend/src/ee/services/dynamic-secret/providers/sql-database.ts index c8d036ce3..57ce710b1 100644 --- a/backend/src/ee/services/dynamic-secret/providers/sql-database.ts +++ b/backend/src/ee/services/dynamic-secret/providers/sql-database.ts @@ -150,8 +150,10 @@ export const SqlDatabaseProvider = ({ gatewayService }: TSqlDatabaseProviderDTO) return { ...providerInputs, hostIp }; }; - const $getClient = async (providerInputs: z.infer) => { - const ssl = providerInputs.ca ? { rejectUnauthorized: false, ca: providerInputs.ca } : undefined; + const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { + const ssl = providerInputs.ca + ? { rejectUnauthorized: false, ca: providerInputs.ca, servername: providerInputs.host } + : undefined; const isMsSQLClient = providerInputs.client === SqlProviders.MsSQL; const db = knex({ @@ -159,7 +161,7 @@ export const SqlDatabaseProvider = ({ gatewayService }: TSqlDatabaseProviderDTO) connection: { database: providerInputs.database, port: providerInputs.port, - host: providerInputs.host, + host: providerInputs.client === SqlProviders.Postgres ? providerInputs.hostIp : providerInputs.host, user: providerInputs.username, password: providerInputs.password, ssl, @@ -209,8 +211,8 @@ export const SqlDatabaseProvider = ({ gatewayService }: TSqlDatabaseProviderDTO) const validateConnection = async (inputs: unknown) => { const providerInputs = await validateProviderInputs(inputs); let isConnected = false; - const gatewayCallback = async (host = providerInputs.hostIp, port = providerInputs.port) => { - const db = await $getClient({ ...providerInputs, port, host }); + const gatewayCallback = async (host = providerInputs.host, port = providerInputs.port) => { + const db = await $getClient({ ...providerInputs, port, host, hostIp: providerInputs.hostIp }); // oracle needs from keyword const testStatement = providerInputs.client === SqlProviders.Oracle ? "SELECT 1 FROM DUAL" : "SELECT 1"; diff --git a/backend/src/ee/services/event/event-bus-service.ts b/backend/src/ee/services/event/event-bus-service.ts index bb102c721..00fd14e9f 100644 --- a/backend/src/ee/services/event/event-bus-service.ts +++ b/backend/src/ee/services/event/event-bus-service.ts @@ -1,11 +1,11 @@ -import Redis from "ioredis"; +import { Cluster, Redis } from "ioredis"; import { z } from "zod"; import { logger } from "@app/lib/logger"; import { BusEventSchema, TopicName } from "./types"; -export const eventBusFactory = (redis: Redis) => { +export const eventBusFactory = (redis: Redis | Cluster) => { const publisher = redis.duplicate(); // Duplicate the publisher to create a subscriber. // This is necessary because Redis does not allow a single connection to both publish and subscribe. diff --git a/backend/src/ee/services/event/event-sse-service.ts b/backend/src/ee/services/event/event-sse-service.ts index dc52cc14c..147af8e3c 100644 --- a/backend/src/ee/services/event/event-sse-service.ts +++ b/backend/src/ee/services/event/event-sse-service.ts @@ -1,6 +1,6 @@ /* eslint-disable no-continue */ import { subject } from "@casl/ability"; -import Redis from "ioredis"; +import { Cluster, Redis } from "ioredis"; import { KeyStorePrefixes } from "@app/keystore/keystore"; import { logger } from "@app/lib/logger"; @@ -12,7 +12,7 @@ import { BusEvent, RegisteredEvent } from "./types"; const AUTH_REFRESH_INTERVAL = 60 * 1000; const HEART_BEAT_INTERVAL = 15 * 1000; -export const sseServiceFactory = (bus: TEventBusService, redis: Redis) => { +export const sseServiceFactory = (bus: TEventBusService, redis: Redis | Cluster) => { const clients = new Set(); const heartbeatInterval = setInterval(() => { diff --git a/backend/src/ee/services/event/event-sse-stream.ts b/backend/src/ee/services/event/event-sse-stream.ts index 13e18374f..9ed5e677c 100644 --- a/backend/src/ee/services/event/event-sse-stream.ts +++ b/backend/src/ee/services/event/event-sse-stream.ts @@ -3,7 +3,7 @@ import { Readable } from "node:stream"; import { MongoAbility, PureAbility } from "@casl/ability"; import { MongoQuery } from "@ucast/mongo2js"; -import Redis from "ioredis"; +import { Cluster, Redis } from "ioredis"; import { nanoid } from "nanoid"; import { ProjectType } from "@app/db/schemas"; @@ -65,7 +65,7 @@ export type EventStreamClient = { matcher: PureAbility; }; -export function createEventStreamClient(redis: Redis, options: IEventStreamClientOpts): EventStreamClient { +export function createEventStreamClient(redis: Redis | Cluster, options: IEventStreamClientOpts): EventStreamClient { const rules = options.registered.map((r) => { const secretPath = r.conditions?.secretPath; const hasConditions = r.conditions?.environmentSlug || r.conditions?.secretPath; diff --git a/backend/src/ee/services/github-org-sync/github-org-sync-service.ts b/backend/src/ee/services/github-org-sync/github-org-sync-service.ts index 37d1bd398..7c4ad15eb 100644 --- a/backend/src/ee/services/github-org-sync/github-org-sync-service.ts +++ b/backend/src/ee/services/github-org-sync/github-org-sync-service.ts @@ -1,14 +1,19 @@ +/* eslint-disable @typescript-eslint/return-await */ +/* eslint-disable no-await-in-loop */ import { ForbiddenError } from "@casl/ability"; import { Octokit } from "@octokit/core"; import { paginateGraphql } from "@octokit/plugin-paginate-graphql"; import { Octokit as OctokitRest } from "@octokit/rest"; +import RE2 from "re2"; import { OrgMembershipRole } from "@app/db/schemas"; import { BadRequestError, NotFoundError } from "@app/lib/errors"; import { groupBy } from "@app/lib/fn"; import { logger } from "@app/lib/logger"; +import { retryWithBackoff } from "@app/lib/retry"; import { TKmsServiceFactory } from "@app/services/kms/kms-service"; import { KmsDataKey } from "@app/services/kms/kms-types"; +import { TOrgMembershipDALFactory } from "@app/services/org-membership/org-membership-dal"; import { TGroupDALFactory } from "../group/group-dal"; import { TUserGroupMembershipDALFactory } from "../group/user-group-membership-dal"; @@ -16,20 +21,67 @@ import { TLicenseServiceFactory } from "../license/license-service"; import { OrgPermissionActions, OrgPermissionSubjects } from "../permission/org-permission"; import { TPermissionServiceFactory } from "../permission/permission-service-types"; import { TGithubOrgSyncDALFactory } from "./github-org-sync-dal"; -import { TCreateGithubOrgSyncDTO, TDeleteGithubOrgSyncDTO, TUpdateGithubOrgSyncDTO } from "./github-org-sync-types"; +import { + TCreateGithubOrgSyncDTO, + TDeleteGithubOrgSyncDTO, + TSyncAllTeamsDTO, + TSyncResult, + TUpdateGithubOrgSyncDTO, + TValidateGithubTokenDTO +} from "./github-org-sync-types"; const OctokitWithPlugin = Octokit.plugin(paginateGraphql); +// Type definitions for GitHub API errors +interface GitHubApiError extends Error { + status?: number; + response?: { + status?: number; + headers?: { + "x-ratelimit-reset"?: string; + }; + }; +} + +interface OrgMembershipWithUser { + id: string; + orgId: string; + role: string; + status: string; + isActive: boolean; + inviteEmail: string | null; + user: { + id: string; + email: string; + username: string | null; + firstName: string | null; + lastName: string | null; + } | null; +} + +interface GroupMembership { + id: string; + groupId: string; + groupName: string; + orgMembershipId: string; + firstName: string | null; + lastName: string | null; +} + type TGithubOrgSyncServiceFactoryDep = { githubOrgSyncDAL: TGithubOrgSyncDALFactory; permissionService: Pick; kmsService: Pick; userGroupMembershipDAL: Pick< TUserGroupMembershipDALFactory, - "findGroupMembershipsByUserIdInOrg" | "insertMany" | "delete" + "findGroupMembershipsByUserIdInOrg" | "findGroupMembershipsByGroupIdInOrg" | "insertMany" | "delete" >; groupDAL: Pick; licenseService: Pick; + orgMembershipDAL: Pick< + TOrgMembershipDALFactory, + "find" | "findOrgMembershipById" | "findOrgMembershipsWithUsersByOrgId" + >; }; export type TGithubOrgSyncServiceFactory = ReturnType; @@ -40,7 +92,8 @@ export const githubOrgSyncServiceFactory = ({ kmsService, userGroupMembershipDAL, groupDAL, - licenseService + licenseService, + orgMembershipDAL }: TGithubOrgSyncServiceFactoryDep) => { const createGithubOrgSync = async ({ githubOrgName, @@ -304,8 +357,8 @@ export const githubOrgSyncServiceFactory = ({ const removeFromTeams = infisicalUserGroups.filter((el) => !githubUserTeamSet.has(el.groupName)); if (newTeams.length || updateTeams.length || removeFromTeams.length) { - await groupDAL.transaction(async (tx) => { - if (newTeams.length) { + if (newTeams.length) { + await groupDAL.transaction(async (tx) => { const newGroups = await groupDAL.insertMany( newTeams.map((newGroupName) => ({ name: newGroupName, @@ -322,9 +375,11 @@ export const githubOrgSyncServiceFactory = ({ })), tx ); - } + }); + } - if (updateTeams.length) { + if (updateTeams.length) { + await groupDAL.transaction(async (tx) => { await userGroupMembershipDAL.insertMany( updateTeams.map((el) => ({ groupId: githubUserTeamOnInfisicalGroupByName[el][0].id, @@ -332,16 +387,433 @@ export const githubOrgSyncServiceFactory = ({ })), tx ); - } + }); + } - if (removeFromTeams.length) { + if (removeFromTeams.length) { + await groupDAL.transaction(async (tx) => { await userGroupMembershipDAL.delete( { userId, $in: { groupId: removeFromTeams.map((el) => el.groupId) } }, tx ); - } + }); + } + } + }; + + const validateGithubToken = async ({ orgPermission, githubOrgAccessToken }: TValidateGithubTokenDTO) => { + const { permission } = await permissionService.getOrgPermission( + orgPermission.type, + orgPermission.id, + orgPermission.orgId, + orgPermission.authMethod, + orgPermission.orgId + ); + + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.GithubOrgSync); + + const plan = await licenseService.getPlan(orgPermission.orgId); + if (!plan.githubOrgSync) { + throw new BadRequestError({ + message: + "Failed to validate GitHub token due to plan restriction. Upgrade plan to use GitHub organization sync." }); } + + const config = await githubOrgSyncDAL.findOne({ orgId: orgPermission.orgId }); + if (!config) { + throw new BadRequestError({ message: "GitHub organization sync is not configured" }); + } + + try { + const testOctokit = new OctokitRest({ + auth: githubOrgAccessToken, + request: { + signal: AbortSignal.timeout(10000) + } + }); + + const { data: org } = await testOctokit.rest.orgs.get({ + org: config.githubOrgName + }); + + const octokitGraphQL = new OctokitWithPlugin({ + auth: githubOrgAccessToken, + request: { + signal: AbortSignal.timeout(10000) + } + }); + + await octokitGraphQL.graphql(`query($org: String!) { organization(login: $org) { id name } }`, { + org: config.githubOrgName + }); + + return { + valid: true, + organizationInfo: { + id: org.id, + login: org.login, + name: org.name || org.login, + publicRepos: org.public_repos, + privateRepos: org.owned_private_repos || 0 + } + }; + } catch (error) { + logger.error(error, `GitHub token validation failed for org ${config.githubOrgName}`); + + const gitHubError = error as GitHubApiError; + const statusCode = gitHubError.status || gitHubError.response?.status; + if (statusCode) { + if (statusCode === 401) { + throw new BadRequestError({ + message: "GitHub access token is invalid or expired." + }); + } + if (statusCode === 403) { + throw new BadRequestError({ + message: + "GitHub access token lacks required permissions. Required: 1) 'read:org' scope for organization teams, 2) Token owner must be an organization member with team visibility access, 3) Organization settings must allow team visibility. Check GitHub token scopes and organization member permissions." + }); + } + if (statusCode === 404) { + throw new BadRequestError({ + message: `Organization '${config.githubOrgName}' not found or access token does not have access to it.` + }); + } + } + + throw new BadRequestError({ + message: `GitHub token validation failed: ${(error as Error).message}` + }); + } + }; + + const syncAllTeams = async ({ orgPermission }: TSyncAllTeamsDTO): Promise => { + const { permission } = await permissionService.getOrgPermission( + orgPermission.type, + orgPermission.id, + orgPermission.orgId, + orgPermission.authMethod, + orgPermission.orgId + ); + + ForbiddenError.from(permission).throwUnlessCan( + OrgPermissionActions.Edit, + OrgPermissionSubjects.GithubOrgSyncManual + ); + + const plan = await licenseService.getPlan(orgPermission.orgId); + if (!plan.githubOrgSync) { + throw new BadRequestError({ + message: + "Failed to sync all GitHub teams due to plan restriction. Upgrade plan to use GitHub organization sync." + }); + } + + const config = await githubOrgSyncDAL.findOne({ orgId: orgPermission.orgId }); + if (!config || !config?.isActive) { + throw new BadRequestError({ message: "GitHub organization sync is not configured or not active" }); + } + + const { decryptor } = await kmsService.createCipherPairWithDataKey({ + type: KmsDataKey.Organization, + orgId: orgPermission.orgId + }); + + if (!config.encryptedGithubOrgAccessToken) { + throw new BadRequestError({ + message: "GitHub organization access token is required. Please set a token first." + }); + } + + const orgAccessToken = decryptor({ cipherTextBlob: config.encryptedGithubOrgAccessToken }).toString(); + + try { + const testOctokit = new OctokitRest({ + auth: orgAccessToken, + request: { + signal: AbortSignal.timeout(10000) + } + }); + + await testOctokit.rest.orgs.get({ + org: config.githubOrgName + }); + + await testOctokit.rest.users.getAuthenticated(); + } catch (error) { + throw new BadRequestError({ + message: "Stored GitHub access token is invalid or expired. Please set a new token." + }); + } + + const allMembers = await orgMembershipDAL.findOrgMembershipsWithUsersByOrgId(orgPermission.orgId); + const activeMembers = allMembers.filter( + (member) => member.status === "accepted" && member.isActive + ) as OrgMembershipWithUser[]; + + const startTime = Date.now(); + const syncErrors: string[] = []; + + const octokit = new OctokitWithPlugin({ + auth: orgAccessToken, + request: { + signal: AbortSignal.timeout(30000) + } + }); + + const data = await retryWithBackoff(async () => { + return octokit.graphql + .paginate<{ + organization: { + teams: { + totalCount: number; + edges: { + node: { + name: string; + description: string; + members: { + edges: { + node: { + login: string; + }; + }[]; + }; + }; + }[]; + }; + }; + }>( + ` + query orgTeams($cursor: String, $org: String!) { + organization(login: $org) { + teams(first: 100, after: $cursor) { + totalCount + edges { + node { + name + description + members(first: 100) { + edges { + node { + login + } + } + } + } + } + pageInfo { + hasNextPage + endCursor + } + } + } + } + `, + { + org: config.githubOrgName + } + ) + .catch((err) => { + logger.error(err, "GitHub GraphQL error for batched team sync"); + + const gitHubError = err as GitHubApiError; + const statusCode = gitHubError.status || gitHubError.response?.status; + if (statusCode) { + if (statusCode === 401) { + throw new BadRequestError({ + message: "GitHub access token is invalid or expired. Please provide a new token." + }); + } + if (statusCode === 403) { + throw new BadRequestError({ + message: + "GitHub access token lacks required permissions for organization team sync. Required: 1) 'admin:org' scope, 2) Token owner must be organization owner or have team read permissions, 3) Organization settings must allow team visibility. Check token scopes and user role." + }); + } + if (statusCode === 404) { + throw new BadRequestError({ + message: `Organization ${config.githubOrgName} not found or access token does not have sufficient permissions to read it.` + }); + } + } + + if ((err as Error)?.message?.includes("Although you appear to have the correct authorization credential")) { + throw new BadRequestError({ + message: + "Organization has restricted OAuth app access. Please check that: 1) Your organization has approved the Infisical OAuth application, 2) The token owner has sufficient organization permissions." + }); + } + throw new BadRequestError({ message: `GitHub GraphQL query failed: ${(err as Error)?.message}` }); + }); + }); + + const { + organization: { teams } + } = data; + + const userTeamMap = new Map(); + const allGithubUsernamesInTeams = new Set(); + + teams?.edges?.forEach((teamEdge) => { + const teamName = teamEdge.node.name.toLowerCase(); + + teamEdge.node.members.edges.forEach((memberEdge) => { + const username = memberEdge.node.login.toLowerCase(); + allGithubUsernamesInTeams.add(username); + + if (!userTeamMap.has(username)) { + userTeamMap.set(username, []); + } + userTeamMap.get(username)!.push(teamName); + }); + }); + + const allGithubTeamNames = Array.from(new Set(teams?.edges?.map((edge) => edge.node.name.toLowerCase()) || [])); + + const existingTeamsOnInfisical = await groupDAL.find({ + orgId: orgPermission.orgId, + $in: { name: allGithubTeamNames } + }); + const existingTeamsMap = groupBy(existingTeamsOnInfisical, (i) => i.name); + + const teamsToCreate = allGithubTeamNames.filter((teamName) => !(teamName in existingTeamsMap)); + const createdTeams = new Set(); + const updatedTeams = new Set(); + const totalRemovedMemberships = 0; + + await groupDAL.transaction(async (tx) => { + if (teamsToCreate.length > 0) { + const newGroups = await groupDAL.insertMany( + teamsToCreate.map((teamName) => ({ + name: teamName, + role: OrgMembershipRole.Member, + slug: teamName, + orgId: orgPermission.orgId + })), + tx + ); + + newGroups.forEach((group) => { + if (!existingTeamsMap[group.name]) { + existingTeamsMap[group.name] = []; + } + existingTeamsMap[group.name].push(group); + createdTeams.add(group.name); + }); + } + + const allTeams = [...Object.values(existingTeamsMap).flat()]; + + for (const team of allTeams) { + const teamName = team.name.toLowerCase(); + + const currentMemberships = (await userGroupMembershipDAL.findGroupMembershipsByGroupIdInOrg( + team.id, + orgPermission.orgId + )) as GroupMembership[]; + + const expectedUserIds = new Set(); + teams?.edges?.forEach((teamEdge) => { + if (teamEdge.node.name.toLowerCase() === teamName) { + teamEdge.node.members.edges.forEach((memberEdge) => { + const githubUsername = memberEdge.node.login.toLowerCase(); + + const matchingMember = activeMembers.find((member) => { + const email = member.user?.email || member.inviteEmail; + if (!email) return false; + + const emailPrefix = email.split("@")[0].toLowerCase(); + const emailDomain = email.split("@")[1].toLowerCase(); + + if (emailPrefix === githubUsername) { + return true; + } + const domainName = emailDomain.split(".")[0]; + if (githubUsername.endsWith(domainName) && githubUsername.length > domainName.length) { + const baseUsername = githubUsername.slice(0, -domainName.length); + if (emailPrefix === baseUsername) { + return true; + } + } + const emailSplitRegex = new RE2(/[._-]/); + const emailParts = emailPrefix.split(emailSplitRegex); + const longestEmailPart = emailParts.reduce((a, b) => (a.length > b.length ? a : b), ""); + if (longestEmailPart.length >= 4 && githubUsername.includes(longestEmailPart)) { + return true; + } + return false; + }); + + if (matchingMember?.user?.id) { + expectedUserIds.add(matchingMember.user.id); + logger.info( + `Matched GitHub user ${githubUsername} to email ${matchingMember.user?.email || matchingMember.inviteEmail}` + ); + } + }); + } + }); + + const currentUserIds = new Set(); + currentMemberships.forEach((membership) => { + const activeMember = activeMembers.find((am) => am.id === membership.orgMembershipId); + if (activeMember?.user?.id) { + currentUserIds.add(activeMember.user.id); + } + }); + + const usersToAdd = Array.from(expectedUserIds).filter((userId) => !currentUserIds.has(userId)); + + const membershipsToRemove = currentMemberships.filter((membership) => { + const activeMember = activeMembers.find((am) => am.id === membership.orgMembershipId); + return activeMember?.user?.id && !expectedUserIds.has(activeMember.user.id); + }); + + if (usersToAdd.length > 0) { + await userGroupMembershipDAL.insertMany( + usersToAdd.map((userId) => ({ + userId, + groupId: team.id + })), + tx + ); + updatedTeams.add(teamName); + } + + if (membershipsToRemove.length > 0) { + await userGroupMembershipDAL.delete( + { + $in: { + id: membershipsToRemove.map((m) => m.id) + } + }, + tx + ); + updatedTeams.add(teamName); + } + } + }); + + const syncDuration = Date.now() - startTime; + + logger.info( + { + orgId: orgPermission.orgId, + createdTeams: createdTeams.size, + syncDuration + }, + "GitHub team sync completed" + ); + + return { + totalUsers: activeMembers.length, + errors: syncErrors, + createdTeams: Array.from(createdTeams), + updatedTeams: Array.from(updatedTeams), + removedMemberships: totalRemovedMemberships, + syncDuration + }; }; return { @@ -349,6 +821,8 @@ export const githubOrgSyncServiceFactory = ({ updateGithubOrgSync, deleteGithubOrgSync, getGithubOrgSync, - syncUserGroups + syncUserGroups, + syncAllTeams, + validateGithubToken }; }; diff --git a/backend/src/ee/services/github-org-sync/github-org-sync-types.ts b/backend/src/ee/services/github-org-sync/github-org-sync-types.ts index e1df71e82..909414c2f 100644 --- a/backend/src/ee/services/github-org-sync/github-org-sync-types.ts +++ b/backend/src/ee/services/github-org-sync/github-org-sync-types.ts @@ -21,3 +21,21 @@ export interface TDeleteGithubOrgSyncDTO { export interface TGetGithubOrgSyncDTO { orgPermission: OrgServiceActor; } + +export interface TSyncAllTeamsDTO { + orgPermission: OrgServiceActor; +} + +export interface TSyncResult { + totalUsers: number; + errors: string[]; + createdTeams: string[]; + updatedTeams: string[]; + removedMemberships: number; + syncDuration: number; +} + +export interface TValidateGithubTokenDTO { + orgPermission: OrgServiceActor; + githubOrgAccessToken: string; +} diff --git a/backend/src/ee/services/license/license-service.ts b/backend/src/ee/services/license/license-service.ts index 891fa208f..a3327b264 100644 --- a/backend/src/ee/services/license/license-service.ts +++ b/backend/src/ee/services/license/license-service.ts @@ -323,6 +323,8 @@ export const licenseServiceFactory = ({ }); } + await updateSubscriptionOrgMemberCount(orgId); + const { data: { url } } = await licenseServerCloudApi.request.post( @@ -722,6 +724,16 @@ export const licenseServiceFactory = ({ await keyStore.deleteItem(FEATURE_CACHE_KEY(orgId)); }; + const getCustomerId = () => { + if (!selfHostedLicense) return "unknown"; + return selfHostedLicense?.customerId; + }; + + const getLicenseId = () => { + if (!selfHostedLicense) return "unknown"; + return selfHostedLicense?.licenseId; + }; + return { generateOrgCustomerId, removeOrgCustomer, @@ -736,6 +748,8 @@ export const licenseServiceFactory = ({ return onPremFeatures; }, getPlan, + getCustomerId, + getLicenseId, invalidateGetPlan, updateSubscriptionOrgMemberCount, refreshPlan, diff --git a/backend/src/ee/services/permission/default-roles.ts b/backend/src/ee/services/permission/default-roles.ts index 349130d8e..9329c3c7f 100644 --- a/backend/src/ee/services/permission/default-roles.ts +++ b/backend/src/ee/services/permission/default-roles.ts @@ -2,6 +2,7 @@ import { AbilityBuilder, createMongoAbility, MongoAbility } from "@casl/ability" import { ProjectPermissionActions, + ProjectPermissionAuditLogsActions, ProjectPermissionCertificateActions, ProjectPermissionCmekActions, ProjectPermissionCommitsActions, @@ -394,7 +395,7 @@ const buildMemberPermissionRules = () => { ); can([ProjectPermissionActions.Read], ProjectPermissionSub.Role); - can([ProjectPermissionActions.Read], ProjectPermissionSub.AuditLogs); + can([ProjectPermissionAuditLogsActions.Read], ProjectPermissionSub.AuditLogs); can([ProjectPermissionActions.Read], ProjectPermissionSub.IpAllowList); // double check if all CRUD are needed for CA and Certificates @@ -502,7 +503,7 @@ const buildViewerPermissionRules = () => { can(ProjectPermissionActions.Read, ProjectPermissionSub.Settings); can(ProjectPermissionActions.Read, ProjectPermissionSub.Environments); can(ProjectPermissionActions.Read, ProjectPermissionSub.Tags); - can(ProjectPermissionActions.Read, ProjectPermissionSub.AuditLogs); + can(ProjectPermissionAuditLogsActions.Read, ProjectPermissionSub.AuditLogs); can(ProjectPermissionActions.Read, ProjectPermissionSub.IpAllowList); can(ProjectPermissionActions.Read, ProjectPermissionSub.CertificateAuthorities); can(ProjectPermissionCertificateActions.Read, ProjectPermissionSub.Certificates); diff --git a/backend/src/ee/services/permission/org-permission.ts b/backend/src/ee/services/permission/org-permission.ts index 2436dae2a..d4155d02c 100644 --- a/backend/src/ee/services/permission/org-permission.ts +++ b/backend/src/ee/services/permission/org-permission.ts @@ -23,6 +23,10 @@ export enum OrgPermissionAppConnectionActions { Connect = "connect" } +export enum OrgPermissionAuditLogsActions { + Read = "read" +} + export enum OrgPermissionKmipActions { Proxy = "proxy", Setup = "setup" @@ -90,6 +94,7 @@ export enum OrgPermissionSubjects { Sso = "sso", Scim = "scim", GithubOrgSync = "github-org-sync", + GithubOrgSyncManual = "github-org-sync-manual", Ldap = "ldap", Groups = "groups", Billing = "billing", @@ -119,13 +124,14 @@ export type OrgPermissionSet = | [OrgPermissionActions, OrgPermissionSubjects.Sso] | [OrgPermissionActions, OrgPermissionSubjects.Scim] | [OrgPermissionActions, OrgPermissionSubjects.GithubOrgSync] + | [OrgPermissionActions, OrgPermissionSubjects.GithubOrgSyncManual] | [OrgPermissionActions, OrgPermissionSubjects.Ldap] | [OrgPermissionGroupActions, OrgPermissionSubjects.Groups] | [OrgPermissionActions, OrgPermissionSubjects.SecretScanning] | [OrgPermissionBillingActions, OrgPermissionSubjects.Billing] | [OrgPermissionIdentityActions, OrgPermissionSubjects.Identity] | [OrgPermissionActions, OrgPermissionSubjects.Kms] - | [OrgPermissionActions, OrgPermissionSubjects.AuditLogs] + | [OrgPermissionAuditLogsActions, OrgPermissionSubjects.AuditLogs] | [OrgPermissionActions, OrgPermissionSubjects.ProjectTemplates] | [OrgPermissionGatewayActions, OrgPermissionSubjects.Gateway] | [ @@ -188,6 +194,10 @@ export const OrgPermissionSchema = z.discriminatedUnion("subject", [ subject: z.literal(OrgPermissionSubjects.GithubOrgSync).describe("The entity this permission pertains to."), action: CASL_ACTION_SCHEMA_NATIVE_ENUM(OrgPermissionActions).describe("Describe what action an entity can take.") }), + z.object({ + subject: z.literal(OrgPermissionSubjects.GithubOrgSyncManual).describe("The entity this permission pertains to."), + action: CASL_ACTION_SCHEMA_NATIVE_ENUM(OrgPermissionActions).describe("Describe what action an entity can take.") + }), z.object({ subject: z.literal(OrgPermissionSubjects.Ldap).describe("The entity this permission pertains to."), action: CASL_ACTION_SCHEMA_NATIVE_ENUM(OrgPermissionActions).describe("Describe what action an entity can take.") @@ -214,7 +224,9 @@ export const OrgPermissionSchema = z.discriminatedUnion("subject", [ }), z.object({ subject: z.literal(OrgPermissionSubjects.AuditLogs).describe("The entity this permission pertains to."), - action: CASL_ACTION_SCHEMA_NATIVE_ENUM(OrgPermissionActions).describe("Describe what action an entity can take.") + action: CASL_ACTION_SCHEMA_NATIVE_ENUM(OrgPermissionAuditLogsActions).describe( + "Describe what action an entity can take." + ) }), z.object({ subject: z.literal(OrgPermissionSubjects.ProjectTemplates).describe("The entity this permission pertains to."), @@ -309,6 +321,11 @@ const buildAdminPermission = () => { can(OrgPermissionActions.Edit, OrgPermissionSubjects.GithubOrgSync); can(OrgPermissionActions.Delete, OrgPermissionSubjects.GithubOrgSync); + can(OrgPermissionActions.Read, OrgPermissionSubjects.GithubOrgSyncManual); + can(OrgPermissionActions.Create, OrgPermissionSubjects.GithubOrgSyncManual); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.GithubOrgSyncManual); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.GithubOrgSyncManual); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Ldap); can(OrgPermissionActions.Create, OrgPermissionSubjects.Ldap); can(OrgPermissionActions.Edit, OrgPermissionSubjects.Ldap); @@ -340,10 +357,7 @@ const buildAdminPermission = () => { can(OrgPermissionActions.Edit, OrgPermissionSubjects.Kms); can(OrgPermissionActions.Delete, OrgPermissionSubjects.Kms); - can(OrgPermissionActions.Read, OrgPermissionSubjects.AuditLogs); - can(OrgPermissionActions.Create, OrgPermissionSubjects.AuditLogs); - can(OrgPermissionActions.Edit, OrgPermissionSubjects.AuditLogs); - can(OrgPermissionActions.Delete, OrgPermissionSubjects.AuditLogs); + can(OrgPermissionAuditLogsActions.Read, OrgPermissionSubjects.AuditLogs); can(OrgPermissionActions.Read, OrgPermissionSubjects.ProjectTemplates); can(OrgPermissionActions.Create, OrgPermissionSubjects.ProjectTemplates); @@ -416,7 +430,7 @@ const buildMemberPermission = () => { can(OrgPermissionIdentityActions.Edit, OrgPermissionSubjects.Identity); can(OrgPermissionIdentityActions.Delete, OrgPermissionSubjects.Identity); - can(OrgPermissionActions.Read, OrgPermissionSubjects.AuditLogs); + can(OrgPermissionAuditLogsActions.Read, OrgPermissionSubjects.AuditLogs); can(OrgPermissionAppConnectionActions.Connect, OrgPermissionSubjects.AppConnections); can(OrgPermissionGatewayActions.ListGateways, OrgPermissionSubjects.Gateway); diff --git a/backend/src/ee/services/permission/project-permission.ts b/backend/src/ee/services/permission/project-permission.ts index ab8fea5df..20b4344d3 100644 --- a/backend/src/ee/services/permission/project-permission.ts +++ b/backend/src/ee/services/permission/project-permission.ts @@ -164,6 +164,10 @@ export enum ProjectPermissionSecretEventActions { SubscribeImportMutations = "subscribe-on-import-mutations" } +export enum ProjectPermissionAuditLogsActions { + Read = "read" +} + export enum ProjectPermissionSub { Role = "role", Member = "member", @@ -304,7 +308,7 @@ export type ProjectPermissionSet = | [ProjectPermissionGroupActions, ProjectPermissionSub.Groups] | [ProjectPermissionActions, ProjectPermissionSub.Integrations] | [ProjectPermissionActions, ProjectPermissionSub.Webhooks] - | [ProjectPermissionActions, ProjectPermissionSub.AuditLogs] + | [ProjectPermissionAuditLogsActions, ProjectPermissionSub.AuditLogs] | [ProjectPermissionActions, ProjectPermissionSub.Environments] | [ProjectPermissionActions, ProjectPermissionSub.IpAllowList] | [ProjectPermissionActions, ProjectPermissionSub.Settings] @@ -645,7 +649,7 @@ const GeneralPermissionSchema = [ }), z.object({ subject: z.literal(ProjectPermissionSub.AuditLogs).describe("The entity this permission pertains to."), - action: CASL_ACTION_SCHEMA_NATIVE_ENUM(ProjectPermissionActions).describe( + action: CASL_ACTION_SCHEMA_NATIVE_ENUM(ProjectPermissionAuditLogsActions).describe( "Describe what action an entity can take." ) }), diff --git a/backend/src/ee/services/secret-replication/secret-replication-service.ts b/backend/src/ee/services/secret-replication/secret-replication-service.ts index 4a5558f46..db41d00f7 100644 --- a/backend/src/ee/services/secret-replication/secret-replication-service.ts +++ b/backend/src/ee/services/secret-replication/secret-replication-service.ts @@ -59,7 +59,7 @@ type TSecretReplicationServiceFactoryDep = { TSecretVersionV2DALFactory, "find" | "insertMany" | "update" | "findLatestVersionMany" >; - secretImportDAL: Pick; + secretImportDAL: Pick; folderDAL: Pick< TSecretFolderDALFactory, "findSecretPathByFolderIds" | "findBySecretPath" | "create" | "findOne" | "findByManySecretPath" diff --git a/backend/src/keystore/keystore.ts b/backend/src/keystore/keystore.ts index 3f7b8dc9f..5acfdc65e 100644 --- a/backend/src/keystore/keystore.ts +++ b/backend/src/keystore/keystore.ts @@ -38,9 +38,11 @@ export const KeyStorePrefixes = { SyncSecretIntegrationLastRunTimestamp: (projectId: string, environmentSlug: string, secretPath: string) => `sync-integration-last-run-${projectId}-${environmentSlug}-${secretPath}` as const, SecretSyncLock: (syncId: string) => `secret-sync-mutex-${syncId}` as const, + AppConnectionConcurrentJobs: (connectionId: string) => `app-connection-concurrency-${connectionId}` as const, SecretRotationLock: (rotationId: string) => `secret-rotation-v2-mutex-${rotationId}` as const, SecretScanningLock: (dataSourceId: string, resourceExternalId: string) => `secret-scanning-v2-mutex-${dataSourceId}-${resourceExternalId}` as const, + IdentityLockoutLock: (lockoutKey: string) => `identity-lockout-lock-${lockoutKey}` as const, CaOrderCertificateForSubscriberLock: (subscriberId: string) => `ca-order-certificate-for-subscriber-lock-${subscriberId}` as const, SecretSyncLastRunTimestamp: (syncId: string) => `secret-sync-last-run-${syncId}` as const, diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 985f3b60f..d61694d8f 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -2161,7 +2161,9 @@ export const CertificateAuthorities = { directoryUrl: `The directory URL for the ACME Certificate Authority.`, accountEmail: `The email address for the ACME Certificate Authority.`, provider: `The DNS provider for the ACME Certificate Authority.`, - hostedZoneId: `The hosted zone ID for the ACME Certificate Authority.` + hostedZoneId: `The hosted zone ID for the ACME Certificate Authority.`, + eabKid: `The External Account Binding (EAB) Key ID for the ACME Certificate Authority. Required if the ACME provider uses EAB.`, + eabHmacKey: `The External Account Binding (EAB) HMAC key for the ACME Certificate Authority. Required if the ACME provider uses EAB.` }, INTERNAL: { type: "The type of CA to create.", diff --git a/backend/src/lib/config/env.ts b/backend/src/lib/config/env.ts index 586a69655..922fdbcdf 100644 --- a/backend/src/lib/config/env.ts +++ b/backend/src/lib/config/env.ts @@ -37,6 +37,8 @@ const envSchema = z .default("false") .transform((el) => el === "true"), REDIS_URL: zpStr(z.string().optional()), + REDIS_USERNAME: zpStr(z.string().optional()), + REDIS_PASSWORD: zpStr(z.string().optional()), REDIS_SENTINEL_HOSTS: zpStr( z .string() @@ -49,6 +51,12 @@ const envSchema = z REDIS_SENTINEL_ENABLE_TLS: zodStrBool.optional().describe("Whether to use TLS/SSL for Redis Sentinel connection"), REDIS_SENTINEL_USERNAME: zpStr(z.string().optional().describe("Authentication username for Redis Sentinel")), REDIS_SENTINEL_PASSWORD: zpStr(z.string().optional().describe("Authentication password for Redis Sentinel")), + REDIS_CLUSTER_HOSTS: zpStr( + z + .string() + .optional() + .describe("Comma-separated list of Redis Cluster host:port pairs. Eg: 192.168.65.254:6379,192.168.65.254:6380") + ), HOST: zpStr(z.string().default("localhost")), DB_CONNECTION_URI: zpStr(z.string().describe("Postgres database connection string")).default( `postgresql://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}` @@ -218,6 +226,8 @@ const envSchema = z ), PARAMS_FOLDER_SECRET_DETECTION_ENTROPY: z.coerce.number().optional().default(3.7), + INFISICAL_PRIMARY_INSTANCE_URL: zpStr(z.string().optional()), + // HSM HSM_LIB_PATH: zpStr(z.string().optional()), HSM_PIN: zpStr(z.string().optional()), @@ -335,8 +345,8 @@ const envSchema = z "Either ENCRYPTION_KEY or ROOT_ENCRYPTION_KEY must be defined." ) .refine( - (data) => Boolean(data.REDIS_URL) || Boolean(data.REDIS_SENTINEL_HOSTS), - "Either REDIS_URL or REDIS_SENTINEL_HOSTS must be defined." + (data) => Boolean(data.REDIS_URL) || Boolean(data.REDIS_SENTINEL_HOSTS) || Boolean(data.REDIS_CLUSTER_HOSTS), + "Either REDIS_URL, REDIS_SENTINEL_HOSTS or REDIS_CLUSTER_HOSTS must be defined." ) .transform((data) => ({ ...data, @@ -346,7 +356,7 @@ const envSchema = z : undefined, isCloud: Boolean(data.LICENSE_SERVER_KEY), isSmtpConfigured: Boolean(data.SMTP_HOST), - isRedisConfigured: Boolean(data.REDIS_URL || data.REDIS_SENTINEL_HOSTS), + isRedisConfigured: Boolean(data.REDIS_URL || data.REDIS_SENTINEL_HOSTS || data.REDIS_CLUSTER_HOSTS), isDevelopmentMode: data.NODE_ENV === "development", isTestMode: data.NODE_ENV === "test", isRotationDevelopmentMode: @@ -361,6 +371,12 @@ const envSchema = z const [host, port] = el.trim().split(":"); return { host: host.trim(), port: Number(port.trim()) }; }), + REDIS_CLUSTER_HOSTS: data.REDIS_CLUSTER_HOSTS?.trim() + ?.split(",") + .map((el) => { + const [host, port] = el.trim().split(":"); + return { host: host.trim(), port: Number(port.trim()) }; + }), isSecretScanningConfigured: Boolean(data.SECRET_SCANNING_GIT_APP_ID) && Boolean(data.SECRET_SCANNING_PRIVATE_KEY) && diff --git a/backend/src/lib/config/redis.ts b/backend/src/lib/config/redis.ts index 987518dd5..620f0f936 100644 --- a/backend/src/lib/config/redis.ts +++ b/backend/src/lib/config/redis.ts @@ -2,6 +2,11 @@ import { Redis } from "ioredis"; export type TRedisConfigKeys = Partial<{ REDIS_URL: string; + REDIS_USERNAME: string; + REDIS_PASSWORD: string; + + REDIS_CLUSTER_HOSTS: { host: string; port: number }[]; + REDIS_SENTINEL_HOSTS: { host: string; port: number }[]; REDIS_SENTINEL_MASTER_NAME: string; REDIS_SENTINEL_ENABLE_TLS: boolean; @@ -12,6 +17,15 @@ export type TRedisConfigKeys = Partial<{ export const buildRedisFromConfig = (cfg: TRedisConfigKeys) => { if (cfg.REDIS_URL) return new Redis(cfg.REDIS_URL, { maxRetriesPerRequest: null }); + if (cfg.REDIS_CLUSTER_HOSTS) { + return new Redis.Cluster(cfg.REDIS_CLUSTER_HOSTS, { + redisOptions: { + username: cfg.REDIS_USERNAME, + password: cfg.REDIS_PASSWORD + } + }); + } + return new Redis({ // refine at tope will catch this case sentinels: cfg.REDIS_SENTINEL_HOSTS!, @@ -19,6 +33,8 @@ export const buildRedisFromConfig = (cfg: TRedisConfigKeys) => { maxRetriesPerRequest: null, sentinelUsername: cfg.REDIS_SENTINEL_USERNAME, sentinelPassword: cfg.REDIS_SENTINEL_PASSWORD, - enableTLSForSentinelMode: cfg.REDIS_SENTINEL_ENABLE_TLS + enableTLSForSentinelMode: cfg.REDIS_SENTINEL_ENABLE_TLS, + username: cfg.REDIS_USERNAME, + password: cfg.REDIS_PASSWORD }); }; diff --git a/backend/src/lib/crypto/cryptography/crypto.ts b/backend/src/lib/crypto/cryptography/crypto.ts index b8fc45645..05ea315cd 100644 --- a/backend/src/lib/crypto/cryptography/crypto.ts +++ b/backend/src/lib/crypto/cryptography/crypto.ts @@ -250,8 +250,11 @@ const cryptographyFactory = () => { }; }; - const encryptWithRootEncryptionKey = (data: string) => { - const appCfg = getConfig(); + const encryptWithRootEncryptionKey = ( + data: string, + appCfgOverride?: Pick + ) => { + const appCfg = appCfgOverride || getConfig(); const rootEncryptionKey = appCfg.ROOT_ENCRYPTION_KEY; const encryptionKey = appCfg.ENCRYPTION_KEY; diff --git a/backend/src/lib/retry/index.ts b/backend/src/lib/retry/index.ts new file mode 100644 index 000000000..de7115399 --- /dev/null +++ b/backend/src/lib/retry/index.ts @@ -0,0 +1,43 @@ +/* eslint-disable no-await-in-loop */ +interface GitHubApiError extends Error { + status?: number; + response?: { + status?: number; + headers?: { + "x-ratelimit-reset"?: string; + }; + }; +} + +const delay = (ms: number) => + new Promise((resolve) => { + setTimeout(() => resolve(), ms); + }); + +export const retryWithBackoff = async (fn: () => Promise, maxRetries = 3, baseDelay = 1000): Promise => { + let lastError: Error; + + for (let attempt = 0; attempt <= maxRetries; attempt += 1) { + try { + return await fn(); + } catch (error) { + lastError = error as Error; + const gitHubError = error as GitHubApiError; + const statusCode = gitHubError.status || gitHubError.response?.status; + if (statusCode === 403) { + const rateLimitReset = gitHubError.response?.headers?.["x-ratelimit-reset"]; + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10) * 1000; + const waitTime = Math.max(resetTime - Date.now(), baseDelay); + await delay(Math.min(waitTime, 60000)); + } else { + await delay(baseDelay * 2 ** attempt); + } + } else if (attempt < maxRetries) { + await delay(baseDelay * 2 ** attempt); + } + } + } + + throw lastError!; +}; diff --git a/backend/src/queue/queue-service.ts b/backend/src/queue/queue-service.ts index c0cb014eb..a26cc5398 100644 --- a/backend/src/queue/queue-service.ts +++ b/backend/src/queue/queue-service.ts @@ -422,6 +422,7 @@ export const queueServiceFactory = ( redisCfg: TRedisConfigKeys, { dbConnectionUrl, dbRootCert }: { dbConnectionUrl: string; dbRootCert?: string } ): TQueueServiceFactory => { + const isClusterMode = Boolean(redisCfg?.REDIS_CLUSTER_HOSTS); const connection = buildRedisFromConfig(redisCfg); const queueContainer = {} as Record< QueueName, @@ -464,6 +465,8 @@ export const queueServiceFactory = ( } queueContainer[name] = new Queue(name as string, { + // ref: docs.bullmq.io/bull/patterns/redis-cluster + prefix: isClusterMode ? `{${name}}` : undefined, ...queueSettings, ...(crypto.isFipsModeEnabled() ? { @@ -479,6 +482,7 @@ export const queueServiceFactory = ( const appCfg = getConfig(); if (appCfg.QUEUE_WORKERS_ENABLED && isQueueEnabled(name)) { workerContainer[name] = new Worker(name, jobFn, { + prefix: isClusterMode ? `{${name}}` : undefined, ...queueSettings, ...(crypto.isFipsModeEnabled() ? { diff --git a/backend/src/server/app.ts b/backend/src/server/app.ts index 321a3656e..8cf23f703 100644 --- a/backend/src/server/app.ts +++ b/backend/src/server/app.ts @@ -12,7 +12,7 @@ import type { FastifyRateLimitOptions } from "@fastify/rate-limit"; import ratelimiter from "@fastify/rate-limit"; import { fastifyRequestContext } from "@fastify/request-context"; import fastify from "fastify"; -import { Redis } from "ioredis"; +import { Cluster, Redis } from "ioredis"; import { Knex } from "knex"; import { HsmModule } from "@app/ee/services/hsm/hsm-types"; @@ -43,7 +43,7 @@ type TMain = { queue: TQueueServiceFactory; keyStore: TKeyStoreFactory; hsmModule: HsmModule; - redis: Redis; + redis: Redis | Cluster; envConfig: TEnvConfig; superAdminDAL: TSuperAdminDALFactory; }; @@ -76,6 +76,7 @@ export const main = async ({ server.setValidatorCompiler(validatorCompiler); server.setSerializerCompiler(serializerCompiler); + // @ts-expect-error akhilmhdh: even on setting it fastify as Redis | Cluster it's throwing error server.decorate("redis", redis); server.addContentTypeParser("application/scim+json", { parseAs: "string" }, (_, body, done) => { try { diff --git a/backend/src/server/plugins/auth/inject-identity.ts b/backend/src/server/plugins/auth/inject-identity.ts index 97c62b545..2f128dda1 100644 --- a/backend/src/server/plugins/auth/inject-identity.ts +++ b/backend/src/server/plugins/auth/inject-identity.ts @@ -107,110 +107,117 @@ export const extractAuth = async (req: FastifyRequest, jwtSecret: string) => { }; // ! Important: You can only 100% count on the `req.permission.orgId` field being present when the auth method is Identity Access Token (Machine Identity). -export const injectIdentity = fp(async (server: FastifyZodProvider) => { - server.decorateRequest("auth", null); - server.addHook("onRequest", async (req) => { - const appCfg = getConfig(); +export const injectIdentity = fp( + async (server: FastifyZodProvider, opt: { shouldForwardWritesToPrimaryInstance?: boolean }) => { + server.decorateRequest("auth", null); + server.decorateRequest("shouldForwardWritesToPrimaryInstance", Boolean(opt.shouldForwardWritesToPrimaryInstance)); + server.addHook("onRequest", async (req) => { + const appCfg = getConfig(); - if (req.url.includes(".well-known/est") || req.url.includes("/api/v3/auth/")) { - return; - } - - // Authentication is handled on a route-level here. - if (req.url.includes("/api/v1/workflow-integrations/microsoft-teams/message-endpoint")) { - return; - } - - const { authMode, token, actor } = await extractAuth(req, appCfg.AUTH_SECRET); - - if (!authMode) return; - - switch (authMode) { - case AuthMode.JWT: { - const { user, tokenVersionId, orgId } = await server.services.authToken.fnValidateJwtIdentity(token); - requestContext.set("orgId", orgId); - req.auth = { - authMode: AuthMode.JWT, - user, - userId: user.id, - tokenVersionId, - actor, - orgId: orgId as string, - authMethod: token.authMethod, - isMfaVerified: token.isMfaVerified, - token - }; - break; + if (opt.shouldForwardWritesToPrimaryInstance && req.method !== "GET") { + return; } - case AuthMode.IDENTITY_ACCESS_TOKEN: { - const identity = await server.services.identityAccessToken.fnValidateIdentityAccessToken(token, req.realIp); - const serverCfg = await getServerCfg(); - requestContext.set("orgId", identity.orgId); - req.auth = { - authMode: AuthMode.IDENTITY_ACCESS_TOKEN, - actor, - orgId: identity.orgId, - identityId: identity.identityId, - identityName: identity.name, - authMethod: null, - isInstanceAdmin: serverCfg?.adminIdentityIds?.includes(identity.identityId), - token - }; - if (token?.identityAuth?.oidc) { - requestContext.set("identityAuthInfo", { - identityId: identity.identityId, - oidc: token?.identityAuth?.oidc - }); + + if (req.url.includes(".well-known/est") || req.url.includes("/api/v3/auth/")) { + return; + } + + // Authentication is handled on a route-level here. + if (req.url.includes("/api/v1/workflow-integrations/microsoft-teams/message-endpoint")) { + return; + } + + const { authMode, token, actor } = await extractAuth(req, appCfg.AUTH_SECRET); + + if (!authMode) return; + + switch (authMode) { + case AuthMode.JWT: { + const { user, tokenVersionId, orgId } = await server.services.authToken.fnValidateJwtIdentity(token); + requestContext.set("orgId", orgId); + req.auth = { + authMode: AuthMode.JWT, + user, + userId: user.id, + tokenVersionId, + actor, + orgId: orgId as string, + authMethod: token.authMethod, + isMfaVerified: token.isMfaVerified, + token + }; + break; } - if (token?.identityAuth?.kubernetes) { - requestContext.set("identityAuthInfo", { + case AuthMode.IDENTITY_ACCESS_TOKEN: { + const identity = await server.services.identityAccessToken.fnValidateIdentityAccessToken(token, req.realIp); + const serverCfg = await getServerCfg(); + requestContext.set("orgId", identity.orgId); + req.auth = { + authMode: AuthMode.IDENTITY_ACCESS_TOKEN, + actor, + orgId: identity.orgId, identityId: identity.identityId, - kubernetes: token?.identityAuth?.kubernetes - }); + identityName: identity.name, + authMethod: null, + isInstanceAdmin: serverCfg?.adminIdentityIds?.includes(identity.identityId), + token + }; + if (token?.identityAuth?.oidc) { + requestContext.set("identityAuthInfo", { + identityId: identity.identityId, + oidc: token?.identityAuth?.oidc + }); + } + if (token?.identityAuth?.kubernetes) { + requestContext.set("identityAuthInfo", { + identityId: identity.identityId, + kubernetes: token?.identityAuth?.kubernetes + }); + } + if (token?.identityAuth?.aws) { + requestContext.set("identityAuthInfo", { + identityId: identity.identityId, + aws: token?.identityAuth?.aws + }); + } + break; } - if (token?.identityAuth?.aws) { - requestContext.set("identityAuthInfo", { - identityId: identity.identityId, - aws: token?.identityAuth?.aws - }); + case AuthMode.SERVICE_TOKEN: { + const serviceToken = await server.services.serviceToken.fnValidateServiceToken(token); + requestContext.set("orgId", serviceToken.orgId); + req.auth = { + orgId: serviceToken.orgId, + authMode: AuthMode.SERVICE_TOKEN as const, + serviceToken, + serviceTokenId: serviceToken.id, + actor, + authMethod: null, + token + }; + break; } - break; + case AuthMode.API_KEY: { + const user = await server.services.apiKey.fnValidateApiKey(token as string); + req.auth = { + authMode: AuthMode.API_KEY as const, + userId: user.id, + actor, + user, + orgId: "API_KEY", // We set the orgId to an arbitrary value, since we can't link an API key to a specific org. We have to deprecate API keys soon! + authMethod: null, + token: token as string + }; + break; + } + case AuthMode.SCIM_TOKEN: { + const { orgId, scimTokenId } = await server.services.scim.fnValidateScimToken(token); + requestContext.set("orgId", orgId); + req.auth = { authMode: AuthMode.SCIM_TOKEN, actor, scimTokenId, orgId, authMethod: null }; + break; + } + default: + throw new BadRequestError({ message: "Invalid token strategy provided" }); } - case AuthMode.SERVICE_TOKEN: { - const serviceToken = await server.services.serviceToken.fnValidateServiceToken(token); - requestContext.set("orgId", serviceToken.orgId); - req.auth = { - orgId: serviceToken.orgId, - authMode: AuthMode.SERVICE_TOKEN as const, - serviceToken, - serviceTokenId: serviceToken.id, - actor, - authMethod: null, - token - }; - break; - } - case AuthMode.API_KEY: { - const user = await server.services.apiKey.fnValidateApiKey(token as string); - req.auth = { - authMode: AuthMode.API_KEY as const, - userId: user.id, - actor, - user, - orgId: "API_KEY", // We set the orgId to an arbitrary value, since we can't link an API key to a specific org. We have to deprecate API keys soon! - authMethod: null, - token: token as string - }; - break; - } - case AuthMode.SCIM_TOKEN: { - const { orgId, scimTokenId } = await server.services.scim.fnValidateScimToken(token); - requestContext.set("orgId", orgId); - req.auth = { authMode: AuthMode.SCIM_TOKEN, actor, scimTokenId, orgId, authMethod: null }; - break; - } - default: - throw new BadRequestError({ message: "Invalid token strategy provided" }); - } - }); -}); + }); + } +); diff --git a/backend/src/server/plugins/auth/verify-auth.ts b/backend/src/server/plugins/auth/verify-auth.ts index 44ea069dc..c63199769 100644 --- a/backend/src/server/plugins/auth/verify-auth.ts +++ b/backend/src/server/plugins/auth/verify-auth.ts @@ -10,6 +10,10 @@ interface TAuthOptions { export const verifyAuth = (authStrategies: AuthMode[], options: TAuthOptions = { requireOrg: true }) => (req: T, _res: FastifyReply, done: HookHandlerDoneFunction) => { + if (req.shouldForwardWritesToPrimaryInstance && req.method !== "GET") { + return done(); + } + if (!Array.isArray(authStrategies)) throw new Error("Auth strategy must be array"); if (!req.auth) throw new UnauthorizedError({ message: "Token missing" }); diff --git a/backend/src/server/plugins/primary-forwarding-mode.ts b/backend/src/server/plugins/primary-forwarding-mode.ts new file mode 100644 index 000000000..611806a6b --- /dev/null +++ b/backend/src/server/plugins/primary-forwarding-mode.ts @@ -0,0 +1,14 @@ +import replyFrom from "@fastify/reply-from"; +import fp from "fastify-plugin"; + +export const forwardWritesToPrimary = fp(async (server, opt: { primaryUrl: string }) => { + await server.register(replyFrom, { + base: opt.primaryUrl + }); + + server.addHook("preValidation", async (request, reply) => { + if (request.url.startsWith("/api") && ["POST", "PUT", "DELETE", "PATCH"].includes(request.method)) { + return reply.from(request.url); + } + }); +}); diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 367f2f7c3..5abb33854 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -294,6 +294,8 @@ import { TSmtpService } from "@app/services/smtp/smtp-service"; import { invalidateCacheQueueFactory } from "@app/services/super-admin/invalidate-cache-queue"; import { TSuperAdminDALFactory } from "@app/services/super-admin/super-admin-dal"; import { getServerCfg, superAdminServiceFactory } from "@app/services/super-admin/super-admin-service"; +import { offlineUsageReportDALFactory } from "@app/services/offline-usage-report/offline-usage-report-dal"; +import { offlineUsageReportServiceFactory } from "@app/services/offline-usage-report/offline-usage-report-service"; import { telemetryDALFactory } from "@app/services/telemetry/telemetry-dal"; import { telemetryQueueServiceFactory } from "@app/services/telemetry/telemetry-queue"; import { telemetryServiceFactory } from "@app/services/telemetry/telemetry-service"; @@ -313,6 +315,7 @@ import { injectAssumePrivilege } from "../plugins/auth/inject-assume-privilege"; import { injectIdentity } from "../plugins/auth/inject-identity"; import { injectPermission } from "../plugins/auth/inject-permission"; import { injectRateLimits } from "../plugins/inject-rate-limits"; +import { forwardWritesToPrimary } from "../plugins/primary-forwarding-mode"; import { registerV1Routes } from "./v1"; import { initializeOauthConfigSync } from "./v1/sso-router"; import { registerV2Routes } from "./v2"; @@ -388,6 +391,7 @@ export const registerRoutes = async ( const reminderRecipientDAL = reminderRecipientDALFactory(db); const integrationDAL = integrationDALFactory(db); + const offlineUsageReportDAL = offlineUsageReportDALFactory(db); const integrationAuthDAL = integrationAuthDALFactory(db); const webhookDAL = webhookDALFactory(db); const serviceTokenDAL = serviceTokenDALFactory(db); @@ -559,12 +563,19 @@ export const registerRoutes = async ( permissionService }); + const auditLogStreamService = auditLogStreamServiceFactory({ + licenseService, + permissionService, + auditLogStreamDAL, + kmsService + }); + const auditLogQueue = await auditLogQueueServiceFactory({ auditLogDAL, queueService, projectDAL, licenseService, - auditLogStreamDAL + auditLogStreamService }); const notificationQueue = await notificationQueueServiceFactory({ @@ -575,11 +586,6 @@ export const registerRoutes = async ( const notificationService = notificationServiceFactory({ notificationQueue, userNotificationDAL }); const auditLogService = auditLogServiceFactory({ auditLogDAL, permissionService, auditLogQueue }); - const auditLogStreamService = auditLogStreamServiceFactory({ - licenseService, - permissionService, - auditLogStreamDAL - }); const secretApprovalPolicyService = secretApprovalPolicyServiceFactory({ projectEnvDAL, secretApprovalPolicyApproverDAL: sapApproverDAL, @@ -691,7 +697,8 @@ export const registerRoutes = async ( kmsService, permissionService, groupDAL, - userGroupMembershipDAL + userGroupMembershipDAL, + orgMembershipDAL }); const ldapService = ldapConfigServiceFactory({ @@ -852,7 +859,14 @@ export const registerRoutes = async ( licenseService, kmsService, microsoftTeamsService, - invalidateCacheQueue + invalidateCacheQueue, + smtpService, + tokenService + }); + + const offlineUsageReportService = offlineUsageReportServiceFactory({ + offlineUsageReportDAL, + licenseService }); const orgAdminService = orgAdminServiceFactory({ @@ -1759,7 +1773,8 @@ export const registerRoutes = async ( const migrationService = externalMigrationServiceFactory({ externalMigrationQueue, userDAL, - permissionService + permissionService, + gatewayService }); const externalGroupOrgRoleMappingService = externalGroupOrgRoleMappingServiceFactory({ @@ -2014,6 +2029,7 @@ export const registerRoutes = async ( apiKey: apiKeyService, authToken: tokenService, superAdmin: superAdminService, + offlineUsageReport: offlineUsageReportService, project: projectService, projectMembership: projectMembershipService, projectKey: projectKeyService, @@ -2147,8 +2163,14 @@ export const registerRoutes = async ( user: userDAL, kmipClient: kmipClientDAL }); + const shouldForwardWritesToPrimaryInstance = Boolean(envConfig.INFISICAL_PRIMARY_INSTANCE_URL); + if (shouldForwardWritesToPrimaryInstance) { + logger.info(`Infisical primary instance is configured: ${envConfig.INFISICAL_PRIMARY_INSTANCE_URL}`); - await server.register(injectIdentity, { userDAL, serviceTokenDAL }); + await server.register(forwardWritesToPrimary, { primaryUrl: envConfig.INFISICAL_PRIMARY_INSTANCE_URL as string }); + } + + await server.register(injectIdentity, { shouldForwardWritesToPrimaryInstance }); await server.register(injectAssumePrivilege); await server.register(injectPermission); await server.register(injectRateLimits); diff --git a/backend/src/server/routes/sanitizedSchemas.ts b/backend/src/server/routes/sanitizedSchemas.ts index 8af4baa8b..344224008 100644 --- a/backend/src/server/routes/sanitizedSchemas.ts +++ b/backend/src/server/routes/sanitizedSchemas.ts @@ -246,13 +246,6 @@ export const SanitizedDynamicSecretSchema = DynamicSecretsSchema.omit({ metadata: ResourceMetadataSchema.optional() }); -export const SanitizedAuditLogStreamSchema = z.object({ - id: z.string(), - url: z.string(), - createdAt: z.date(), - updatedAt: z.date() -}); - export const SanitizedProjectSchema = ProjectsSchema.pick({ id: true, name: true, diff --git a/backend/src/server/routes/v1/admin-router.ts b/backend/src/server/routes/v1/admin-router.ts index ea3726c22..7f5a2f374 100644 --- a/backend/src/server/routes/v1/admin-router.ts +++ b/backend/src/server/routes/v1/admin-router.ts @@ -13,6 +13,7 @@ import { crypto } from "@app/lib/crypto/cryptography"; import { BadRequestError } from "@app/lib/errors"; import { invalidateCacheLimit, readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { addAuthOriginDomainCookie } from "@app/server/lib/cookie"; +import { GenericResourceNameSchema } from "@app/server/lib/schemas"; import { getTelemetryDistinctId } from "@app/server/lib/telemetry"; import { verifySuperAdmin } from "@app/server/plugins/auth/superAdmin"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; @@ -53,7 +54,8 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { defaultAuthOrgAuthMethod: z.string().nullish(), isSecretScanningDisabled: z.boolean(), kubernetesAutoFetchServiceAccountToken: z.boolean(), - paramsFolderSecretDetectionEnabled: z.boolean() + paramsFolderSecretDetectionEnabled: z.boolean(), + isOfflineUsageReportsEnabled: z.boolean() }) }) } @@ -69,7 +71,8 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { isMigrationModeOn: serverEnvs.MAINTENANCE_MODE, isSecretScanningDisabled: serverEnvs.DISABLE_SECRET_SCANNING, kubernetesAutoFetchServiceAccountToken: serverEnvs.KUBERNETES_AUTO_FETCH_SERVICE_ACCOUNT_TOKEN, - paramsFolderSecretDetectionEnabled: serverEnvs.PARAMS_FOLDER_SECRET_DETECTION_ENABLED + paramsFolderSecretDetectionEnabled: serverEnvs.PARAMS_FOLDER_SECRET_DETECTION_ENABLED, + isOfflineUsageReportsEnabled: !!serverEnvs.LICENSE_KEY_OFFLINE } }; } @@ -215,7 +218,8 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { }), membershipId: z.string(), role: z.string(), - roleId: z.string().nullish() + roleId: z.string().nullish(), + status: z.string().nullish() }) .array(), projects: z @@ -838,4 +842,121 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { }; } }); + + server.route({ + method: "POST", + url: "/organization-management/organizations", + config: { + rateLimit: writeLimit + }, + schema: { + body: z.object({ + name: GenericResourceNameSchema, + inviteAdminEmails: z.string().email().array().min(1) + }), + response: { + 200: z.object({ + organization: OrganizationsSchema + }) + } + }, + onRequest: (req, res, done) => { + verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN])(req, res, () => { + verifySuperAdmin(req, res, done); + }); + }, + handler: async (req) => { + const organization = await server.services.superAdmin.createOrganization(req.body, req.permission); + return { organization }; + } + }); + + server.route({ + method: "POST", + url: "/organization-management/organizations/:organizationId/memberships/:membershipId/resend-invite", + config: { + rateLimit: writeLimit + }, + schema: { + params: z.object({ + organizationId: z.string(), + membershipId: z.string() + }), + response: { + 200: z.object({ + organizationMembership: OrgMembershipsSchema + }) + } + }, + onRequest: (req, res, done) => { + verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN])(req, res, () => { + verifySuperAdmin(req, res, done); + }); + }, + handler: async (req) => { + const organizationMembership = await server.services.superAdmin.resendOrgInvite(req.params, req.permission); + return { organizationMembership }; + } + }); + + server.route({ + method: "POST", + url: "/organization-management/organizations/:organizationId/access", + config: { + rateLimit: writeLimit + }, + schema: { + params: z.object({ + organizationId: z.string() + }), + response: { + 200: z.object({ + organizationMembership: OrgMembershipsSchema + }) + } + }, + onRequest: (req, res, done) => { + verifyAuth([AuthMode.JWT])(req, res, () => { + verifySuperAdmin(req, res, done); + }); + }, + handler: async (req) => { + const organizationMembership = await server.services.superAdmin.joinOrganization( + req.params.organizationId, + req.permission + ); + return { organizationMembership }; + } + }); + + server.route({ + method: "POST", + url: "/usage-report/generate", + config: { + rateLimit: writeLimit + }, + schema: { + response: { + 200: z.object({ + csvContent: z.string(), + signature: z.string(), + filename: z.string() + }) + } + }, + onRequest: (req, res, done) => { + verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN])(req, res, () => { + verifySuperAdmin(req, res, done); + }); + }, + handler: async () => { + const result = await server.services.offlineUsageReport.generateUsageReportCSV(); + + return { + csvContent: result.csvContent, + signature: result.signature, + filename: result.filename + }; + } + }); }; diff --git a/backend/src/server/routes/v1/dashboard-router.ts b/backend/src/server/routes/v1/dashboard-router.ts index 48d536c14..a54bd5ccf 100644 --- a/backend/src/server/routes/v1/dashboard-router.ts +++ b/backend/src/server/routes/v1/dashboard-router.ts @@ -703,6 +703,9 @@ export const registerDashboardRouter = async (server: FastifyZodProvider) => { // prevent older projects from accessing endpoint if (!shouldUseSecretV2Bridge) throw new BadRequestError({ message: "Project version not supported" }); + // verify folder exists and user has project permission + await server.services.folder.getFolderByPath({ projectId, environment, secretPath }, req.permission); + const tags = req.query.tags?.split(",") ?? []; let remainingLimit = limit; diff --git a/backend/src/server/routes/v3/external-migration-router.ts b/backend/src/server/routes/v3/external-migration-router.ts index 4325692da..a3b744485 100644 --- a/backend/src/server/routes/v3/external-migration-router.ts +++ b/backend/src/server/routes/v3/external-migration-router.ts @@ -2,10 +2,13 @@ import fastifyMultipart from "@fastify/multipart"; import { z } from "zod"; import { BadRequestError } from "@app/lib/errors"; -import { writeLimit } from "@app/server/config/rateLimiter"; +import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; -import { VaultMappingType } from "@app/services/external-migration/external-migration-types"; +import { + ExternalMigrationProviders, + VaultMappingType +} from "@app/services/external-migration/external-migration-types"; const MB25_IN_BYTES = 26214400; @@ -66,7 +69,8 @@ export const registerExternalMigrationRouter = async (server: FastifyZodProvider vaultAccessToken: z.string(), vaultNamespace: z.string().trim().optional(), vaultUrl: z.string(), - mappingType: z.nativeEnum(VaultMappingType) + mappingType: z.nativeEnum(VaultMappingType), + gatewayId: z.string().optional() }) }, onRequest: verifyAuth([AuthMode.JWT]), @@ -80,4 +84,33 @@ export const registerExternalMigrationRouter = async (server: FastifyZodProvider }); } }); + + server.route({ + method: "GET", + url: "/custom-migration-enabled/:provider", + config: { + rateLimit: readLimit + }, + schema: { + params: z.object({ + provider: z.nativeEnum(ExternalMigrationProviders) + }), + response: { + 200: z.object({ + enabled: z.boolean() + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT]), + handler: async (req) => { + const enabled = await server.services.migration.hasCustomVaultMigration({ + actorId: req.permission.id, + actor: req.permission.type, + actorOrgId: req.permission.orgId, + actorAuthMethod: req.permission.authMethod, + provider: req.params.provider + }); + return { enabled }; + } + }); }; diff --git a/backend/src/server/routes/v3/secret-router.ts b/backend/src/server/routes/v3/secret-router.ts index 55fc094b7..ce0d4f188 100644 --- a/backend/src/server/routes/v3/secret-router.ts +++ b/backend/src/server/routes/v3/secret-router.ts @@ -419,6 +419,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { 200: z.object({ secret: secretRawSchema.extend({ secretValueHidden: z.boolean(), + secretPath: z.string(), tags: SanitizedTagSchema.array().optional(), secretMetadata: ResourceMetadataSchema.optional() }) diff --git a/backend/src/services/app-connection/app-connection-service.ts b/backend/src/services/app-connection/app-connection-service.ts index 691f6c4c9..869364853 100644 --- a/backend/src/services/app-connection/app-connection-service.ts +++ b/backend/src/services/app-connection/app-connection-service.ts @@ -600,7 +600,7 @@ export const appConnectionServiceFactory = ({ azureClientSecrets: azureClientSecretsConnectionService(connectAppConnectionById, appConnectionDAL, kmsService), azureDevOps: azureDevOpsConnectionService(connectAppConnectionById, appConnectionDAL, kmsService), auth0: auth0ConnectionService(connectAppConnectionById, appConnectionDAL, kmsService), - hcvault: hcVaultConnectionService(connectAppConnectionById), + hcvault: hcVaultConnectionService(connectAppConnectionById, gatewayService), windmill: windmillConnectionService(connectAppConnectionById), teamcity: teamcityConnectionService(connectAppConnectionById), oci: ociConnectionService(connectAppConnectionById, licenseService), diff --git a/backend/src/services/app-connection/auth0/auth0-connection-fns.ts b/backend/src/services/app-connection/auth0/auth0-connection-fns.ts index 5a9989b43..de4faf683 100644 --- a/backend/src/services/app-connection/auth0/auth0-connection-fns.ts +++ b/backend/src/services/app-connection/auth0/auth0-connection-fns.ts @@ -91,7 +91,7 @@ export const validateAuth0ConnectionCredentials = async ({ credentials }: TAuth0 }; } catch (e: unknown) { throw new BadRequestError({ - message: (e as Error).message ?? `Unable to validate connection: verify credentials` + message: (e as Error).message ?? "Unable to validate connection: verify credentials" }); } }; diff --git a/backend/src/services/app-connection/azure-app-configuration/azure-app-configuration-connection-fns.ts b/backend/src/services/app-connection/azure-app-configuration/azure-app-configuration-connection-fns.ts index 80e65a821..d173a47b5 100644 --- a/backend/src/services/app-connection/azure-app-configuration/azure-app-configuration-connection-fns.ts +++ b/backend/src/services/app-connection/azure-app-configuration/azure-app-configuration-connection-fns.ts @@ -70,7 +70,7 @@ export const validateAzureAppConfigurationConnectionCredentials = async ( tokenError = e; } else { throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } } diff --git a/backend/src/services/app-connection/azure-client-secrets/azure-client-secrets-connection-fns.ts b/backend/src/services/app-connection/azure-client-secrets/azure-client-secrets-connection-fns.ts index 41dbb4392..2614cfd12 100644 --- a/backend/src/services/app-connection/azure-client-secrets/azure-client-secrets-connection-fns.ts +++ b/backend/src/services/app-connection/azure-client-secrets/azure-client-secrets-connection-fns.ts @@ -186,7 +186,7 @@ export const validateAzureClientSecretsConnectionCredentials = async (config: TA tokenError = e; } else { throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } } diff --git a/backend/src/services/app-connection/azure-devops/azure-devops-fns.ts b/backend/src/services/app-connection/azure-devops/azure-devops-fns.ts index 39a330360..a3a9f10bd 100644 --- a/backend/src/services/app-connection/azure-devops/azure-devops-fns.ts +++ b/backend/src/services/app-connection/azure-devops/azure-devops-fns.ts @@ -204,7 +204,7 @@ export const validateAzureDevOpsConnectionCredentials = async (config: TAzureDev tokenError = e; } else { throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } } diff --git a/backend/src/services/app-connection/azure-key-vault/azure-key-vault-connection-fns.ts b/backend/src/services/app-connection/azure-key-vault/azure-key-vault-connection-fns.ts index 1f88488c0..d6a260050 100644 --- a/backend/src/services/app-connection/azure-key-vault/azure-key-vault-connection-fns.ts +++ b/backend/src/services/app-connection/azure-key-vault/azure-key-vault-connection-fns.ts @@ -186,7 +186,7 @@ export const validateAzureKeyVaultConnectionCredentials = async (config: TAzureK tokenError = e; } else { throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } } diff --git a/backend/src/services/app-connection/camunda/camunda-connection-fns.ts b/backend/src/services/app-connection/camunda/camunda-connection-fns.ts index 90d9744b8..91a033c0e 100644 --- a/backend/src/services/app-connection/camunda/camunda-connection-fns.ts +++ b/backend/src/services/app-connection/camunda/camunda-connection-fns.ts @@ -82,7 +82,7 @@ export const validateCamundaConnectionCredentials = async (appConnection: TCamun }; } catch (e: unknown) { throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } }; diff --git a/backend/src/services/app-connection/databricks/databricks-connection-fns.ts b/backend/src/services/app-connection/databricks/databricks-connection-fns.ts index a35cc4aec..8912ad936 100644 --- a/backend/src/services/app-connection/databricks/databricks-connection-fns.ts +++ b/backend/src/services/app-connection/databricks/databricks-connection-fns.ts @@ -89,7 +89,7 @@ export const validateDatabricksConnectionCredentials = async (appConnection: TDa }; } catch (e: unknown) { throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } }; diff --git a/backend/src/services/app-connection/github-radar/github-radar-connection-fns.ts b/backend/src/services/app-connection/github-radar/github-radar-connection-fns.ts index fba852a0a..7349f89a6 100644 --- a/backend/src/services/app-connection/github-radar/github-radar-connection-fns.ts +++ b/backend/src/services/app-connection/github-radar/github-radar-connection-fns.ts @@ -114,7 +114,7 @@ export const validateGitHubRadarConnectionCredentials = async (config: TGitHubRa } throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } diff --git a/backend/src/services/app-connection/github/github-connection-fns.ts b/backend/src/services/app-connection/github/github-connection-fns.ts index 164aa31d9..05e6fdda3 100644 --- a/backend/src/services/app-connection/github/github-connection-fns.ts +++ b/backend/src/services/app-connection/github/github-connection-fns.ts @@ -447,7 +447,7 @@ export const validateGitHubConnectionCredentials = async ( } throw new BadRequestError({ - message: `Unable to validate connection: verify credentials` + message: "Unable to validate connection: verify credentials" }); } diff --git a/backend/src/services/app-connection/hc-vault/hc-vault-connection-fns.ts b/backend/src/services/app-connection/hc-vault/hc-vault-connection-fns.ts index 48695a2a5..46a59bcec 100644 --- a/backend/src/services/app-connection/hc-vault/hc-vault-connection-fns.ts +++ b/backend/src/services/app-connection/hc-vault/hc-vault-connection-fns.ts @@ -1,18 +1,18 @@ -import { AxiosError } from "axios"; +import { AxiosError, AxiosRequestConfig, AxiosResponse } from "axios"; +import https from "https"; +import { verifyHostInputValidity } from "@app/ee/services/dynamic-secret/dynamic-secret-fns"; +import { TGatewayServiceFactory } from "@app/ee/services/gateway/gateway-service"; import { request } from "@app/lib/config/request"; import { BadRequestError } from "@app/lib/errors"; import { removeTrailingSlash } from "@app/lib/fn"; +import { GatewayProxyProtocol, withGatewayProxy } from "@app/lib/gateway"; +import { logger } from "@app/lib/logger"; import { blockLocalAndPrivateIpAddresses } from "@app/lib/validator"; import { AppConnection } from "@app/services/app-connection/app-connection-enums"; import { HCVaultConnectionMethod } from "./hc-vault-connection-enums"; -import { - THCVaultConnection, - THCVaultConnectionConfig, - THCVaultMountResponse, - TValidateHCVaultConnectionCredentials -} from "./hc-vault-connection-types"; +import { THCVaultConnection, THCVaultConnectionConfig, THCVaultMountResponse } from "./hc-vault-connection-types"; export const getHCVaultInstanceUrl = async (config: THCVaultConnectionConfig) => { const instanceUrl = removeTrailingSlash(config.credentials.instanceUrl); @@ -37,7 +37,78 @@ type TokenRespData = { }; }; -export const getHCVaultAccessToken = async (connection: TValidateHCVaultConnectionCredentials) => { +export const requestWithHCVaultGateway = async ( + appConnection: { gatewayId?: string | null }, + gatewayService: Pick, + requestConfig: AxiosRequestConfig +): Promise> => { + const { gatewayId } = appConnection; + + // If gateway isn't set up, don't proxy request + if (!gatewayId) { + return request.request(requestConfig); + } + + const url = new URL(requestConfig.url as string); + + await blockLocalAndPrivateIpAddresses(url.toString()); + + const [targetHost] = await verifyHostInputValidity(url.hostname, true); + const relayDetails = await gatewayService.fnGetGatewayClientTlsByGatewayId(gatewayId); + const [relayHost, relayPort] = relayDetails.relayAddress.split(":"); + + return withGatewayProxy( + async (proxyPort) => { + const httpsAgent = new https.Agent({ + servername: targetHost + }); + + url.protocol = "https:"; + url.host = `localhost:${proxyPort}`; + + const finalRequestConfig: AxiosRequestConfig = { + ...requestConfig, + url: url.toString(), + httpsAgent, + headers: { + ...requestConfig.headers, + Host: targetHost + } + }; + + try { + return await request.request(finalRequestConfig); + } catch (error) { + if (error instanceof AxiosError) { + logger.error( + { message: error.message, data: (error.response as undefined | { data: unknown })?.data }, + "Error during HashiCorp Vault gateway request:" + ); + } + throw error; + } + }, + { + protocol: GatewayProxyProtocol.Tcp, + targetHost, + targetPort: url.port ? Number(url.port) : 8200, // 8200 is the default port for Vault self-hosted/dedicated + relayHost, + relayPort: Number(relayPort), + identityId: relayDetails.identityId, + orgId: relayDetails.orgId, + tlsOptions: { + ca: relayDetails.certChain, + cert: relayDetails.certificate, + key: relayDetails.privateKey.toString() + } + } + ); +}; + +export const getHCVaultAccessToken = async ( + connection: THCVaultConnection, + gatewayService: Pick +) => { // Return access token directly if not using AppRole method if (connection.method !== HCVaultConnectionMethod.AppRole) { return connection.credentials.accessToken; @@ -46,16 +117,16 @@ export const getHCVaultAccessToken = async (connection: TValidateHCVaultConnecti // Generate temporary token for AppRole method try { const { instanceUrl, roleId, secretId } = connection.credentials; - const tokenResp = await request.post( - `${removeTrailingSlash(instanceUrl)}/v1/auth/approle/login`, - { role_id: roleId, secret_id: secretId }, - { - headers: { - "Content-Type": "application/json", - ...(connection.credentials.namespace ? { "X-Vault-Namespace": connection.credentials.namespace } : {}) - } - } - ); + + const tokenResp = await requestWithHCVaultGateway(connection, gatewayService, { + url: `${removeTrailingSlash(instanceUrl)}/v1/auth/approle/login`, + method: "POST", + headers: { + "Content-Type": "application/json", + ...(connection.credentials.namespace ? { "X-Vault-Namespace": connection.credentials.namespace } : {}) + }, + data: { role_id: roleId, secret_id: secretId } + }); if (tokenResp.status !== 200) { throw new BadRequestError({ @@ -71,38 +142,55 @@ export const getHCVaultAccessToken = async (connection: TValidateHCVaultConnecti } }; -export const validateHCVaultConnectionCredentials = async (config: THCVaultConnectionConfig) => { - const instanceUrl = await getHCVaultInstanceUrl(config); +export const validateHCVaultConnectionCredentials = async ( + connection: THCVaultConnection, + gatewayService: Pick +) => { + const instanceUrl = await getHCVaultInstanceUrl(connection); try { - const accessToken = await getHCVaultAccessToken(config); + const accessToken = await getHCVaultAccessToken(connection, gatewayService); // Verify token - await request.get(`${instanceUrl}/v1/auth/token/lookup-self`, { + await requestWithHCVaultGateway(connection, gatewayService, { + url: `${instanceUrl}/v1/auth/token/lookup-self`, + method: "GET", headers: { "X-Vault-Token": accessToken } }); - return config.credentials; + return connection.credentials; } catch (error: unknown) { + logger.error(error, "Unable to verify HC Vault connection"); + if (error instanceof AxiosError) { throw new BadRequestError({ message: `Failed to validate credentials: ${error.message || "Unknown error"}` }); } + + if (error instanceof BadRequestError) { + throw error; + } + throw new BadRequestError({ message: "Unable to validate connection: verify credentials" }); } }; -export const listHCVaultMounts = async (appConnection: THCVaultConnection) => { - const instanceUrl = await getHCVaultInstanceUrl(appConnection); - const accessToken = await getHCVaultAccessToken(appConnection); +export const listHCVaultMounts = async ( + connection: THCVaultConnection, + gatewayService: Pick +) => { + const instanceUrl = await getHCVaultInstanceUrl(connection); + const accessToken = await getHCVaultAccessToken(connection, gatewayService); - const { data } = await request.get(`${instanceUrl}/v1/sys/mounts`, { + const { data } = await requestWithHCVaultGateway(connection, gatewayService, { + url: `${instanceUrl}/v1/sys/mounts`, + method: "GET", headers: { "X-Vault-Token": accessToken, - ...(appConnection.credentials.namespace ? { "X-Vault-Namespace": appConnection.credentials.namespace } : {}) + ...(connection.credentials.namespace ? { "X-Vault-Namespace": connection.credentials.namespace } : {}) } }); diff --git a/backend/src/services/app-connection/hc-vault/hc-vault-connection-schemas.ts b/backend/src/services/app-connection/hc-vault/hc-vault-connection-schemas.ts index a6db4d0eb..57e8fbeaf 100644 --- a/backend/src/services/app-connection/hc-vault/hc-vault-connection-schemas.ts +++ b/backend/src/services/app-connection/hc-vault/hc-vault-connection-schemas.ts @@ -55,11 +55,18 @@ export const HCVaultConnectionSchema = z.intersection( export const SanitizedHCVaultConnectionSchema = z.discriminatedUnion("method", [ BaseHCVaultConnectionSchema.extend({ method: z.literal(HCVaultConnectionMethod.AccessToken), - credentials: HCVaultConnectionAccessTokenCredentialsSchema.pick({}) + credentials: HCVaultConnectionAccessTokenCredentialsSchema.pick({ + namespace: true, + instanceUrl: true + }) }), BaseHCVaultConnectionSchema.extend({ method: z.literal(HCVaultConnectionMethod.AppRole), - credentials: HCVaultConnectionAppRoleCredentialsSchema.pick({}) + credentials: HCVaultConnectionAppRoleCredentialsSchema.pick({ + namespace: true, + instanceUrl: true, + roleId: true + }) }) ]); @@ -81,7 +88,7 @@ export const ValidateHCVaultConnectionCredentialsSchema = z.discriminatedUnion(" ]); export const CreateHCVaultConnectionSchema = ValidateHCVaultConnectionCredentialsSchema.and( - GenericCreateAppConnectionFieldsSchema(AppConnection.HCVault) + GenericCreateAppConnectionFieldsSchema(AppConnection.HCVault, { supportsGateways: true }) ); export const UpdateHCVaultConnectionSchema = z @@ -91,7 +98,7 @@ export const UpdateHCVaultConnectionSchema = z .optional() .describe(AppConnections.UPDATE(AppConnection.HCVault).credentials) }) - .and(GenericUpdateAppConnectionFieldsSchema(AppConnection.HCVault)); + .and(GenericUpdateAppConnectionFieldsSchema(AppConnection.HCVault, { supportsGateways: true })); export const HCVaultConnectionListItemSchema = z.object({ name: z.literal("HCVault"), diff --git a/backend/src/services/app-connection/hc-vault/hc-vault-connection-service.ts b/backend/src/services/app-connection/hc-vault/hc-vault-connection-service.ts index b5cee6fdd..589c7c1bd 100644 --- a/backend/src/services/app-connection/hc-vault/hc-vault-connection-service.ts +++ b/backend/src/services/app-connection/hc-vault/hc-vault-connection-service.ts @@ -1,3 +1,4 @@ +import { TGatewayServiceFactory } from "@app/ee/services/gateway/gateway-service"; import { logger } from "@app/lib/logger"; import { OrgServiceActor } from "@app/lib/types"; @@ -11,12 +12,15 @@ type TGetAppConnectionFunc = ( actor: OrgServiceActor ) => Promise; -export const hcVaultConnectionService = (getAppConnection: TGetAppConnectionFunc) => { +export const hcVaultConnectionService = ( + getAppConnection: TGetAppConnectionFunc, + gatewayService: Pick +) => { const listMounts = async (connectionId: string, actor: OrgServiceActor) => { const appConnection = await getAppConnection(AppConnection.HCVault, connectionId, actor); try { - const mounts = await listHCVaultMounts(appConnection); + const mounts = await listHCVaultMounts(appConnection, gatewayService); return mounts; } catch (error) { logger.error(error, "Failed to establish connection with Hashicorp Vault"); diff --git a/backend/src/services/app-connection/shared/sql/sql-connection-fns.ts b/backend/src/services/app-connection/shared/sql/sql-connection-fns.ts index b9425d7be..02bd0c77f 100644 --- a/backend/src/services/app-connection/shared/sql/sql-connection-fns.ts +++ b/backend/src/services/app-connection/shared/sql/sql-connection-fns.ts @@ -56,7 +56,7 @@ const getConnectionConfig = ({ ? { rejectUnauthorized: sslRejectUnauthorized, ca: sslCertificate, - servername: host + serverName: host } : false }; @@ -90,7 +90,7 @@ export const getSqlConnectionClient = async (appConnection: Pick( }, { protocol: GatewayProxyProtocol.Tcp, - targetHost, + targetHost: app === AppConnection.Postgres ? targetHost : credentials.host, targetPort: credentials.port, relayHost, relayPort: Number(relayPort), diff --git a/backend/src/services/auth/auth-login-service.ts b/backend/src/services/auth/auth-login-service.ts index e3afb754a..ede9e29e3 100644 --- a/backend/src/services/auth/auth-login-service.ts +++ b/backend/src/services/auth/auth-login-service.ts @@ -453,19 +453,24 @@ export const authLoginServiceFactory = ({ const selectedOrg = await orgDAL.findById(organizationId); - // Check if authEnforced is true, if that's the case, throw an error - if (selectedOrg.authEnforced) { - throw new BadRequestError({ - message: "Authentication is required by your organization before you can log in." - }); - } - if (!selectedOrgMembership) { throw new ForbiddenRequestError({ message: `User does not have access to the organization named ${selectedOrg?.name}` }); } + // Check if authEnforced is true and the current auth method is not an enforced method + if ( + selectedOrg.authEnforced && + !isAuthMethodSaml(decodedToken.authMethod) && + decodedToken.authMethod !== AuthMethod.OIDC && + !(selectedOrg.bypassOrgAuthEnabled && selectedOrgMembership.userRole === OrgMembershipRole.Admin) + ) { + throw new BadRequestError({ + message: "Login with the auth method required by your organization." + }); + } + if (selectedOrg.googleSsoAuthEnforced && decodedToken.authMethod !== AuthMethod.GOOGLE) { const canBypass = selectedOrg.bypassOrgAuthEnabled && selectedOrgMembership.userRole === OrgMembershipRole.Admin; diff --git a/backend/src/services/certificate-authority/acme/acme-certificate-authority-fns.ts b/backend/src/services/certificate-authority/acme/acme-certificate-authority-fns.ts index 86beadffe..830378ca8 100644 --- a/backend/src/services/certificate-authority/acme/acme-certificate-authority-fns.ts +++ b/backend/src/services/certificate-authority/acme/acme-certificate-authority-fns.ts @@ -64,6 +64,8 @@ type DBConfigurationColumn = { directoryUrl: string; accountEmail: string; hostedZoneId: string; + eabKid?: string; + eabHmacKey?: string; }; export const castDbEntryToAcmeCertificateAuthority = ( @@ -89,7 +91,9 @@ export const castDbEntryToAcmeCertificateAuthority = ( hostedZoneId: dbConfigurationCol.hostedZoneId }, directoryUrl: dbConfigurationCol.directoryUrl, - accountEmail: dbConfigurationCol.accountEmail + accountEmail: dbConfigurationCol.accountEmail, + eabKid: dbConfigurationCol.eabKid, + eabHmacKey: dbConfigurationCol.eabHmacKey }, status: ca.status as CaStatus }; @@ -128,7 +132,7 @@ export const AcmeCertificateAuthorityFns = ({ }); } - const { dnsAppConnectionId, directoryUrl, accountEmail, dnsProviderConfig } = configuration; + const { dnsAppConnectionId, directoryUrl, accountEmail, dnsProviderConfig, eabKid, eabHmacKey } = configuration; const appConnection = await appConnectionDAL.findById(dnsAppConnectionId); if (!appConnection) { @@ -171,7 +175,9 @@ export const AcmeCertificateAuthorityFns = ({ directoryUrl, accountEmail, dnsProvider: dnsProviderConfig.provider, - hostedZoneId: dnsProviderConfig.hostedZoneId + hostedZoneId: dnsProviderConfig.hostedZoneId, + eabKid, + eabHmacKey } }, tx @@ -214,7 +220,7 @@ export const AcmeCertificateAuthorityFns = ({ }) => { const updatedCa = await certificateAuthorityDAL.transaction(async (tx) => { if (configuration) { - const { dnsAppConnectionId, directoryUrl, accountEmail, dnsProviderConfig } = configuration; + const { dnsAppConnectionId, directoryUrl, accountEmail, dnsProviderConfig, eabKid, eabHmacKey } = configuration; const appConnection = await appConnectionDAL.findById(dnsAppConnectionId); if (!appConnection) { @@ -254,7 +260,9 @@ export const AcmeCertificateAuthorityFns = ({ directoryUrl, accountEmail, dnsProvider: dnsProviderConfig.provider, - hostedZoneId: dnsProviderConfig.hostedZoneId + hostedZoneId: dnsProviderConfig.hostedZoneId, + eabKid, + eabHmacKey } }, tx @@ -354,10 +362,19 @@ export const AcmeCertificateAuthorityFns = ({ await blockLocalAndPrivateIpAddresses(acmeCa.configuration.directoryUrl); - const acmeClient = new acme.Client({ + const acmeClientOptions: acme.ClientOptions = { directoryUrl: acmeCa.configuration.directoryUrl, accountKey - }); + }; + + if (acmeCa.configuration.eabKid && acmeCa.configuration.eabHmacKey) { + acmeClientOptions.externalAccountBinding = { + kid: acmeCa.configuration.eabKid, + hmacKey: acmeCa.configuration.eabHmacKey + }; + } + + const acmeClient = new acme.Client(acmeClientOptions); const alg = keyAlgorithmToAlgCfg(CertKeyAlgorithm.RSA_2048); diff --git a/backend/src/services/certificate-authority/acme/acme-certificate-authority-schemas.ts b/backend/src/services/certificate-authority/acme/acme-certificate-authority-schemas.ts index 56b3118cf..70b0cb0e1 100644 --- a/backend/src/services/certificate-authority/acme/acme-certificate-authority-schemas.ts +++ b/backend/src/services/certificate-authority/acme/acme-certificate-authority-schemas.ts @@ -18,7 +18,9 @@ export const AcmeCertificateAuthorityConfigurationSchema = z.object({ hostedZoneId: z.string().trim().min(1).describe(CertificateAuthorities.CONFIGURATIONS.ACME.hostedZoneId) }), directoryUrl: z.string().url().trim().min(1).describe(CertificateAuthorities.CONFIGURATIONS.ACME.directoryUrl), - accountEmail: z.string().trim().min(1).describe(CertificateAuthorities.CONFIGURATIONS.ACME.accountEmail) + accountEmail: z.string().trim().min(1).describe(CertificateAuthorities.CONFIGURATIONS.ACME.accountEmail), + eabKid: z.string().trim().max(64).optional().describe(CertificateAuthorities.CONFIGURATIONS.ACME.eabKid), + eabHmacKey: z.string().trim().max(512).optional().describe(CertificateAuthorities.CONFIGURATIONS.ACME.eabHmacKey) }); export const AcmeCertificateAuthorityCredentialsSchema = z.object({ diff --git a/backend/src/services/certificate-authority/internal/internal-certificate-authority-service.ts b/backend/src/services/certificate-authority/internal/internal-certificate-authority-service.ts index 9fed186bc..ab89ea996 100644 --- a/backend/src/services/certificate-authority/internal/internal-certificate-authority-service.ts +++ b/backend/src/services/certificate-authority/internal/internal-certificate-authority-service.ts @@ -1190,7 +1190,9 @@ export const internalCertificateAuthorityServiceFactory = ({ }); } - collectionId = certificateTemplate.pkiCollectionId as string; + if (!collectionId) { + collectionId = certificateTemplate.pkiCollectionId as string; + } ca = await certificateAuthorityDAL.findByIdWithAssociatedCa(certificateTemplate.caId); } diff --git a/backend/src/services/external-migration/external-migration-fns/vault.ts b/backend/src/services/external-migration/external-migration-fns/vault.ts index 1ebd56a80..ca6d2b0b0 100644 --- a/backend/src/services/external-migration/external-migration-fns/vault.ts +++ b/backend/src/services/external-migration/external-migration-fns/vault.ts @@ -1,12 +1,21 @@ +import https from "node:https"; + import axios, { AxiosInstance } from "axios"; import { v4 as uuidv4 } from "uuid"; +import { TGatewayServiceFactory } from "@app/ee/services/gateway/gateway-service"; import { BadRequestError } from "@app/lib/errors"; +import { GatewayProxyProtocol, withGatewayProxy } from "@app/lib/gateway"; import { logger } from "@app/lib/logger"; import { blockLocalAndPrivateIpAddresses } from "@app/lib/validator"; import { InfisicalImportData, VaultMappingType } from "../external-migration-types"; +enum KvVersion { + V1 = "1", + V2 = "2" +} + type VaultData = { namespace: string; mount: string; @@ -14,7 +23,42 @@ type VaultData = { secretData: Record; }; -const vaultFactory = () => { +const vaultFactory = (gatewayService: Pick) => { + const $gatewayProxyWrapper = async ( + inputs: { + gatewayId: string; + targetHost?: string; + targetPort?: number; + }, + gatewayCallback: (host: string, port: number, httpsAgent?: https.Agent) => Promise + ): Promise => { + const relayDetails = await gatewayService.fnGetGatewayClientTlsByGatewayId(inputs.gatewayId); + const [relayHost, relayPort] = relayDetails.relayAddress.split(":"); + + const callbackResult = await withGatewayProxy( + async (port, httpsAgent) => { + const res = await gatewayCallback("http://localhost", port, httpsAgent); + return res; + }, + { + protocol: GatewayProxyProtocol.Http, + targetHost: inputs.targetHost, + targetPort: inputs.targetPort, + relayHost, + relayPort: Number(relayPort), + identityId: relayDetails.identityId, + orgId: relayDetails.orgId, + tlsOptions: { + ca: relayDetails.certChain, + cert: relayDetails.certificate, + key: relayDetails.privateKey.toString() + } + } + ); + + return callbackResult; + }; + const getMounts = async (request: AxiosInstance) => { const response = await request .get<{ @@ -31,11 +75,24 @@ const vaultFactory = () => { const getPaths = async ( request: AxiosInstance, - { mountPath, secretPath = "" }: { mountPath: string; secretPath?: string } + { mountPath, secretPath = "" }: { mountPath: string; secretPath?: string }, + kvVersion: KvVersion ) => { try { - // For KV v2: /v1/{mount}/metadata/{path}?list=true - const path = secretPath ? `${mountPath}/metadata/${secretPath}` : `${mountPath}/metadata`; + if (kvVersion === KvVersion.V2) { + // For KV v2: /v1/{mount}/metadata/{path}?list=true + const path = secretPath ? `${mountPath}/metadata/${secretPath}` : `${mountPath}/metadata`; + const response = await request.get<{ + data: { + keys: string[]; + }; + }>(`/v1/${path}?list=true`); + + return response.data.data.keys; + } + + // kv version v1: /v1/{mount}?list=true + const path = secretPath ? `${mountPath}/${secretPath}` : mountPath; const response = await request.get<{ data: { keys: string[]; @@ -56,21 +113,42 @@ const vaultFactory = () => { const getSecrets = async ( request: AxiosInstance, - { mountPath, secretPath }: { mountPath: string; secretPath: string } + { mountPath, secretPath }: { mountPath: string; secretPath: string }, + kvVersion: KvVersion ) => { - // For KV v2: /v1/{mount}/data/{path} + if (kvVersion === KvVersion.V2) { + // For KV v2: /v1/{mount}/data/{path} + const response = await request + .get<{ + data: { + data: Record; // KV v2 has nested data structure + metadata: { + created_time: string; + deletion_time: string; + destroyed: boolean; + version: number; + }; + }; + }>(`/v1/${mountPath}/data/${secretPath}`) + .catch((err) => { + if (axios.isAxiosError(err)) { + logger.error(err.response?.data, "External migration: Failed to get Vault secret"); + } + throw err; + }); + + return response.data.data.data; + } + + // kv version v1 + const response = await request .get<{ - data: { - data: Record; // KV v2 has nested data structure - metadata: { - created_time: string; - deletion_time: string; - destroyed: boolean; - version: number; - }; - }; - }>(`/v1/${mountPath}/data/${secretPath}`) + data: Record; // KV v1 has flat data structure + lease_duration: number; + lease_id: string; + renewable: boolean; + }>(`/v1/${mountPath}/${secretPath}`) .catch((err) => { if (axios.isAxiosError(err)) { logger.error(err.response?.data, "External migration: Failed to get Vault secret"); @@ -78,7 +156,7 @@ const vaultFactory = () => { throw err; }); - return response.data.data.data; + return response.data.data; }; // helper function to check if a mount is KV v2 (will be useful if we add support for Vault KV v1) @@ -89,9 +167,10 @@ const vaultFactory = () => { const recursivelyGetAllPaths = async ( request: AxiosInstance, mountPath: string, + kvVersion: KvVersion, currentPath: string = "" ): Promise => { - const paths = await getPaths(request, { mountPath, secretPath: currentPath }); + const paths = await getPaths(request, { mountPath, secretPath: currentPath }, kvVersion); if (paths === null || paths.length === 0) { return []; @@ -105,7 +184,7 @@ const vaultFactory = () => { if (path.endsWith("/")) { // it's a folder so we recurse into it - const subSecrets = await recursivelyGetAllPaths(request, mountPath, fullItemPath); + const subSecrets = await recursivelyGetAllPaths(request, mountPath, kvVersion, fullItemPath); allSecrets.push(...subSecrets); } else { // it's a secret so we add it to our results @@ -119,60 +198,93 @@ const vaultFactory = () => { async function collectVaultData({ baseUrl, namespace, - accessToken + accessToken, + gatewayId }: { baseUrl: string; namespace?: string; accessToken: string; + gatewayId?: string; }): Promise { - const request = axios.create({ - baseURL: baseUrl, - headers: { - "X-Vault-Token": accessToken, - ...(namespace ? { "X-Vault-Namespace": namespace } : {}) + const getData = async (host: string, port?: number, httpsAgent?: https.Agent) => { + const allData: VaultData[] = []; + + const request = axios.create({ + baseURL: port ? `${host}:${port}` : host, + headers: { + "X-Vault-Token": accessToken, + ...(namespace ? { "X-Vault-Namespace": namespace } : {}) + }, + httpsAgent + }); + + // Get all mounts in this namespace + const mounts = await getMounts(request); + + for (const mount of Object.keys(mounts)) { + if (!mount.endsWith("/")) { + delete mounts[mount]; + } } - }); - const allData: VaultData[] = []; + for await (const [mountPath, mountInfo] of Object.entries(mounts)) { + // skip non-KV mounts + if (!mountInfo.type.startsWith("kv")) { + // eslint-disable-next-line no-continue + continue; + } - // Get all mounts in this namespace - const mounts = await getMounts(request); + const kvVersion = mountInfo.options?.version === "2" ? KvVersion.V2 : KvVersion.V1; - for (const mount of Object.keys(mounts)) { - if (!mount.endsWith("/")) { - delete mounts[mount]; + // get all paths in this mount + const paths = await recursivelyGetAllPaths(request, `${mountPath.replace(/\/$/, "")}`, kvVersion); + + const cleanMountPath = mountPath.replace(/\/$/, ""); + + for await (const secretPath of paths) { + // get the actual secret data + const secretData = await getSecrets( + request, + { + mountPath: cleanMountPath, + secretPath: secretPath.replace(`${cleanMountPath}/`, "") + }, + kvVersion + ); + + allData.push({ + namespace: namespace || "", + mount: mountPath.replace(/\/$/, ""), + path: secretPath.replace(`${cleanMountPath}/`, ""), + secretData + }); + } } + + return allData; + }; + + let data; + + if (gatewayId) { + const url = new URL(baseUrl); + + const { port, protocol, hostname } = url; + const cleanedProtocol = protocol.slice(0, -1); + + data = await $gatewayProxyWrapper( + { + gatewayId, + targetHost: `${cleanedProtocol}://${hostname}`, + targetPort: port ? Number(port) : 8200 // 8200, default port for Vault self-hosted/dedicated + }, + getData + ); + } else { + data = await getData(baseUrl); } - for await (const [mountPath, mountInfo] of Object.entries(mounts)) { - // skip non-KV mounts - if (!mountInfo.type.startsWith("kv")) { - // eslint-disable-next-line no-continue - continue; - } - - // get all paths in this mount - const paths = await recursivelyGetAllPaths(request, `${mountPath.replace(/\/$/, "")}`); - - const cleanMountPath = mountPath.replace(/\/$/, ""); - - for await (const secretPath of paths) { - // get the actual secret data - const secretData = await getSecrets(request, { - mountPath: cleanMountPath, - secretPath: secretPath.replace(`${cleanMountPath}/`, "") - }); - - allData.push({ - namespace: namespace || "", - mount: mountPath.replace(/\/$/, ""), - path: secretPath.replace(`${cleanMountPath}/`, ""), - secretData - }); - } - } - - return allData; + return data; } return { @@ -296,17 +408,126 @@ export const transformToInfisicalFormatNamespaceToProjects = ( }; }; -export const importVaultDataFn = async ({ - vaultAccessToken, - vaultNamespace, - vaultUrl, - mappingType -}: { - vaultAccessToken: string; - vaultNamespace?: string; - vaultUrl: string; - mappingType: VaultMappingType; -}) => { +export const transformToInfisicalFormatKeyVaultToProjectsCustomC1 = (vaultData: VaultData[]): InfisicalImportData => { + const projects: Array<{ name: string; id: string }> = []; + const environments: Array<{ name: string; id: string; projectId: string; envParentId?: string }> = []; + const folders: Array<{ id: string; name: string; environmentId: string; parentFolderId?: string }> = []; + const secrets: Array<{ id: string; name: string; environmentId: string; value: string; folderId?: string }> = []; + + // track created entities to avoid duplicates + const projectMap = new Map(); // team name -> projectId + const environmentMap = new Map(); // team-name:envName -> environmentId + const folderMap = new Map(); // team-name:envName:folderPath -> folderId + + for (const data of vaultData) { + const { path, secretData } = data; + + const pathParts = path.split("/").filter(Boolean); + if (pathParts.length < 2) { + // eslint-disable-next-line no-continue + continue; + } + + // first level: environment (dev, prod, staging, etc.) + const environmentName = pathParts[0]; + // second level: team name (team1, team2, etc.) + const teamName = pathParts[1]; + // remaining parts: folder structure + const folderParts = pathParts.slice(2); + + // create project (team) if if doesn't exist + if (!projectMap.has(teamName)) { + const projectId = uuidv4(); + projectMap.set(teamName, projectId); + projects.push({ + name: teamName, + id: projectId + }); + } + const projectId = projectMap.get(teamName)!; + + // create environment (dev, prod, etc.) for team + const envKey = `${teamName}:${environmentName}`; + if (!environmentMap.has(envKey)) { + const environmentId = uuidv4(); + environmentMap.set(envKey, environmentId); + environments.push({ + name: environmentName, + id: environmentId, + projectId + }); + } + const environmentId = environmentMap.get(envKey)!; + + // create folder structure for path segments + let currentFolderId: string | undefined; + let currentPath = ""; + + for (const folderName of folderParts) { + currentPath = currentPath ? `${currentPath}/${folderName}` : folderName; + const folderKey = `${teamName}:${environmentName}:${currentPath}`; + + if (!folderMap.has(folderKey)) { + const folderId = uuidv4(); + folderMap.set(folderKey, folderId); + folders.push({ + id: folderId, + name: folderName, + environmentId, + parentFolderId: currentFolderId || environmentId + }); + currentFolderId = folderId; + } else { + currentFolderId = folderMap.get(folderKey)!; + } + } + + for (const [key, value] of Object.entries(secretData)) { + secrets.push({ + id: uuidv4(), + name: key, + environmentId, + value: String(value), + folderId: currentFolderId + }); + } + } + + return { + projects, + environments, + folders, + secrets + }; +}; + +// refer to internal doc for more details on which ID's belong to which orgs. +// when its a custom migration, then it doesn't matter which mapping type is used (as of now). +export const vaultMigrationTransformMappings: Record< + string, + (vaultData: VaultData[], mappingType: VaultMappingType) => InfisicalImportData +> = { + "68c57ab3-cea5-41fc-ae38-e156b10c14d2": transformToInfisicalFormatKeyVaultToProjectsCustomC1 +} as const; + +export const importVaultDataFn = async ( + { + vaultAccessToken, + vaultNamespace, + vaultUrl, + mappingType, + gatewayId, + orgId + }: { + vaultAccessToken: string; + vaultNamespace?: string; + vaultUrl: string; + mappingType: VaultMappingType; + gatewayId?: string; + orgId: string; + }, + { gatewayService }: { gatewayService: Pick } +) => { await blockLocalAndPrivateIpAddresses(vaultUrl); if (mappingType === VaultMappingType.Namespace && !vaultNamespace) { @@ -315,15 +536,33 @@ export const importVaultDataFn = async ({ }); } - const vaultApi = vaultFactory(); + let transformFn: (vaultData: VaultData[], mappingType: VaultMappingType) => InfisicalImportData; + + if (mappingType === VaultMappingType.Custom) { + transformFn = vaultMigrationTransformMappings[orgId]; + + if (!transformFn) { + throw new BadRequestError({ + message: "Please contact our sales team to enable custom vault migrations." + }); + } + } else { + transformFn = transformToInfisicalFormatNamespaceToProjects; + } + + logger.info( + { orgId, mappingType }, + `[importVaultDataFn]: Running ${orgId in vaultMigrationTransformMappings ? "custom" : "default"} transform` + ); + + const vaultApi = vaultFactory(gatewayService); const vaultData = await vaultApi.collectVaultData({ accessToken: vaultAccessToken, baseUrl: vaultUrl, - namespace: vaultNamespace + namespace: vaultNamespace, + gatewayId }); - const infisicalData = transformToInfisicalFormatNamespaceToProjects(vaultData, mappingType); - - return infisicalData; + return transformFn(vaultData, mappingType); }; diff --git a/backend/src/services/external-migration/external-migration-service.ts b/backend/src/services/external-migration/external-migration-service.ts index 3bbb88f5b..73fac00b9 100644 --- a/backend/src/services/external-migration/external-migration-service.ts +++ b/backend/src/services/external-migration/external-migration-service.ts @@ -1,17 +1,30 @@ import { OrgMembershipRole } from "@app/db/schemas"; +import { TGatewayServiceFactory } from "@app/ee/services/gateway/gateway-service"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service-types"; import { crypto } from "@app/lib/crypto/cryptography"; import { BadRequestError, ForbiddenRequestError } from "@app/lib/errors"; import { TUserDALFactory } from "../user/user-dal"; -import { decryptEnvKeyDataFn, importVaultDataFn, parseEnvKeyDataFn } from "./external-migration-fns"; +import { + decryptEnvKeyDataFn, + importVaultDataFn, + parseEnvKeyDataFn, + vaultMigrationTransformMappings +} from "./external-migration-fns"; import { TExternalMigrationQueueFactory } from "./external-migration-queue"; -import { ExternalPlatforms, TImportEnvKeyDataDTO, TImportVaultDataDTO } from "./external-migration-types"; +import { + ExternalMigrationProviders, + ExternalPlatforms, + THasCustomVaultMigrationDTO, + TImportEnvKeyDataDTO, + TImportVaultDataDTO +} from "./external-migration-types"; type TExternalMigrationServiceFactoryDep = { permissionService: TPermissionServiceFactory; externalMigrationQueue: TExternalMigrationQueueFactory; userDAL: Pick; + gatewayService: Pick; }; export type TExternalMigrationServiceFactory = ReturnType; @@ -19,7 +32,8 @@ export type TExternalMigrationServiceFactory = ReturnType { const importEnvKeyData = async ({ decryptionKey, @@ -72,6 +86,7 @@ export const externalMigrationServiceFactory = ({ vaultNamespace, mappingType, vaultUrl, + gatewayId, actor, actorId, actorOrgId, @@ -91,12 +106,19 @@ export const externalMigrationServiceFactory = ({ const user = await userDAL.findById(actorId); - const vaultData = await importVaultDataFn({ - vaultAccessToken, - vaultNamespace, - vaultUrl, - mappingType - }); + const vaultData = await importVaultDataFn( + { + vaultAccessToken, + vaultNamespace, + vaultUrl, + mappingType, + gatewayId, + orgId: actorOrgId + }, + { + gatewayService + } + ); const stringifiedJson = JSON.stringify({ data: vaultData, @@ -117,8 +139,37 @@ export const externalMigrationServiceFactory = ({ }); }; + const hasCustomVaultMigration = async ({ + actor, + actorId, + actorOrgId, + actorAuthMethod, + provider + }: THasCustomVaultMigrationDTO) => { + const { membership } = await permissionService.getOrgPermission( + actor, + actorId, + actorOrgId, + actorAuthMethod, + actorOrgId + ); + + if (membership.role !== OrgMembershipRole.Admin) { + throw new ForbiddenRequestError({ message: "Only admins can check custom migration status" }); + } + + if (provider !== ExternalMigrationProviders.Vault) { + throw new BadRequestError({ + message: "Invalid provider. Vault is the only supported provider for custom migrations." + }); + } + + return actorOrgId in vaultMigrationTransformMappings; + }; + return { importEnvKeyData, - importVaultData + importVaultData, + hasCustomVaultMigration }; }; diff --git a/backend/src/services/external-migration/external-migration-types.ts b/backend/src/services/external-migration/external-migration-types.ts index 7c0d4c9ea..804444172 100644 --- a/backend/src/services/external-migration/external-migration-types.ts +++ b/backend/src/services/external-migration/external-migration-types.ts @@ -4,7 +4,8 @@ import { ActorAuthMethod, ActorType } from "../auth/auth-type"; export enum VaultMappingType { Namespace = "namespace", - KeyVault = "key-vault" + KeyVault = "key-vault", + Custom = "custom" } export type InfisicalImportData = { @@ -26,11 +27,16 @@ export type TImportEnvKeyDataDTO = { encryptedJson: { nonce: string; data: string }; } & Omit; +export type THasCustomVaultMigrationDTO = { + provider: ExternalMigrationProviders; +} & Omit; + export type TImportVaultDataDTO = { vaultAccessToken: string; vaultNamespace?: string; mappingType: VaultMappingType; vaultUrl: string; + gatewayId?: string; } & Omit; export type TImportInfisicalDataCreate = { @@ -110,3 +116,8 @@ export enum ExternalPlatforms { EnvKey = "EnvKey", Vault = "Vault" } + +export enum ExternalMigrationProviders { + Vault = "vault", + EnvKey = "env-key" +} diff --git a/backend/src/services/identity-ua/identity-ua-service.ts b/backend/src/services/identity-ua/identity-ua-service.ts index 3aeb5e83c..597747683 100644 --- a/backend/src/services/identity-ua/identity-ua-service.ts +++ b/backend/src/services/identity-ua/identity-ua-service.ts @@ -8,11 +8,18 @@ import { validatePrivilegeChangeOperation } from "@app/ee/services/permission/permission-fns"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service-types"; -import { PgSqlLock, TKeyStoreFactory } from "@app/keystore/keystore"; +import { KeyStorePrefixes, TKeyStoreFactory } from "@app/keystore/keystore"; import { getConfig } from "@app/lib/config/env"; import { crypto } from "@app/lib/crypto/cryptography"; -import { BadRequestError, NotFoundError, PermissionBoundaryError, UnauthorizedError } from "@app/lib/errors"; +import { + BadRequestError, + NotFoundError, + PermissionBoundaryError, + RateLimitError, + UnauthorizedError +} from "@app/lib/errors"; import { checkIPAgainstBlocklist, extractIPDetails, isValidIpOrCidr, TIp } from "@app/lib/ip"; +import { logger } from "@app/lib/logger"; import { ActorType, AuthTokenType } from "../auth/auth-type"; import { TIdentityOrgDALFactory } from "../identity/identity-org-dal"; @@ -40,7 +47,10 @@ type TIdentityUaServiceFactoryDep = { identityOrgMembershipDAL: TIdentityOrgDALFactory; permissionService: Pick; licenseService: Pick; - keyStore: Pick; + keyStore: Pick< + TKeyStoreFactory, + "setItemWithExpiry" | "getItem" | "deleteItem" | "getKeysByPattern" | "deleteItems" | "acquireLock" + >; }; export type TIdentityUaServiceFactory = ReturnType; @@ -74,17 +84,21 @@ export const identityUaServiceFactory = ({ const LOCKOUT_KEY = `lockout:identity:${identityUa.identityId}:${IdentityAuthMethod.UNIVERSAL_AUTH}:${clientId}`; - const identityMembershipOrg = await identityOrgMembershipDAL.findOne({ identityId: identityUa.identityId }); - if (!identityMembershipOrg) { - throw new UnauthorizedError({ - message: "Invalid credentials" + let lock: Awaited>; + try { + lock = await keyStore.acquireLock([KeyStorePrefixes.IdentityLockoutLock(LOCKOUT_KEY)], 500, { + retryCount: 3, + retryDelay: 300, + retryJitter: 100 }); + } catch (e) { + logger.info( + `identity login failed to acquire lock [identityId=${identityUa.identityId}] [authMethod=${IdentityAuthMethod.UNIVERSAL_AUTH}]` + ); + throw new RateLimitError({ message: "Rate limit exceeded" }); } - const identityTx = await identityUaDAL.transaction(async (tx) => { - await tx.raw("SELECT pg_advisory_xact_lock(?)", [PgSqlLock.IdentityLogin(identityUa.identityId, clientId)]); - - // Lockout Check + try { const lockoutRaw = await keyStore.getItem(LOCKOUT_KEY); let lockout: LockoutObject | undefined; @@ -98,6 +112,13 @@ export const identityUaServiceFactory = ({ }); } + const identityMembershipOrg = await identityOrgMembershipDAL.findOne({ identityId: identityUa.identityId }); + if (!identityMembershipOrg) { + throw new UnauthorizedError({ + message: "Invalid credentials" + }); + } + const clientSecretPrefix = clientSecret.slice(0, 4); const clientSecretInfo = await identityUaClientSecretDAL.find({ identityUAId: identityUa.id, @@ -159,7 +180,7 @@ export const identityUaServiceFactory = ({ } } - if (clientSecretNumUsesLimit > 0 && clientSecretNumUses === clientSecretNumUsesLimit) { + if (clientSecretNumUsesLimit > 0 && clientSecretNumUses >= clientSecretNumUsesLimit) { // number of times client secret can be used for // a login operation reached await identityUaClientSecretDAL.updateById(validClientSecretInfo.id, { @@ -183,57 +204,61 @@ export const identityUaServiceFactory = ({ accessTokenMaxTTL: 1000000000 }; - const uaClientSecretDoc = await identityUaClientSecretDAL.incrementUsage(validClientSecretInfo.id, tx); - await identityOrgMembershipDAL.updateById( - identityMembershipOrg.id, - { - lastLoginAuthMethod: IdentityAuthMethod.UNIVERSAL_AUTH, - lastLoginTime: new Date() - }, - tx - ); - const newToken = await identityAccessTokenDAL.create( + const identityAccessToken = await identityUaDAL.transaction(async (tx) => { + const uaClientSecretDoc = await identityUaClientSecretDAL.incrementUsage(validClientSecretInfo!.id, tx); + await identityOrgMembershipDAL.updateById( + identityMembershipOrg.id, + { + lastLoginAuthMethod: IdentityAuthMethod.UNIVERSAL_AUTH, + lastLoginTime: new Date() + }, + tx + ); + const newToken = await identityAccessTokenDAL.create( + { + identityId: identityUa.identityId, + isAccessTokenRevoked: false, + identityUAClientSecretId: uaClientSecretDoc.id, + accessTokenNumUses: 0, + accessTokenNumUsesLimit: identityUa.accessTokenNumUsesLimit, + accessTokenPeriod: identityUa.accessTokenPeriod, + authMethod: IdentityAuthMethod.UNIVERSAL_AUTH, + ...accessTokenTTLParams + }, + tx + ); + + return newToken; + }); + + const appCfg = getConfig(); + const accessToken = crypto.jwt().sign( { identityId: identityUa.identityId, - isAccessTokenRevoked: false, - identityUAClientSecretId: uaClientSecretDoc.id, - accessTokenNumUses: 0, - accessTokenNumUsesLimit: identityUa.accessTokenNumUsesLimit, - accessTokenPeriod: identityUa.accessTokenPeriod, - authMethod: IdentityAuthMethod.UNIVERSAL_AUTH, - ...accessTokenTTLParams - }, - tx + clientSecretId: validClientSecretInfo.id, + identityAccessTokenId: identityAccessToken.id, + authTokenType: AuthTokenType.IDENTITY_ACCESS_TOKEN + } as TIdentityAccessTokenJwtPayload, + appCfg.AUTH_SECRET, + // akhilmhdh: for non-expiry tokens you should not even set the value, including undefined. Even for undefined jsonwebtoken throws error + Number(identityAccessToken.accessTokenTTL) === 0 + ? undefined + : { + expiresIn: Number(identityAccessToken.accessTokenTTL) + } ); - return { newToken, validClientSecretInfo, accessTokenTTLParams }; - }); - - const appCfg = getConfig(); - const accessToken = crypto.jwt().sign( - { - identityId: identityUa.identityId, - clientSecretId: identityTx.validClientSecretInfo.id, - identityAccessTokenId: identityTx.newToken.id, - authTokenType: AuthTokenType.IDENTITY_ACCESS_TOKEN - } as TIdentityAccessTokenJwtPayload, - appCfg.AUTH_SECRET, - // akhilmhdh: for non-expiry tokens you should not even set the value, including undefined. Even for undefined jsonwebtoken throws error - Number(identityTx.newToken.accessTokenTTL) === 0 - ? undefined - : { - expiresIn: Number(identityTx.newToken.accessTokenTTL) - } - ); - - return { - accessToken, - identityUa, - validClientSecretInfo: identityTx.validClientSecretInfo, - identityAccessToken: identityTx.newToken, - identityMembershipOrg, - ...identityTx.accessTokenTTLParams - }; + return { + accessToken, + identityUa, + validClientSecretInfo, + identityAccessToken, + identityMembershipOrg, + ...accessTokenTTLParams + }; + } finally { + await lock.release(); + } }; const attachUniversalAuth = async ({ diff --git a/backend/src/services/integration-auth/integration-delete-secret.ts b/backend/src/services/integration-auth/integration-delete-secret.ts index 2efec7a47..eaad08df8 100644 --- a/backend/src/services/integration-auth/integration-delete-secret.ts +++ b/backend/src/services/integration-auth/integration-delete-secret.ts @@ -39,7 +39,7 @@ const getIntegrationSecretsV2 = async ( }, secretV2BridgeDAL: Pick, folderDAL: Pick, - secretImportDAL: Pick + secretImportDAL: Pick ) => { const content: Record = {}; if (dto.depth > MAX_SYNC_SECRET_DEPTH) { @@ -300,7 +300,7 @@ export const deleteIntegrationSecrets = async ({ projectBotService: Pick; secretV2BridgeDAL: Pick; folderDAL: Pick; - secretImportDAL: Pick; + secretImportDAL: Pick; secretDAL: Pick; kmsService: Pick; }) => { diff --git a/backend/src/services/integration/integration-service.ts b/backend/src/services/integration/integration-service.ts index 2ef8615eb..463ca12e3 100644 --- a/backend/src/services/integration/integration-service.ts +++ b/backend/src/services/integration/integration-service.ts @@ -40,7 +40,7 @@ type TIntegrationServiceFactoryDep = { projectBotService: TProjectBotServiceFactory; secretQueueService: Pick; secretV2BridgeDAL: Pick; - secretImportDAL: Pick; + secretImportDAL: Pick; kmsService: Pick; secretDAL: Pick; }; diff --git a/backend/src/services/offline-usage-report/offline-usage-report-dal.ts b/backend/src/services/offline-usage-report/offline-usage-report-dal.ts new file mode 100644 index 000000000..109d90da8 --- /dev/null +++ b/backend/src/services/offline-usage-report/offline-usage-report-dal.ts @@ -0,0 +1,208 @@ +import { TDbClient } from "@app/db"; +import { ProjectType, TableName } from "@app/db/schemas"; + +export type TOfflineUsageReportDALFactory = ReturnType; + +export const offlineUsageReportDALFactory = (db: TDbClient) => { + const getUserMetrics = async () => { + // Get total users and admin users + const userMetrics = (await db + .from(TableName.Users) + .select( + db.raw( + ` + COUNT(*) as total_users, + COUNT(CASE WHEN "superAdmin" = true THEN 1 END) as admin_users + ` + ) + ) + .where({ isGhost: false }) + .first()) as { total_users: string; admin_users: string } | undefined; + + // Get users by auth method + const authMethodStats = (await db + .from(TableName.Users) + .select( + db.raw(` + unnest("authMethods") as auth_method, + COUNT(*) as count + `) + ) + .where({ isGhost: false }) + .whereNotNull("authMethods") + .groupBy(db.raw('unnest("authMethods")'))) as Array<{ auth_method: string; count: string }>; + + const usersByAuthMethod = authMethodStats.reduce( + (acc: Record, row: { auth_method: string; count: string }) => { + acc[row.auth_method] = parseInt(row.count, 10); + return acc; + }, + {} as Record + ); + + return { + totalUsers: parseInt(userMetrics?.total_users || "0", 10), + adminUsers: parseInt(userMetrics?.admin_users || "0", 10), + usersByAuthMethod + }; + }; + + const getMachineIdentityMetrics = async () => { + // Get total machine identities + const identityMetrics = (await db + .from(TableName.Identity) + .select( + db.raw( + ` + COUNT(*) as total_identities + ` + ) + ) + .first()) as { total_identities: string } | undefined; + + // Get identities by auth method + const authMethodStats = (await db + .from(TableName.Identity) + .select("authMethod") + .count("* as count") + .whereNotNull("authMethod") + .groupBy("authMethod")) as Array<{ authMethod: string; count: string }>; + + const machineIdentitiesByAuthMethod = authMethodStats.reduce( + (acc: Record, row: { authMethod: string; count: string }) => { + acc[row.authMethod] = parseInt(row.count, 10); + return acc; + }, + {} as Record + ); + + return { + totalMachineIdentities: parseInt(identityMetrics?.total_identities || "0", 10), + machineIdentitiesByAuthMethod + }; + }; + + const getProjectMetrics = async () => { + // Get total projects and projects by type + const projectMetrics = (await db + .from(TableName.Project) + .select("type") + .count("* as count") + .groupBy("type")) as Array<{ type: string; count: string }>; + + const totalProjects = projectMetrics.reduce( + (sum, row: { type: string; count: string }) => sum + parseInt(row.count, 10), + 0 + ); + const projectsByType = projectMetrics.reduce( + (acc: Record, row: { type: string; count: string }) => { + acc[row.type] = parseInt(row.count, 10); + return acc; + }, + {} as Record + ); + + // Calculate average secrets per project + const secretsPerProject = (await db + .from(`${TableName.SecretV2} as s`) + .select("p.id as projectId") + .count("s.id as count") + .leftJoin(`${TableName.SecretFolder} as sf`, "s.folderId", "sf.id") + .leftJoin(`${TableName.Environment} as e`, "sf.envId", "e.id") + .leftJoin(`${TableName.Project} as p`, "e.projectId", "p.id") + .where("p.type", ProjectType.SecretManager) + .groupBy("p.id") + .whereNotNull("p.id")) as Array<{ projectId: string; count: string }>; + + const averageSecretsPerProject = + secretsPerProject.length > 0 + ? secretsPerProject.reduce( + (sum, row: { projectId: string; count: string }) => sum + parseInt(row.count, 10), + 0 + ) / secretsPerProject.length + : 0; + + return { + totalProjects, + projectsByType, + averageSecretsPerProject: Math.round(averageSecretsPerProject * 100) / 100 + }; + }; + + const getSecretMetrics = async () => { + // Get total secrets + const totalSecretsResult = (await db.from(TableName.SecretV2).count("* as count").first()) as + | { count: string } + | undefined; + + const totalSecrets = parseInt(totalSecretsResult?.count || "0", 10); + + // Get secrets by project + const secretsByProject = (await db + .from(`${TableName.SecretV2} as s`) + .select("p.id as projectId", "p.name as projectName") + .count("s.id as secretCount") + .leftJoin(`${TableName.SecretFolder} as sf`, "s.folderId", "sf.id") + .leftJoin(`${TableName.Environment} as e`, "sf.envId", "e.id") + .leftJoin(`${TableName.Project} as p`, "e.projectId", "p.id") + .where("p.type", ProjectType.SecretManager) + .groupBy("p.id", "p.name") + .whereNotNull("p.id")) as Array<{ projectId: string; projectName: string; secretCount: string }>; + + return { + totalSecrets, + secretsByProject: secretsByProject.map( + (row: { projectId: string; projectName: string; secretCount: string }) => ({ + projectId: row.projectId, + projectName: row.projectName, + secretCount: parseInt(row.secretCount, 10) + }) + ) + }; + }; + + const getSecretSyncMetrics = async () => { + const totalSecretSyncsResult = (await db.from(TableName.SecretSync).count("* as count").first()) as + | { count: string } + | undefined; + + return { + totalSecretSyncs: parseInt(totalSecretSyncsResult?.count || "0", 10) + }; + }; + + const getDynamicSecretMetrics = async () => { + const totalDynamicSecretsResult = (await db.from(TableName.DynamicSecret).count("* as count").first()) as + | { count: string } + | undefined; + + return { + totalDynamicSecrets: parseInt(totalDynamicSecretsResult?.count || "0", 10) + }; + }; + + const getSecretRotationMetrics = async () => { + // Check both v1 and v2 secret rotation tables + const [v1RotationsResult, v2RotationsResult] = await Promise.all([ + db.from(TableName.SecretRotation).count("* as count").first() as Promise<{ count: string } | undefined>, + db.from(TableName.SecretRotationV2).count("* as count").first() as Promise<{ count: string } | undefined> + ]); + + const totalV1Rotations = parseInt(v1RotationsResult?.count || "0", 10); + const totalV2Rotations = parseInt(v2RotationsResult?.count || "0", 10); + + return { + totalSecretRotations: totalV1Rotations + totalV2Rotations + }; + }; + + return { + getUserMetrics, + getMachineIdentityMetrics, + getProjectMetrics, + getSecretMetrics, + getSecretSyncMetrics, + getDynamicSecretMetrics, + getSecretRotationMetrics + }; +}; diff --git a/backend/src/services/offline-usage-report/offline-usage-report-service.ts b/backend/src/services/offline-usage-report/offline-usage-report-service.ts new file mode 100644 index 000000000..179232aa4 --- /dev/null +++ b/backend/src/services/offline-usage-report/offline-usage-report-service.ts @@ -0,0 +1,133 @@ +import crypto from "crypto"; + +import { TLicenseServiceFactory } from "@app/ee/services/license/license-service"; +import { getConfig } from "@app/lib/config/env"; +import { BadRequestError } from "@app/lib/errors"; + +import { TOfflineUsageReportDALFactory } from "./offline-usage-report-dal"; + +type TOfflineUsageReportServiceFactoryDep = { + offlineUsageReportDAL: TOfflineUsageReportDALFactory; + licenseService: Pick; +}; + +export type TOfflineUsageReportServiceFactory = ReturnType; + +export const offlineUsageReportServiceFactory = ({ + offlineUsageReportDAL, + licenseService +}: TOfflineUsageReportServiceFactoryDep) => { + const signReportContent = (content: string, licenseId: string): string => { + const contentHash = crypto.createHash("sha256").update(content).digest("hex"); + const hmac = crypto.createHmac("sha256", licenseId); + hmac.update(contentHash); + return hmac.digest("hex"); + }; + + const verifyReportContent = (content: string, signature: string, licenseId: string): boolean => { + const expectedSignature = signReportContent(content, licenseId); + return signature === expectedSignature; + }; + + const generateUsageReportCSV = async () => { + const cfg = getConfig(); + if (!cfg.LICENSE_KEY_OFFLINE) { + throw new BadRequestError({ + message: "Offline usage reports are not enabled. LICENSE_KEY_OFFLINE must be configured." + }); + } + + const customerId = licenseService.getCustomerId() as string; + const licenseId = licenseService.getLicenseId(); + + const [ + userMetrics, + machineIdentityMetrics, + projectMetrics, + secretMetrics, + secretSyncMetrics, + dynamicSecretMetrics, + secretRotationMetrics + ] = await Promise.all([ + offlineUsageReportDAL.getUserMetrics(), + offlineUsageReportDAL.getMachineIdentityMetrics(), + offlineUsageReportDAL.getProjectMetrics(), + offlineUsageReportDAL.getSecretMetrics(), + offlineUsageReportDAL.getSecretSyncMetrics(), + offlineUsageReportDAL.getDynamicSecretMetrics(), + offlineUsageReportDAL.getSecretRotationMetrics() + ]); + + const headers = [ + "Total Users", + "Admin Users", + "Total Identities", + "Total Projects", + "Total Secrets", + "Total Secret Syncs", + "Total Dynamic Secrets", + "Total Secret Rotations", + "Avg Secrets Per Project" + ]; + + const allUserAuthMethods = Object.keys(userMetrics.usersByAuthMethod); + allUserAuthMethods.forEach((method) => { + headers.push(`Users Auth ${method}`); + }); + + const allIdentityAuthMethods = Object.keys(machineIdentityMetrics.machineIdentitiesByAuthMethod); + allIdentityAuthMethods.forEach((method) => { + headers.push(`Identities Auth ${method}`); + }); + + const allProjectTypes = Object.keys(projectMetrics.projectsByType); + allProjectTypes.forEach((type) => { + headers.push(`Projects ${type}`); + }); + + headers.push("Signature"); + + const dataRow: (string | number)[] = [ + userMetrics.totalUsers, + userMetrics.adminUsers, + machineIdentityMetrics.totalMachineIdentities, + projectMetrics.totalProjects, + secretMetrics.totalSecrets, + secretSyncMetrics.totalSecretSyncs, + dynamicSecretMetrics.totalDynamicSecrets, + secretRotationMetrics.totalSecretRotations, + projectMetrics.averageSecretsPerProject + ]; + + allUserAuthMethods.forEach((method) => { + dataRow.push(userMetrics.usersByAuthMethod[method] || 0); + }); + allIdentityAuthMethods.forEach((method) => { + dataRow.push(machineIdentityMetrics.machineIdentitiesByAuthMethod[method] || 0); + }); + + allProjectTypes.forEach((type) => { + dataRow.push(projectMetrics.projectsByType[type] || 0); + }); + + const headersWithoutSignature = headers.slice(0, -1); + const contentWithoutSignature = [headersWithoutSignature.join(","), dataRow.join(",")].join("\n"); + + const signature = signReportContent(contentWithoutSignature, licenseId); + dataRow.push(signature); + + const csvContent = [headers.join(","), dataRow.join(",")].join("\n"); + + return { + csvContent, + signature, + filename: `infisical-usage-report-${customerId}-${new Date().toISOString().split("T")[0]}.csv` + }; + }; + + return { + generateUsageReportCSV, + verifyReportSignature: (csvContent: string, signature: string, licenseId: string) => + verifyReportContent(csvContent, signature, licenseId) + }; +}; diff --git a/backend/src/services/offline-usage-report/offline-usage-report-types.ts b/backend/src/services/offline-usage-report/offline-usage-report-types.ts new file mode 100644 index 000000000..614d5ccce --- /dev/null +++ b/backend/src/services/offline-usage-report/offline-usage-report-types.ts @@ -0,0 +1,42 @@ +export interface TUsageMetrics { + // User metrics + totalUsers: number; + usersByAuthMethod: Record; + adminUsers: number; + + // Machine identity metrics + totalMachineIdentities: number; + machineIdentitiesByAuthMethod: Record; + + // Project metrics + totalProjects: number; + projectsByType: Record; + averageSecretsPerProject: number; + + // Secret metrics + totalSecrets: number; + totalSecretSyncs: number; + totalDynamicSecrets: number; + totalSecretRotations: number; +} + +export interface TUsageReportMetadata { + generatedAt: string; + instanceId: string; + reportVersion: string; +} + +export interface TUsageReport { + metadata: TUsageReportMetadata; + metrics: TUsageMetrics; + signature?: string; +} + +export interface TGenerateUsageReportDTO { + includeSignature?: boolean; +} + +export interface TVerifyUsageReportDTO { + reportData: string; + signature: string; +} diff --git a/backend/src/services/org-membership/org-membership-dal.ts b/backend/src/services/org-membership/org-membership-dal.ts index 7cef4a6cc..2d7992d34 100644 --- a/backend/src/services/org-membership/org-membership-dal.ts +++ b/backend/src/services/org-membership/org-membership-dal.ts @@ -153,10 +153,64 @@ export const orgMembershipDALFactory = (db: TDbClient) => { } }; + const findOrgMembershipsWithUsersByOrgId = async (orgId: string) => { + try { + const members = await db + .replicaNode()(TableName.OrgMembership) + .where(`${TableName.OrgMembership}.orgId`, orgId) + .join(TableName.Users, `${TableName.OrgMembership}.userId`, `${TableName.Users}.id`) + .leftJoin( + TableName.UserEncryptionKey, + `${TableName.UserEncryptionKey}.userId`, + `${TableName.Users}.id` + ) + .leftJoin(TableName.IdentityMetadata, (queryBuilder) => { + void queryBuilder + .on(`${TableName.OrgMembership}.userId`, `${TableName.IdentityMetadata}.userId`) + .andOn(`${TableName.OrgMembership}.orgId`, `${TableName.IdentityMetadata}.orgId`); + }) + .select( + db.ref("id").withSchema(TableName.OrgMembership), + db.ref("inviteEmail").withSchema(TableName.OrgMembership), + db.ref("orgId").withSchema(TableName.OrgMembership), + db.ref("role").withSchema(TableName.OrgMembership), + db.ref("roleId").withSchema(TableName.OrgMembership), + db.ref("status").withSchema(TableName.OrgMembership), + db.ref("isActive").withSchema(TableName.OrgMembership), + db.ref("email").withSchema(TableName.Users), + db.ref("username").withSchema(TableName.Users), + db.ref("firstName").withSchema(TableName.Users), + db.ref("lastName").withSchema(TableName.Users), + db.ref("isEmailVerified").withSchema(TableName.Users), + db.ref("id").withSchema(TableName.Users).as("userId") + ) + .where({ isGhost: false }); + + return members.map((member) => ({ + id: member.id, + orgId: member.orgId, + role: member.role, + status: member.status, + isActive: member.isActive, + inviteEmail: member.inviteEmail, + user: { + id: member.userId, + email: member.email, + username: member.username, + firstName: member.firstName, + lastName: member.lastName + } + })); + } catch (error) { + throw new DatabaseError({ error, name: "Find org memberships with users by org id" }); + } + }; + return { ...orgMembershipOrm, findOrgMembershipById, findRecentInvitedMemberships, - updateLastInvitedAtByIds + updateLastInvitedAtByIds, + findOrgMembershipsWithUsersByOrgId }; }; diff --git a/backend/src/services/org/org-dal.ts b/backend/src/services/org/org-dal.ts index aa22b11c7..925784bff 100644 --- a/backend/src/services/org/org-dal.ts +++ b/backend/src/services/org/org-dal.ts @@ -83,6 +83,7 @@ export const orgDALFactory = (db: TDbClient) => { .select(db.ref("id").withSchema(TableName.OrgMembership).as("orgMembershipId")) .select(db.ref("role").withSchema(TableName.OrgMembership).as("orgMembershipRole")) .select(db.ref("roleId").withSchema(TableName.OrgMembership).as("orgMembershipRoleId")) + .select(db.ref("status").withSchema(TableName.OrgMembership).as("orgMembershipStatus")) .select(db.ref("name").withSchema(TableName.OrgRoles).as("orgMembershipRoleName")); const formattedDocs = sqlNestRelationships({ @@ -112,7 +113,8 @@ export const orgDALFactory = (db: TDbClient) => { orgMembershipId, orgMembershipRole, orgMembershipRoleName, - orgMembershipRoleId + orgMembershipRoleId, + orgMembershipStatus }) => ({ user: { id: userId, @@ -121,6 +123,7 @@ export const orgDALFactory = (db: TDbClient) => { firstName, lastName }, + status: orgMembershipStatus, membershipId: orgMembershipId, role: orgMembershipRoleName || orgMembershipRole, // custom role name or pre-defined role name roleId: orgMembershipRoleId @@ -488,6 +491,15 @@ export const orgDALFactory = (db: TDbClient) => { } }; + const bulkCreateMemberships = async (data: TOrgMembershipsInsert[], tx?: Knex) => { + try { + const memberships = await (tx || db)(TableName.OrgMembership).insert(data).returning("*"); + return memberships; + } catch (error) { + throw new DatabaseError({ error, name: "Create org memberships" }); + } + }; + const updateMembershipById = async (id: string, data: TOrgMembershipsUpdate, tx?: Knex) => { try { const [membership] = await (tx || db)(TableName.OrgMembership).where({ id }).update(data).returning("*"); @@ -668,6 +680,7 @@ export const orgDALFactory = (db: TDbClient) => { findMembership, findMembershipWithScimFilter, createMembership, + bulkCreateMemberships, updateMembershipById, deleteMembershipById, deleteMembershipsById, diff --git a/backend/src/services/org/org-service.ts b/backend/src/services/org/org-service.ts index 356a8451c..978bc8dae 100644 --- a/backend/src/services/org/org-service.ts +++ b/backend/src/services/org/org-service.ts @@ -528,15 +528,18 @@ export const orgServiceFactory = ({ /* * Create organization * */ - const createOrganization = async ({ - userId, - userEmail, - orgName - }: { - userId: string; - orgName: string; - userEmail?: string | null; - }) => { + const createOrganization = async ( + { + userId, + userEmail, + orgName + }: { + userId?: string; + orgName: string; + userEmail?: string | null; + }, + trx?: Knex + ) => { const { privateKey, publicKey } = await crypto.encryption().asymmetric().generateKeyPair(); const key = crypto.randomBytes(32).toString("base64"); const { @@ -555,22 +558,25 @@ export const orgServiceFactory = ({ } = crypto.encryption().symmetric().encryptWithRootEncryptionKey(key); const customerId = await licenseService.generateOrgCustomerId(orgName, userEmail); - const organization = await orgDAL.transaction(async (tx) => { + + const createOrg = async (tx: Knex) => { // akhilmhdh: for now this is auto created. in future we can input from user and for previous users just modifiy const org = await orgDAL.create( { name: orgName, customerId, slug: slugify(`${orgName}-${alphaNumericNanoId(4)}`) }, tx ); - await orgDAL.createMembership( - { - userId, - orgId: org.id, - role: OrgMembershipRole.Admin, - status: OrgMembershipStatus.Accepted, - isActive: true - }, - tx - ); + if (userId) { + await orgDAL.createMembership( + { + userId, + orgId: org.id, + role: OrgMembershipRole.Admin, + status: OrgMembershipStatus.Accepted, + isActive: true + }, + tx + ); + } await orgBotDAL.create( { name: org.name, @@ -590,7 +596,9 @@ export const orgServiceFactory = ({ tx ); return org; - }); + }; + + const organization = await (trx ? createOrg(trx) : orgDAL.transaction(createOrg)); await licenseService.updateSubscriptionOrgMemberCount(organization.id); return organization; diff --git a/backend/src/services/secret-folder/secret-folder-service.ts b/backend/src/services/secret-folder/secret-folder-service.ts index 90cc25710..c5eb0adde 100644 --- a/backend/src/services/secret-folder/secret-folder-service.ts +++ b/backend/src/services/secret-folder/secret-folder-service.ts @@ -30,6 +30,7 @@ import { TDeleteFolderDTO, TDeleteManyFoldersDTO, TGetFolderByIdDTO, + TGetFolderByPathDTO, TGetFolderDTO, TGetFoldersDeepByEnvsDTO, TUpdateFolderDTO, @@ -1398,6 +1399,31 @@ export const secretFolderServiceFactory = ({ }; }; + const getFolderByPath = async ( + { projectId, environment, secretPath }: TGetFolderByPathDTO, + actor: OrgServiceActor + ) => { + // folder check is allowed to be read by anyone + // permission is to check if user has access + await permissionService.getProjectPermission({ + actor: actor.type, + actorId: actor.id, + projectId, + actorAuthMethod: actor.authMethod, + actorOrgId: actor.orgId, + actionProjectType: ActionProjectType.SecretManager + }); + + const folder = await folderDAL.findBySecretPath(projectId, environment, secretPath); + + if (!folder) + throw new NotFoundError({ + message: `Could not find folder with path "${secretPath}" in environment "${environment}" for project with ID "${projectId}"` + }); + + return folder; + }; + return { createFolder, updateFolder, @@ -1405,6 +1431,7 @@ export const secretFolderServiceFactory = ({ deleteFolder, getFolders, getFolderById, + getFolderByPath, getProjectFolderCount, getFoldersMultiEnv, getFoldersDeepByEnvs, diff --git a/backend/src/services/secret-folder/secret-folder-types.ts b/backend/src/services/secret-folder/secret-folder-types.ts index ae8e2c5dc..eed815da5 100644 --- a/backend/src/services/secret-folder/secret-folder-types.ts +++ b/backend/src/services/secret-folder/secret-folder-types.ts @@ -91,3 +91,9 @@ export type TDeleteManyFoldersDTO = { idOrName: string; }>; }; + +export type TGetFolderByPathDTO = { + projectId: string; + environment: string; + secretPath: string; +}; diff --git a/backend/src/services/secret-import/secret-import-dal.ts b/backend/src/services/secret-import/secret-import-dal.ts index dbe2f6a84..db611dc6c 100644 --- a/backend/src/services/secret-import/secret-import-dal.ts +++ b/backend/src/services/secret-import/secret-import-dal.ts @@ -127,6 +127,27 @@ export const secretImportDALFactory = (db: TDbClient) => { } }; + const findByIds = async (ids: string[], tx?: Knex) => { + try { + const docs = await (tx || db.replicaNode())(TableName.SecretImport) + .whereIn(`${TableName.SecretImport}.id`, ids) + .join(TableName.Environment, `${TableName.SecretImport}.importEnv`, `${TableName.Environment}.id`) + .select( + db.ref("*").withSchema(TableName.SecretImport) as unknown as keyof TSecretImports, + db.ref("slug").withSchema(TableName.Environment), + db.ref("name").withSchema(TableName.Environment), + db.ref("id").withSchema(TableName.Environment).as("envId") + ); + + return docs.map(({ envId, slug, name, ...el }) => ({ + ...el, + importEnv: { id: envId, slug, name } + })); + } catch (error) { + throw new DatabaseError({ error, name: "Find secret imports by ids" }); + } + }; + const getProjectImportCount = async ( { search, ...filter }: Partial, tx?: Knex @@ -325,6 +346,7 @@ export const secretImportDALFactory = (db: TDbClient) => { ...secretImportOrm, find, findById, + findByIds, findByFolderIds, findLastImportPosition, updateAllPosition, diff --git a/backend/src/services/secret-import/secret-import-fns.ts b/backend/src/services/secret-import/secret-import-fns.ts index 6aa73465d..c739c5ad2 100644 --- a/backend/src/services/secret-import/secret-import-fns.ts +++ b/backend/src/services/secret-import/secret-import-fns.ts @@ -1,3 +1,5 @@ +import RE2 from "re2"; + import { SecretType, TSecretImports, TSecrets, TSecretsV2 } from "@app/db/schemas"; import { groupBy, unique } from "@app/lib/fn"; @@ -54,6 +56,74 @@ type TSecretImportSecretsV2 = { const LEVEL_BREAK = 10; const getImportUniqKey = (envSlug: string, path: string) => `${envSlug}=${path}`; +const RESERVED_IMPORT_REGEX = new RE2("/__reserve_replication_([a-f0-9-]{36})"); + +/** + * Processes reserved imports by resolving them to their replication source. + */ +const processReservedImports = async < + T extends { + isReserved?: boolean | null; + importPath: string; + importEnv: { id: string; slug: string; name: string }; + folderId: string; + } +>( + imports: T[], + secretImportDAL: Pick +): Promise => { + const reservedImportIds: string[] = []; + + imports.forEach((secretImport) => { + if (secretImport.isReserved) { + const reservedMatch = RESERVED_IMPORT_REGEX.exec(secretImport.importPath); + if (reservedMatch) { + const referencedImportId = reservedMatch[1]; + reservedImportIds.push(referencedImportId); + } + } + }); + + if (reservedImportIds.length === 0) { + return imports; + } + + try { + const importDetailsMap = new Map< + string, + { importPath: string; importEnv: { id: string; slug: string; name: string } } + >(); + + const referencedImports = await secretImportDAL.findByIds(reservedImportIds); + referencedImports.forEach((referencedImport) => { + importDetailsMap.set(referencedImport.id, { + importPath: referencedImport.importPath, + importEnv: referencedImport.importEnv + }); + }); + + return imports.map((secretImport) => { + if (secretImport.isReserved) { + const reservedMatch = RESERVED_IMPORT_REGEX.exec(secretImport.importPath); + if (reservedMatch) { + const referencedImportId = reservedMatch[1]; + const referencedDetails = importDetailsMap.get(referencedImportId); + + if (referencedDetails) { + return { + ...secretImport, + importPath: referencedDetails.importPath, + importEnv: referencedDetails.importEnv + }; + } + } + } + return secretImport; + }); + } catch (error) { + return imports; + } +}; export const fnSecretsFromImports = async ({ allowedImports: possibleCyclicImports, folderDAL, @@ -167,7 +237,7 @@ export const fnSecretsV2FromImports = async ({ folderDAL: Pick; viewSecretValue: boolean; secretDAL: Pick; - secretImportDAL: Pick; + secretImportDAL: Pick; decryptor: (value?: Buffer | null) => string; expandSecretReferences?: (inputSecret: { value?: string; @@ -188,6 +258,10 @@ export const fnSecretsV2FromImports = async ({ })[]; }[] = [{ secretImports: rootSecretImports, depth: 0, parentImportedSecrets: [] }]; + const processedSecretImports = await processReservedImports(rootSecretImports, secretImportDAL); + + stack[0] = { secretImports: processedSecretImports, depth: 0, parentImportedSecrets: [] }; + const processedImports: TSecretImportSecretsV2[] = []; while (stack.length) { diff --git a/backend/src/services/secret-sync/aws-parameter-store/aws-parameter-store-sync-fns.ts b/backend/src/services/secret-sync/aws-parameter-store/aws-parameter-store-sync-fns.ts index 680dd4256..9bcf659aa 100644 --- a/backend/src/services/secret-sync/aws-parameter-store/aws-parameter-store-sync-fns.ts +++ b/backend/src/services/secret-sync/aws-parameter-store/aws-parameter-store-sync-fns.ts @@ -12,7 +12,7 @@ type TAWSParameterStoreRecord = Record; type TAWSParameterStoreMetadataRecord = Record; type TAWSParameterStoreTagsRecord = Record>; -const MAX_RETRIES = 5; +const MAX_RETRIES = 10; const BATCH_SIZE = 10; const getSSM = async (secretSync: TAwsParameterStoreSyncWithCredentials) => { diff --git a/backend/src/services/secret-sync/aws-secrets-manager/aws-secrets-manager-sync-fns.ts b/backend/src/services/secret-sync/aws-secrets-manager/aws-secrets-manager-sync-fns.ts index 8e37cf277..8573d6ffc 100644 --- a/backend/src/services/secret-sync/aws-secrets-manager/aws-secrets-manager-sync-fns.ts +++ b/backend/src/services/secret-sync/aws-secrets-manager/aws-secrets-manager-sync-fns.ts @@ -38,7 +38,7 @@ type TAwsSecretsRecord = Record; type TAwsSecretValuesRecord = Record; type TAwsSecretDescriptionsRecord = Record; -const MAX_RETRIES = 5; +const MAX_RETRIES = 10; const BATCH_SIZE = 20; const getSecretsManagerClient = async (secretSync: TAwsSecretsManagerSyncWithCredentials) => { diff --git a/backend/src/services/secret-sync/hc-vault/hc-vault-sync-fns.ts b/backend/src/services/secret-sync/hc-vault/hc-vault-sync-fns.ts index 724eec7be..9168c96a6 100644 --- a/backend/src/services/secret-sync/hc-vault/hc-vault-sync-fns.ts +++ b/backend/src/services/secret-sync/hc-vault/hc-vault-sync-fns.ts @@ -1,9 +1,13 @@ import { isAxiosError } from "axios"; -import { request } from "@app/lib/config/request"; +import { TGatewayServiceFactory } from "@app/ee/services/gateway/gateway-service"; import { removeTrailingSlash } from "@app/lib/fn"; -import { blockLocalAndPrivateIpAddresses } from "@app/lib/validator"; -import { getHCVaultAccessToken, getHCVaultInstanceUrl } from "@app/services/app-connection/hc-vault"; +import { + getHCVaultAccessToken, + getHCVaultInstanceUrl, + requestWithHCVaultGateway, + THCVaultConnection +} from "@app/services/app-connection/hc-vault"; import { THCVaultListVariables, THCVaultListVariablesResponse, @@ -14,19 +18,20 @@ import { SecretSyncError } from "@app/services/secret-sync/secret-sync-errors"; import { matchesSchema } from "@app/services/secret-sync/secret-sync-fns"; import { TSecretMap } from "@app/services/secret-sync/secret-sync-types"; -const listHCVaultVariables = async ({ instanceUrl, namespace, mount, accessToken, path }: THCVaultListVariables) => { - await blockLocalAndPrivateIpAddresses(instanceUrl); - +const listHCVaultVariables = async ( + { instanceUrl, namespace, mount, accessToken, path }: THCVaultListVariables, + connection: THCVaultConnection, + gatewayService: Pick +) => { try { - const { data } = await request.get( - `${instanceUrl}/v1/${removeTrailingSlash(mount)}/data/${path}`, - { - headers: { - "X-Vault-Token": accessToken, - ...(namespace ? { "X-Vault-Namespace": namespace } : {}) - } + const { data } = await requestWithHCVaultGateway(connection, gatewayService, { + url: `${instanceUrl}/v1/${removeTrailingSlash(mount)}/data/${path}`, + method: "GET", + headers: { + "X-Vault-Token": accessToken, + ...(namespace ? { "X-Vault-Namespace": namespace } : {}) } - ); + }); return data.data.data; } catch (error: unknown) { @@ -39,33 +44,29 @@ const listHCVaultVariables = async ({ instanceUrl, namespace, mount, accessToken }; // Hashicorp Vault updates all variables in one batch. This is to respect their versioning -const updateHCVaultVariables = async ({ - path, - instanceUrl, - namespace, - accessToken, - mount, - data -}: TPostHCVaultVariable) => { - await blockLocalAndPrivateIpAddresses(instanceUrl); - - return request.post( - `${instanceUrl}/v1/${removeTrailingSlash(mount)}/data/${path}`, - { - data +const updateHCVaultVariables = async ( + { path, instanceUrl, namespace, accessToken, mount, data }: TPostHCVaultVariable, + connection: THCVaultConnection, + gatewayService: Pick +) => { + return requestWithHCVaultGateway(connection, gatewayService, { + url: `${instanceUrl}/v1/${removeTrailingSlash(mount)}/data/${path}`, + method: "POST", + headers: { + "X-Vault-Token": accessToken, + ...(namespace ? { "X-Vault-Namespace": namespace } : {}), + "Content-Type": "application/json" }, - { - headers: { - "X-Vault-Token": accessToken, - ...(namespace ? { "X-Vault-Namespace": namespace } : {}), - "Content-Type": "application/json" - } - } - ); + data: { data } + }); }; export const HCVaultSyncFns = { - syncSecrets: async (secretSync: THCVaultSyncWithCredentials, secretMap: TSecretMap) => { + syncSecrets: async ( + secretSync: THCVaultSyncWithCredentials, + secretMap: TSecretMap, + gatewayService: Pick + ) => { const { connection, environment, @@ -74,16 +75,20 @@ export const HCVaultSyncFns = { } = secretSync; const { namespace } = connection.credentials; - const accessToken = await getHCVaultAccessToken(connection); + const accessToken = await getHCVaultAccessToken(connection, gatewayService); const instanceUrl = await getHCVaultInstanceUrl(connection); - const variables = await listHCVaultVariables({ - instanceUrl, - accessToken, - namespace, - mount, - path - }); + const variables = await listHCVaultVariables( + { + instanceUrl, + accessToken, + namespace, + mount, + path + }, + connection, + gatewayService + ); let tainted = false; for (const entry of Object.entries(secretMap)) { @@ -110,24 +115,36 @@ export const HCVaultSyncFns = { if (!tainted) return; try { - await updateHCVaultVariables({ accessToken, instanceUrl, namespace, mount, path, data: variables }); + await updateHCVaultVariables( + { accessToken, instanceUrl, namespace, mount, path, data: variables }, + connection, + gatewayService + ); } catch (error) { throw new SecretSyncError({ error }); } }, - removeSecrets: async (secretSync: THCVaultSyncWithCredentials, secretMap: TSecretMap) => { + removeSecrets: async ( + secretSync: THCVaultSyncWithCredentials, + secretMap: TSecretMap, + gatewayService: Pick + ) => { const { connection, destinationConfig: { mount, path } } = secretSync; const { namespace } = connection.credentials; - const accessToken = await getHCVaultAccessToken(connection); + const accessToken = await getHCVaultAccessToken(connection, gatewayService); const instanceUrl = await getHCVaultInstanceUrl(connection); - const variables = await listHCVaultVariables({ instanceUrl, namespace, accessToken, mount, path }); + const variables = await listHCVaultVariables( + { instanceUrl, namespace, accessToken, mount, path }, + connection, + gatewayService + ); for await (const [key] of Object.entries(variables)) { if (key in secretMap) { @@ -136,30 +153,41 @@ export const HCVaultSyncFns = { } try { - await updateHCVaultVariables({ accessToken, instanceUrl, namespace, mount, path, data: variables }); + await updateHCVaultVariables( + { accessToken, instanceUrl, namespace, mount, path, data: variables }, + connection, + gatewayService + ); } catch (error) { throw new SecretSyncError({ error }); } }, - getSecrets: async (secretSync: THCVaultSyncWithCredentials) => { + getSecrets: async ( + secretSync: THCVaultSyncWithCredentials, + gatewayService: Pick + ) => { const { connection, destinationConfig: { mount, path } } = secretSync; const { namespace } = connection.credentials; - const accessToken = await getHCVaultAccessToken(connection); + const accessToken = await getHCVaultAccessToken(connection, gatewayService); const instanceUrl = await getHCVaultInstanceUrl(connection); - const variables = await listHCVaultVariables({ - instanceUrl, - namespace, - accessToken, - mount, - path - }); + const variables = await listHCVaultVariables( + { + instanceUrl, + namespace, + accessToken, + mount, + path + }, + connection, + gatewayService + ); return Object.fromEntries(Object.entries(variables).map(([key, value]) => [key, { value }])); } diff --git a/backend/src/services/secret-sync/secret-sync-fns.ts b/backend/src/services/secret-sync/secret-sync-fns.ts index 3ff7cefbc..5b083baf6 100644 --- a/backend/src/services/secret-sync/secret-sync-fns.ts +++ b/backend/src/services/secret-sync/secret-sync-fns.ts @@ -244,7 +244,7 @@ export const SecretSyncFns = { case SecretSync.Windmill: return WindmillSyncFns.syncSecrets(secretSync, schemaSecretMap); case SecretSync.HCVault: - return HCVaultSyncFns.syncSecrets(secretSync, schemaSecretMap); + return HCVaultSyncFns.syncSecrets(secretSync, schemaSecretMap, gatewayService); case SecretSync.TeamCity: return TeamCitySyncFns.syncSecrets(secretSync, schemaSecretMap); case SecretSync.OCIVault: @@ -283,7 +283,7 @@ export const SecretSyncFns = { }, getSecrets: async ( secretSync: TSecretSyncWithCredentials, - { kmsService, appConnectionDAL }: TSyncSecretDeps + { kmsService, appConnectionDAL, gatewayService }: TSyncSecretDeps ): Promise => { let secretMap: TSecretMap; switch (secretSync.destination) { @@ -341,7 +341,7 @@ export const SecretSyncFns = { secretMap = await WindmillSyncFns.getSecrets(secretSync); break; case SecretSync.HCVault: - secretMap = await HCVaultSyncFns.getSecrets(secretSync); + secretMap = await HCVaultSyncFns.getSecrets(secretSync, gatewayService); break; case SecretSync.TeamCity: secretMap = await TeamCitySyncFns.getSecrets(secretSync); @@ -451,7 +451,7 @@ export const SecretSyncFns = { case SecretSync.Windmill: return WindmillSyncFns.removeSecrets(secretSync, schemaSecretMap); case SecretSync.HCVault: - return HCVaultSyncFns.removeSecrets(secretSync, schemaSecretMap); + return HCVaultSyncFns.removeSecrets(secretSync, schemaSecretMap, gatewayService); case SecretSync.TeamCity: return TeamCitySyncFns.removeSecrets(secretSync, schemaSecretMap); case SecretSync.OCIVault: diff --git a/backend/src/services/secret-sync/secret-sync-queue.ts b/backend/src/services/secret-sync/secret-sync-queue.ts index 7bef7d8c7..915ff89bf 100644 --- a/backend/src/services/secret-sync/secret-sync-queue.ts +++ b/backend/src/services/secret-sync/secret-sync-queue.ts @@ -80,8 +80,8 @@ type TSecretSyncQueueFactoryDep = { | "deleteMany" | "invalidateSecretCacheByProjectId" >; - secretImportDAL: Pick; - secretSyncDAL: Pick; + secretImportDAL: Pick; + secretSyncDAL: Pick; auditLogService: Pick; projectMembershipDAL: Pick; projectDAL: TProjectDALFactory; @@ -104,17 +104,15 @@ type SecretSyncActionJob = Job< TQueueSecretSyncSyncSecretsByIdDTO | TQueueSecretSyncImportSecretsByIdDTO | TQueueSecretSyncRemoveSecretsByIdDTO >; +const JITTER_MS = 10 * 1000; +const REQUEUE_MS = 30 * 1000; +const REQUEUE_LIMIT = 30; +const CONNECTION_CONCURRENCY_LIMIT = 3; + const getRequeueDelay = (failureCount?: number) => { - if (!failureCount) return 0; - - const baseDelay = 1000; - const maxDelay = 30000; - - const delay = Math.min(baseDelay * 2 ** failureCount, maxDelay); - - const jitter = delay * (0.5 + Math.random() * 0.5); - - return jitter; + const jitter = Math.random() * JITTER_MS; + if (!failureCount) return jitter; + return REQUEUE_MS + jitter; }; export const secretSyncQueueFactory = ({ @@ -193,6 +191,46 @@ export const secretSyncQueueFactory = ({ folderCommitService }); + const $isConnectionConcurrencyLimitReached = async (connectionId: string) => { + const concurrencyCount = await keyStore.getItem(KeyStorePrefixes.AppConnectionConcurrentJobs(connectionId)); + + if (!concurrencyCount) return false; + + const count = Number.parseInt(concurrencyCount, 10); + + if (Number.isNaN(count)) return false; + + return count >= CONNECTION_CONCURRENCY_LIMIT; + }; + + const $incrementConnectionConcurrencyCount = async (connectionId: string) => { + const concurrencyCount = await keyStore.getItem(KeyStorePrefixes.AppConnectionConcurrentJobs(connectionId)); + + const currentCount = Number.parseInt(concurrencyCount || "0", 10); + + const incrementedCount = Number.isNaN(currentCount) ? 1 : currentCount + 1; + + await keyStore.setItemWithExpiry( + KeyStorePrefixes.AppConnectionConcurrentJobs(connectionId), + (REQUEUE_MS * REQUEUE_LIMIT) / 1000, // in seconds + incrementedCount + ); + }; + + const $decrementConnectionConcurrencyCount = async (connectionId: string) => { + const concurrencyCount = await keyStore.getItem(KeyStorePrefixes.AppConnectionConcurrentJobs(connectionId)); + + const currentCount = Number.parseInt(concurrencyCount || "0", 10); + + const decrementedCount = Math.max(0, Number.isNaN(currentCount) ? 0 : currentCount - 1); + + await keyStore.setItemWithExpiry( + KeyStorePrefixes.AppConnectionConcurrentJobs(connectionId), + (REQUEUE_MS * REQUEUE_LIMIT) / 1000, // in seconds + decrementedCount + ); + }; + const $getInfisicalSecrets = async ( secretSync: TSecretSyncRaw | TSecretSyncWithCredentials, includeImports = true @@ -416,15 +454,11 @@ export const secretSyncQueueFactory = ({ return importedSecretMap; }; - const $handleSyncSecretsJob = async (job: TSecretSyncSyncSecretsDTO) => { + const $handleSyncSecretsJob = async (job: TSecretSyncSyncSecretsDTO, secretSync: TSecretSyncRaw) => { const { data: { syncId, auditLogInfo } } = job; - const secretSync = await secretSyncDAL.findById(syncId); - - if (!secretSync) throw new Error(`Cannot find secret sync with ID ${syncId}`); - await enterpriseSyncCheck( licenseService, secretSync.destination as SecretSync, @@ -566,15 +600,11 @@ export const secretSyncQueueFactory = ({ logger.info("SecretSync Sync Job with ID %s Completed", job.id); }; - const $handleImportSecretsJob = async (job: TSecretSyncImportSecretsDTO) => { + const $handleImportSecretsJob = async (job: TSecretSyncImportSecretsDTO, secretSync: TSecretSyncRaw) => { const { data: { syncId, auditLogInfo, importBehavior } } = job; - const secretSync = await secretSyncDAL.findById(syncId); - - if (!secretSync) throw new Error(`Cannot find secret sync with ID ${syncId}`); - await secretSyncDAL.updateById(syncId, { importStatus: SecretSyncStatus.Running }); @@ -683,15 +713,11 @@ export const secretSyncQueueFactory = ({ logger.info("SecretSync Import Job with ID %s Completed", job.id); }; - const $handleRemoveSecretsJob = async (job: TSecretSyncRemoveSecretsDTO) => { + const $handleRemoveSecretsJob = async (job: TSecretSyncRemoveSecretsDTO, secretSync: TSecretSyncRaw) => { const { data: { syncId, auditLogInfo, deleteSyncOnComplete } } = job; - const secretSync = await secretSyncDAL.findById(syncId); - - if (!secretSync) throw new Error(`Cannot find secret sync with ID ${syncId}`); - await enterpriseSyncCheck( licenseService, secretSync.destination as SecretSync, @@ -894,6 +920,17 @@ export const secretSyncQueueFactory = ({ const secretSyncs = await secretSyncDAL.find({ folderId: folder.id, isAutoSyncEnabled: true }); + await secretSyncDAL.update( + { + $in: { + id: secretSyncs.map((sync) => sync.id) + } + }, + { + syncStatus: SecretSyncStatus.Pending + } + ); + await Promise.all(secretSyncs.map((secretSync) => queueSecretSyncSyncSecretsById({ syncId: secretSync.id }))); }; @@ -904,7 +941,7 @@ export const secretSyncQueueFactory = ({ case QueueJobs.SecretSyncSyncSecrets: { const { failedToAcquireLockCount = 0, ...rest } = job.data as TQueueSecretSyncSyncSecretsByIdDTO; - if (failedToAcquireLockCount < 10) { + if (failedToAcquireLockCount < REQUEUE_LIMIT) { await queueSecretSyncSyncSecretsById({ ...rest, failedToAcquireLockCount: failedToAcquireLockCount + 1 }); return; } @@ -974,6 +1011,26 @@ export const secretSyncQueueFactory = ({ | TQueueSecretSyncImportSecretsByIdDTO | TQueueSecretSyncRemoveSecretsByIdDTO; + const secretSync = await secretSyncDAL.findById(syncId); + + if (!secretSync) throw new Error(`Cannot find secret sync with ID ${syncId}`); + + const { connectionId } = secretSync; + + if (job.name === QueueJobs.SecretSyncSyncSecrets) { + const isConcurrentLimitReached = await $isConnectionConcurrencyLimitReached(connectionId); + + if (isConcurrentLimitReached) { + logger.info( + `SecretSync Concurrency limit reached [syncId=${syncId}] [job=${job.name}] [connectionId=${connectionId}]` + ); + + await $handleAcquireLockFailure(job as SecretSyncActionJob); + + return; + } + } + let lock: Awaited>; try { @@ -993,20 +1050,26 @@ export const secretSyncQueueFactory = ({ try { switch (job.name) { - case QueueJobs.SecretSyncSyncSecrets: - await $handleSyncSecretsJob(job as TSecretSyncSyncSecretsDTO); + case QueueJobs.SecretSyncSyncSecrets: { + await $incrementConnectionConcurrencyCount(connectionId); + await $handleSyncSecretsJob(job as TSecretSyncSyncSecretsDTO, secretSync); break; + } case QueueJobs.SecretSyncImportSecrets: - await $handleImportSecretsJob(job as TSecretSyncImportSecretsDTO); + await $handleImportSecretsJob(job as TSecretSyncImportSecretsDTO, secretSync); break; case QueueJobs.SecretSyncRemoveSecrets: - await $handleRemoveSecretsJob(job as TSecretSyncRemoveSecretsDTO); + await $handleRemoveSecretsJob(job as TSecretSyncRemoveSecretsDTO, secretSync); break; default: // eslint-disable-next-line @typescript-eslint/restrict-template-expressions throw new Error(`Unhandled Secret Sync Job ${job.name}`); } } finally { + if (job.name === QueueJobs.SecretSyncSyncSecrets) { + await $decrementConnectionConcurrencyCount(connectionId); + } + await lock.release(); } }); diff --git a/backend/src/services/secret-v2-bridge/secret-v2-bridge-service.ts b/backend/src/services/secret-v2-bridge/secret-v2-bridge-service.ts index b23cd0c56..48ab07816 100644 --- a/backend/src/services/secret-v2-bridge/secret-v2-bridge-service.ts +++ b/backend/src/services/secret-v2-bridge/secret-v2-bridge-service.ts @@ -108,7 +108,7 @@ type TSecretV2BridgeServiceFactoryDep = { | "findBySecretPathMultiEnv" | "findSecretPathByFolderIds" >; - secretImportDAL: Pick; + secretImportDAL: Pick; secretQueueService: Pick; secretApprovalPolicyService: Pick; secretApprovalRequestDAL: Pick; diff --git a/backend/src/services/secret/secret-queue.ts b/backend/src/services/secret/secret-queue.ts index dc5713901..ed794a664 100644 --- a/backend/src/services/secret/secret-queue.ts +++ b/backend/src/services/secret/secret-queue.ts @@ -86,7 +86,7 @@ type TSecretQueueFactoryDep = { integrationAuthService: Pick; folderDAL: TSecretFolderDALFactory; secretDAL: TSecretDALFactory; - secretImportDAL: Pick; + secretImportDAL: Pick; webhookDAL: Pick; projectEnvDAL: Pick; projectDAL: TProjectDALFactory; diff --git a/backend/src/services/smtp/emails/OrganizationAssignmentTemplate.tsx b/backend/src/services/smtp/emails/OrganizationAssignmentTemplate.tsx new file mode 100644 index 000000000..14fb30d80 --- /dev/null +++ b/backend/src/services/smtp/emails/OrganizationAssignmentTemplate.tsx @@ -0,0 +1,69 @@ +import { Heading, Section, Text } from "@react-email/components"; +import React from "react"; + +import { BaseButton } from "./BaseButton"; +import { BaseEmailWrapper, BaseEmailWrapperProps } from "./BaseEmailWrapper"; +import { BaseLink } from "./BaseLink"; + +interface OrganizationAssignmentTemplateProps extends Omit { + inviterFirstName?: string; + inviterUsername?: string; + organizationName: string; + callback_url: string; +} + +export const OrganizationAssignmentTemplate = ({ + organizationName, + inviterFirstName, + inviterUsername, + callback_url, + siteUrl +}: OrganizationAssignmentTemplateProps) => { + return ( + + + You've been added to the organization +
+ {organizationName} on Infisical +
+
+ + {inviterFirstName && inviterUsername ? ( + <> + {inviterFirstName} ( + {inviterUsername}) has added you as an + organization admin to {organizationName}. + + ) : ( + <> + An instance admin has added you as an organization admin to {organizationName}. + + )} + +
+
+ View Dashboard +
+
+ + About Infisical: Infisical is an all-in-one platform to securely manage application secrets, + certificates, SSH keys, and configurations across your team and infrastructure. + +
+
+ ); +}; + +export default OrganizationAssignmentTemplate; + +OrganizationAssignmentTemplate.PreviewProps = { + organizationName: "Example Organization", + inviterFirstName: "Jane", + inviterUsername: "jane@infisical.com", + siteUrl: "https://infisical.com", + callback_url: "https://app.infisical.com" +} as OrganizationAssignmentTemplateProps; diff --git a/backend/src/services/smtp/emails/index.ts b/backend/src/services/smtp/emails/index.ts index 209cd672b..71c338def 100644 --- a/backend/src/services/smtp/emails/index.ts +++ b/backend/src/services/smtp/emails/index.ts @@ -9,6 +9,7 @@ export * from "./IntegrationSyncFailedTemplate"; export * from "./NewDeviceLoginTemplate"; export * from "./OrgAdminBreakglassAccessTemplate"; export * from "./OrgAdminProjectGrantAccessTemplate"; +export * from "./OrganizationAssignmentTemplate"; export * from "./OrganizationInvitationTemplate"; export * from "./PasswordResetTemplate"; export * from "./PasswordSetupTemplate"; diff --git a/backend/src/services/smtp/smtp-service.ts b/backend/src/services/smtp/smtp-service.ts index 500d0d89c..224f78265 100644 --- a/backend/src/services/smtp/smtp-service.ts +++ b/backend/src/services/smtp/smtp-service.ts @@ -18,6 +18,7 @@ import { NewDeviceLoginTemplate, OrgAdminBreakglassAccessTemplate, OrgAdminProjectGrantAccessTemplate, + OrganizationAssignmentTemplate, OrganizationInvitationTemplate, PasswordResetTemplate, PasswordSetupTemplate, @@ -61,6 +62,7 @@ export enum SmtpTemplates { // HistoricalSecretList = "historicalSecretLeakIncident", not used anymore? NewDeviceJoin = "newDevice", OrgInvite = "organizationInvitation", + OrgAssignment = "organizationAssignment", ResetPassword = "passwordReset", SetupPassword = "passwordSetup", SecretLeakIncident = "secretLeakIncident", @@ -94,6 +96,7 @@ export enum SmtpHost { // eslint-disable-next-line @typescript-eslint/no-explicit-any const EmailTemplateMap: Record> = { [SmtpTemplates.OrgInvite]: OrganizationInvitationTemplate, + [SmtpTemplates.OrgAssignment]: OrganizationAssignmentTemplate, [SmtpTemplates.NewDeviceJoin]: NewDeviceLoginTemplate, [SmtpTemplates.SignupEmailVerification]: SignupEmailVerificationTemplate, [SmtpTemplates.EmailMfa]: EmailMfaTemplate, diff --git a/backend/src/services/super-admin/super-admin-service.ts b/backend/src/services/super-admin/super-admin-service.ts index 03091a255..b43e4e0a2 100644 --- a/backend/src/services/super-admin/super-admin-service.ts +++ b/backend/src/services/super-admin/super-admin-service.ts @@ -1,6 +1,13 @@ import { CronJob } from "cron"; -import { IdentityAuthMethod, OrgMembershipRole, TSuperAdmin, TSuperAdminUpdate } from "@app/db/schemas"; +import { + IdentityAuthMethod, + OrgMembershipRole, + OrgMembershipStatus, + TSuperAdmin, + TSuperAdminUpdate, + TUsers +} from "@app/db/schemas"; import { TLicenseServiceFactory } from "@app/ee/services/license/license-service"; import { PgSqlLock, TKeyStoreFactory } from "@app/keystore/keystore"; import { @@ -13,7 +20,12 @@ import { import { crypto } from "@app/lib/crypto/cryptography"; import { BadRequestError, NotFoundError } from "@app/lib/errors"; import { logger } from "@app/lib/logger"; +import { OrgServiceActor } from "@app/lib/types"; +import { isDisposableEmail } from "@app/lib/validator"; +import { TAuthTokenServiceFactory } from "@app/services/auth-token/auth-token-service"; +import { TokenType } from "@app/services/auth-token/auth-token-types"; import { TIdentityDALFactory } from "@app/services/identity/identity-dal"; +import { SmtpTemplates, TSmtpService } from "@app/services/smtp/smtp-service"; import { TAuthLoginFactory } from "../auth/auth-login-service"; import { ActorType, AuthMethod, AuthTokenType } from "../auth/auth-type"; @@ -43,7 +55,9 @@ import { TAdminGetUsersDTO, TAdminIntegrationConfig, TAdminSignUpDTO, - TGetOrganizationsDTO + TCreateOrganizationDTO, + TGetOrganizationsDTO, + TResendOrgInviteDTO } from "./super-admin-types"; type TSuperAdminServiceFactoryDep = { @@ -59,11 +73,13 @@ type TSuperAdminServiceFactoryDep = { authService: Pick; kmsService: Pick; kmsRootConfigDAL: TKmsRootConfigDALFactory; - orgService: Pick; + orgService: Pick; keyStore: Pick; - licenseService: Pick; + licenseService: Pick; microsoftTeamsService: Pick; invalidateCacheQueue: TInvalidateCacheQueueFactory; + smtpService: Pick; + tokenService: TAuthTokenServiceFactory; }; export type TSuperAdminServiceFactory = ReturnType; @@ -123,7 +139,9 @@ export const superAdminServiceFactory = ({ identityTokenAuthDAL, identityOrgMembershipDAL, microsoftTeamsService, - invalidateCacheQueue + invalidateCacheQueue, + smtpService, + tokenService }: TSuperAdminServiceFactoryDep) => { const initServerCfg = async () => { // TODO(akhilmhdh): bad pattern time less change this later to me itself @@ -732,6 +750,159 @@ export const superAdminServiceFactory = ({ return organizations; }; + const createOrganization = async ( + { name, inviteAdminEmails: emails }: TCreateOrganizationDTO, + actor: OrgServiceActor + ) => { + const appCfg = getConfig(); + + const inviteAdminEmails = [...new Set(emails)]; + + if (!appCfg.isDevelopmentMode && appCfg.isCloud) + throw new BadRequestError({ message: "This endpoint is not supported for cloud instances" }); + + const serverAdmin = await userDAL.findById(actor.id); + const plan = licenseService.onPremFeatures; + + const isEmailInvalid = await isDisposableEmail(inviteAdminEmails); + if (isEmailInvalid) { + throw new BadRequestError({ + message: "Disposable emails are not allowed", + name: "InviteUser" + }); + } + + const { organization, users: usersToEmail } = await orgDAL.transaction(async (tx) => { + const org = await orgService.createOrganization( + { + orgName: name, + userEmail: serverAdmin?.email ?? serverAdmin?.username // identities can be server admins so we can't require this + }, + tx + ); + + const users: Pick[] = []; + + for await (const inviteeEmail of inviteAdminEmails) { + const usersByUsername = await userDAL.findUserByUsername(inviteeEmail, tx); + let inviteeUser = + usersByUsername?.length > 1 + ? usersByUsername.find((el) => el.username === inviteeEmail) + : usersByUsername?.[0]; + + // if the user doesn't exist we create the user with the email + if (!inviteeUser) { + // TODO(carlos): will be removed once the function receives usernames instead of emails + const usersByEmail = await userDAL.findUserByEmail(inviteeEmail, tx); + if (usersByEmail?.length === 1) { + [inviteeUser] = usersByEmail; + } else { + inviteeUser = await userDAL.create( + { + isAccepted: false, + email: inviteeEmail, + username: inviteeEmail, + authMethods: [AuthMethod.EMAIL], + isGhost: false + }, + tx + ); + } + } + + const inviteeUserId = inviteeUser?.id; + const existingEncryptionKey = await userDAL.findUserEncKeyByUserId(inviteeUserId, tx); + + // when user is missing the encrytion keys + // this could happen either if user doesn't exist or user didn't find step 3 of generating the encryption keys of srp + // So what we do is we generate a random secure password and then encrypt it with a random pub-private key + // Then when user sign in (as login is not possible as isAccepted is false) we rencrypt the private key with the user password + if (!inviteeUser || (inviteeUser && !inviteeUser?.isAccepted && !existingEncryptionKey)) { + await userDAL.createUserEncryption( + { + userId: inviteeUserId, + encryptionVersion: 2 + }, + tx + ); + } + + if (plan?.slug !== "enterprise" && plan?.identityLimit && plan.identitiesUsed >= plan.identityLimit) { + // limit imposed on number of identities allowed / number of identities used exceeds the number of identities allowed + throw new BadRequestError({ + name: "InviteUser", + message: "Failed to invite member due to member limit reached. Upgrade plan to invite more members." + }); + } + + await orgDAL.createMembership( + { + userId: inviteeUser.id, + inviteEmail: inviteeEmail, + orgId: org.id, + role: OrgMembershipRole.Admin, + status: inviteeUser.isAccepted ? OrgMembershipStatus.Accepted : OrgMembershipStatus.Invited, + isActive: true + }, + tx + ); + + users.push(inviteeUser); + } + + return { organization: org, users }; + }); + + await licenseService.updateSubscriptionOrgMemberCount(organization.id); + + await Promise.allSettled( + usersToEmail.map(async (user) => { + if (!user.email) return; + + if (user.isAccepted) { + return smtpService.sendMail({ + template: SmtpTemplates.OrgAssignment, + subjectLine: "You've been added to an Infisical organization", + recipients: [user.email], + substitutions: { + inviterFirstName: serverAdmin?.firstName, + inviterUsername: serverAdmin?.email, + organizationName: organization.name, + email: user.email, + organizationId: organization.id, + callback_url: `${appCfg.SITE_URL}/login?org_id=${organization.id}` + } + }); + } + + // new user, send regular invite + + const token = await tokenService.createTokenForUser({ + type: TokenType.TOKEN_EMAIL_ORG_INVITATION, + userId: user.id, + orgId: organization.id + }); + + return smtpService.sendMail({ + template: SmtpTemplates.OrgInvite, + subjectLine: "Infisical organization invitation", + recipients: [user.email], + substitutions: { + inviterFirstName: serverAdmin?.firstName, + inviterUsername: serverAdmin?.email, + organizationName: organization.name, + email: user.email, + organizationId: organization.id, + token, + callback_url: `${appCfg.SITE_URL}/signupinvite` + } + }); + }) + ); + + return organization; + }; + const deleteOrganization = async (organizationId: string) => { const organization = await orgDAL.deleteById(organizationId); return organization; @@ -763,6 +934,86 @@ export const superAdminServiceFactory = ({ return organizationMembership; }; + const joinOrganization = async (orgId: string, actor: OrgServiceActor) => { + const serverAdmin = await userDAL.findById(actor.id); + + if (!serverAdmin) { + throw new NotFoundError({ message: "Could not find server admin user" }); + } + + const org = await orgDAL.findById(orgId); + + if (!org) { + throw new NotFoundError({ message: `Could not organization with ID "${orgId}"` }); + } + + const existingOrgMembership = await orgMembershipDAL.findOne({ userId: serverAdmin.id, orgId }); + + if (existingOrgMembership) { + throw new BadRequestError({ message: `You are already a part of the organization with ID ${orgId}` }); + } + + const orgMembership = await orgDAL.createMembership({ + userId: serverAdmin.id, + orgId: org.id, + role: OrgMembershipRole.Admin, + status: OrgMembershipStatus.Accepted, + isActive: true + }); + + return orgMembership; + }; + + const resendOrgInvite = async ({ organizationId, membershipId }: TResendOrgInviteDTO, actor: OrgServiceActor) => { + const orgMembership = await orgMembershipDAL.findOne({ id: membershipId, orgId: organizationId }); + + if (!orgMembership) { + throw new NotFoundError({ name: "Organization Membership", message: "Organization membership not found" }); + } + + if (orgMembership.status === OrgMembershipStatus.Accepted) { + throw new BadRequestError({ + message: "This user has already accepted their invitation." + }); + } + + if (!orgMembership.userId) { + throw new NotFoundError({ message: "Cannot find user associated with Org Membership." }); + } + + if (!orgMembership.inviteEmail) { + throw new BadRequestError({ message: "No invite email associated with user." }); + } + + const org = await orgDAL.findOrgById(orgMembership.orgId); + + const appCfg = getConfig(); + const serverAdmin = await userDAL.findById(actor.id); + + const token = await tokenService.createTokenForUser({ + type: TokenType.TOKEN_EMAIL_ORG_INVITATION, + userId: orgMembership.userId, + orgId: orgMembership.orgId + }); + + await smtpService.sendMail({ + template: SmtpTemplates.OrgInvite, + subjectLine: "Infisical organization invitation", + recipients: [orgMembership.inviteEmail], + substitutions: { + inviterFirstName: serverAdmin?.firstName, + inviterUsername: serverAdmin?.email, + organizationName: org?.name, + email: orgMembership.inviteEmail, + organizationId: orgMembership.orgId, + token, + callback_url: `${appCfg.SITE_URL}/signupinvite` + } + }); + + return orgMembership; + }; + const getIdentities = async ({ offset, limit, searchTerm }: TAdminGetIdentitiesDTO) => { const identities = await identityDAL.getIdentitiesByFilter({ limit, @@ -901,6 +1152,9 @@ export const superAdminServiceFactory = ({ initializeEnvConfigSync, getEnvOverrides, getEnvOverridesOrganized, - deleteUsers + deleteUsers, + createOrganization, + joinOrganization, + resendOrgInvite }; }; diff --git a/backend/src/services/super-admin/super-admin-types.ts b/backend/src/services/super-admin/super-admin-types.ts index 919b0541c..6cfdd384d 100644 --- a/backend/src/services/super-admin/super-admin-types.ts +++ b/backend/src/services/super-admin/super-admin-types.ts @@ -34,6 +34,16 @@ export type TGetOrganizationsDTO = { searchTerm: string; }; +export type TCreateOrganizationDTO = { + name: string; + inviteAdminEmails: string[]; +}; + +export type TResendOrgInviteDTO = { + organizationId: string; + membershipId: string; +}; + export enum LoginMethod { EMAIL = "email", GOOGLE = "google", diff --git a/docs/.eslintrc.js b/docs/.eslintrc.js new file mode 100644 index 000000000..e44343a1c --- /dev/null +++ b/docs/.eslintrc.js @@ -0,0 +1,40 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + ], + parser: '@babel/eslint-parser', + parserOptions: { + ecmaVersion: 2021, + sourceType: 'module', + ecmaFeatures: { + jsx: true, + }, + requireConfigFile: false, + babelOptions: { + presets: ['@babel/preset-react'], + }, + }, + plugins: ['react'], + rules: { + 'react/jsx-uses-react': 'error', + 'react/jsx-uses-vars': 'error', + }, + settings: { + react: { + version: 'detect', + }, + }, + ignorePatterns: [ + 'node_modules/', + 'dist/', + 'build/', + '*.config.js', + ], +}; \ No newline at end of file diff --git a/docs/contributing/getting-started/overview.mdx b/docs/contributing/getting-started/overview.mdx index 79bd97c95..35912fc8c 100644 --- a/docs/contributing/getting-started/overview.mdx +++ b/docs/contributing/getting-started/overview.mdx @@ -10,7 +10,7 @@ should approach the development and contribution process. Infisical has two major code-bases. One for the platform code, and one for SDKs. The contribution process has some key differences between the two, so we've split the documentation into two sections: - The [Infisical Platform](https://github.com/Infisical/infisical), the Infisical platform itself. -- The [Infisical SDK](https://github.com/Infisical/sdk), the official Infisical client SDKs. +- The [Infisical SDK](https://infisical.com/docs/sdks/overview), the official Infisical client SDKs. diff --git a/docs/docs.json b/docs/docs.json index 336828000..9ea476487 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -98,6 +98,7 @@ { "group": "App Connections", "pages": [ + "integrations/app-connections", "integrations/app-connections/overview", { "group": "Connections", @@ -184,6 +185,7 @@ { "group": "User Authentication", "pages": [ + "integrations/user-authentication", "documentation/platform/auth-methods/email-password", { "group": "SSO", @@ -243,6 +245,7 @@ { "group": "Machine Identities", "pages": [ + "integrations/machine-authentication", "documentation/platform/identities/alicloud-auth", "documentation/platform/identities/aws-auth", "documentation/platform/identities/azure-auth", @@ -417,6 +420,7 @@ { "group": "Secret Rotation", "pages": [ + "integrations/secret-rotations", "documentation/platform/secret-rotation/overview", "documentation/platform/secret-rotation/auth0-client-secret", "documentation/platform/secret-rotation/aws-iam-user-secret", @@ -432,6 +436,7 @@ { "group": "Dynamic Secrets", "pages": [ + "integrations/dynamic-secrets", "documentation/platform/dynamic-secrets/overview", "documentation/platform/dynamic-secrets/aws-elasticache", "documentation/platform/dynamic-secrets/aws-iam", @@ -502,6 +507,7 @@ { "group": "Secret Syncs", "pages": [ + "integrations/secret-syncs", "integrations/secret-syncs/overview", { "group": "Syncs", @@ -607,6 +613,7 @@ { "group": "Framework Integrations", "pages": [ + "integrations/framework-integrations", "integrations/frameworks/spring-boot-maven", "integrations/frameworks/react", "integrations/frameworks/vue", @@ -2448,6 +2455,7 @@ "sdks/languages/cpp", "sdks/languages/rust", "sdks/languages/go", + "sdks/languages/php", "sdks/languages/ruby" ] } diff --git a/docs/documentation/platform/audit-log-streams/audit-log-streams.mdx b/docs/documentation/platform/audit-log-streams/audit-log-streams.mdx index 2ee4dff92..fab5f16b7 100644 --- a/docs/documentation/platform/audit-log-streams/audit-log-streams.mdx +++ b/docs/documentation/platform/audit-log-streams/audit-log-streams.mdx @@ -6,84 +6,133 @@ description: "Learn how to stream Infisical Audit Logs to external logging provi Audit log streams is a paid feature. - If you're using Infisical Cloud, then it is available under the **Enterprise Tier**. If you're self-hosting Infisical, - then you should contact team@infisical.com to purchase an enterprise license to use it. + If you're using Infisical Cloud, then it is available under the **Enterprise Tier**. If you're self-hosting Infisical, then you should contact team@infisical.com to purchase an enterprise license to use it. -Infisical Audit Log Streaming enables you to transmit your organization's Audit Logs to external logging providers for monitoring and analysis. - -The logs are formatted in JSON, requiring your logging provider to support JSON-based log parsing. - +Infisical Audit Log Streaming enables you to transmit your organization's audit logs to external logging providers for monitoring and analysis. ## Overview - - - ![stream create](/images/platform/audit-log-streams/stream-create.png) - - - ![stream create](/images/platform/audit-log-streams/stream-inputs.png) + + 1. Navigate to **Organization Settings** + 2. Select the **Audit Log Streams** tab + 3. Click **Add Log Stream** - Provide the following values - - The HTTPS endpoint URL of the logging provider that collects the JSON stream. - - - The HTTP headers for the logging provider for identification and authentication. - + ![stream create](/images/platform/audit-log-streams/stream-create.png) + + + If your log provider is included in this list, select it. Otherwise click on **Custom** to input your own Endpoint URL and headers. + + ![select provider](/images/platform/audit-log-streams/select-provider.png) + + + Depending on your chosen provider, you'll be asked to input different credentials. + + For **Custom**, you need to input an endpoint URL and headers. + + ![custom provider](/images/platform/audit-log-streams/custom-provider.png) + + Once you're finished, click **Create Log Stream**. + + + Your audit logs are now ready to be streamed. + + ![stream list](/images/platform/audit-log-streams/stream-list.png) -![stream listt](/images/platform/audit-log-streams/stream-list.png) -Your Audit Logs are now ready to be streamed. - ## Example Providers -### Better Stack + + + You can stream to Better Stack using a **Custom** log stream. - - - ![better stack connect source](/images/platform/audit-log-streams/betterstack-create-source.png) - - - - ![better stack connect](/images/platform/audit-log-streams/betterstack-source-details.png) + + + On Better Stack, select **Connect Source** and click **Create source** after providing a name. - 1. Copy the **endpoint** from Better Stack to the **Endpoint URL** field. - 3. Create a new header with key **Authorization** and set the value as **Bearer \**. - - + ![better stack connect source](/images/platform/audit-log-streams/betterstack-create-source.png) -### Datadog + Once your source is created, take note of the **endpoint** and **Source token** for the next step. - - - ![api key create](/images/platform/audit-log-streams/datadog-api-sidebar.png) - - - ![api key form](/images/platform/audit-log-streams/data-create-api-key.png) - ![api key form](/images/platform/audit-log-streams/data-dog-api-key.png) - - - ![datadog url](/images/platform/audit-log-streams/datadog-logging-endpoint.png) + ![better stack connect](/images/platform/audit-log-streams/betterstack-source-details.png) + + + On Infisical, create a new audit log stream and select the **Custom** option. - 1. Navigate to the [Datadog Send Logs API documentation](https://docs.datadoghq.com/api/latest/logs/?code-lang=curl&site=us5#send-logs). - 2. Pick your Datadog account region. - 3. Obtain your Datadog logging endpoint URL. - - - ![datadog api key details](/images/platform/audit-log-streams/datadog-source-details.png) + ![select custom](/images/platform/audit-log-streams/select-custom.png) - 1. Copy the **logging endpoint** from Datadog to the **Endpoint URL** field. - 2. Copy the **API Key** from previous step - 3. Create a new header with key **DD-API-KEY** and set the value as **API Key**. - - + 1. Fill in the endpoint URL with your Better Stack source endpoint + 2. Create a new header with key `Authorization` and set the value as `Bearer ` -## Audit Log Stream Data + ![custom provider](/images/platform/audit-log-streams/custom-provider.png) -Each log entry sent to the external logging provider will follow the same structure. + Once you're finished, click **Create Log Stream**. + + + + + You can stream to Datadog using the **Datadog** provider log stream. + + + + ![api key create](/images/platform/audit-log-streams/datadog-api-sidebar.png) + + + ![api key form](/images/platform/audit-log-streams/data-create-api-key.png) + ![api key form](/images/platform/audit-log-streams/data-dog-api-key.png) + + + On Infisical, create a new audit log stream and select the **Datadog** provider option. + + Input your **Datadog Region** and the **Token** obtained from step 2. + + ![datadog details](/images/platform/audit-log-streams/datadog-details.png) + + Once you're finished, click **Create Log Stream**. + + + + + You can stream to Splunk using the **Splunk** provider log stream. + + + + Navigate to **Settings** > **Data Inputs**. + + ![splunk data inputs](/images/platform/audit-log-streams/splunk-data-inputs.png) + + Click on **HTTP Event Collector**. + + ![splunk http collector](/images/platform/audit-log-streams/splunk-http-collector.png) + + Click on **New Token** in the top left. + + ![splunk new token](/images/platform/audit-log-streams/splunk-new-token.png) + + Provide a name and click **Next**. + + ![splunk name](/images/platform/audit-log-streams/splunk-name.png) + + On the next page, click **Review** and then **Submit** at the top. On the final page you'll see your token. + + Copy the **Token Value** and your Splunk hostname from the URL to be used for later. + + ![splunk credentials](/images/platform/audit-log-streams/splunk-credentials.png) + + + On Infisical, create a new audit log stream and select the **Splunk** provider option. + + Input your **Splunk Hostname** and the **Token** obtained from step 1. + + ![splunk details](/images/platform/audit-log-streams/splunk-details.png) + + Once you're finished, click **Create Log Stream**. + + + + ### Example Log Entry @@ -117,106 +166,109 @@ Each log entry sent to the external logging provider will follow the same struct ``` ### Audit Logs Structure + + + Streamed audit log structure **varies based on provider**, but they all share the audit log fields shown below. + + - The unique identifier for the log entry. + The unique identifier for the log entry. - The entity responsible for performing or causing the event; this can be a user or service. + The entity responsible for performing or causing the event; this can be a user or service. - The metadata associated with the actor. This varies based on the actor type. + The metadata associated with the actor. This varies based on the actor type. - - This metadata is present when the `actor` field is set to `user`. + + + This metadata is present when the `actor` field is set to `user`. - - The unique identifier for the actor. - - - The email address of the actor. - - - The username of the actor. - - + + The unique identifier for the actor. + + + The email address of the actor. + + + The username of the actor. + + + + This metadata is present when the `actor` field is set to `identity`. - - This metadata is present when the `actor` field is set to `identity`. + + The unique identifier for the identity. + + + The name of the identity. + + + + This metadata is present when the `actor` field is set to `service`. - - The unique identifier for the identity. - - - The name of the identity. - - - - - This metadata is present when the `actor` field is set to `service`. - - - The unique identifier for the service. - - - The name of the service. - - - - - - If the `actor` field is set to `platform`, `scimClient`, or `unknownUser`, the `actorMetadata` field will be an empty object. - + + The unique identifier for the service. + + + The name of the service. + + + + + If the `actor` field is set to `platform`, `scimClient`, or `unknownUser`, the `actorMetadata` field will be an empty object. + - The IP address of the actor. + The IP address of the actor. - The type of event that occurred. Below you can see a list of possible event types. More event types will be added in the future as we expand our audit logs further. + The type of event that occurred. Below you can see a list of possible event types. More event types will be added in the future as we expand our audit logs further. - `get-secrets`, `delete-secrets`, `get-secret`, `create-secret`, `update-secret`, `delete-secret`, `get-workspace-key`, `authorize-integration`, `update-integration-auth`, `unauthorize-integration`, `create-integration`, `delete-integration`, `add-trusted-ip`, `update-trusted-ip`, `delete-trusted-ip`, `create-service-token`, `delete-service-token`, `create-identity`, `update-identity`, `delete-identity`, `login-identity-universal-auth`, `add-identity-universal-auth`, `update-identity-universal-auth`, `get-identity-universal-auth`, `create-identity-universal-auth-client-secret`, `revoke-identity-universal-auth-client-secret`, `get-identity-universal-auth-client-secret`, `create-environment`, `update-environment`, `delete-environment`, `add-workspace-member`, `remove-workspace-member`, `create-folder`, `update-folder`, `delete-folder`, `create-webhook`, `update-webhook-status`, `delete-webhook`, `webhook-triggered`, `get-secret-imports`, `create-secret-import`, `update-secret-import`, `delete-secret-import`, `update-user-workspace-role`, `update-user-workspace-denied-permissions`, `create-certificate-authority`, `get-certificate-authority`, `update-certificate-authority`, `delete-certificate-authority`, `get-certificate-authority-csr`, `get-certificate-authority-cert`, `sign-intermediate`, `import-certificate-authority-cert`, `get-certificate-authority-crl`, `issue-cert`, `get-cert`, `delete-cert`, `revoke-cert`, `get-cert-body`, `create-pki-alert`, `get-pki-alert`, `update-pki-alert`, `delete-pki-alert`, `create-pki-collection`, `get-pki-collection`, `update-pki-collection`, `delete-pki-collection`, `get-pki-collection-items`, `add-pki-collection-item`, `delete-pki-collection-item`, `org-admin-accessed-project`, `create-certificate-template`, `update-certificate-template`, `delete-certificate-template`, `get-certificate-template`, `create-certificate-template-est-config`, `update-certificate-template-est-config`, `get-certificate-template-est-config`, `update-project-slack-config`, `get-project-slack-config`, `integration-synced`, `create-shared-secret`, `delete-shared-secret`, `read-shared-secret`. + `get-secrets`, `delete-secrets`, `get-secret`, `create-secret`, `update-secret`, `delete-secret`, `get-workspace-key`, `authorize-integration`, `update-integration-auth`, `unauthorize-integration`, `create-integration`, `delete-integration`, `add-trusted-ip`, `update-trusted-ip`, `delete-trusted-ip`, `create-service-token`, `delete-service-token`, `create-identity`, `update-identity`, `delete-identity`, `login-identity-universal-auth`, `add-identity-universal-auth`, `update-identity-universal-auth`, `get-identity-universal-auth`, `create-identity-universal-auth-client-secret`, `revoke-identity-universal-auth-client-secret`, `get-identity-universal-auth-client-secret`, `create-environment`, `update-environment`, `delete-environment`, `add-workspace-member`, `remove-workspace-member`, `create-folder`, `update-folder`, `delete-folder`, `create-webhook`, `update-webhook-status`, `delete-webhook`, `webhook-triggered`, `get-secret-imports`, `create-secret-import`, `update-secret-import`, `delete-secret-import`, `update-user-workspace-role`, `update-user-workspace-denied-permissions`, `create-certificate-authority`, `get-certificate-authority`, `update-certificate-authority`, `delete-certificate-authority`, `get-certificate-authority-csr`, `get-certificate-authority-cert`, `sign-intermediate`, `import-certificate-authority-cert`, `get-certificate-authority-crl`, `issue-cert`, `get-cert`, `delete-cert`, `revoke-cert`, `get-cert-body`, `create-pki-alert`, `get-pki-alert`, `update-pki-alert`, `delete-pki-alert`, `create-pki-collection`, `get-pki-collection`, `update-pki-collection`, `delete-pki-collection`, `get-pki-collection-items`, `add-pki-collection-item`, `delete-pki-collection-item`, `org-admin-accessed-project`, `create-certificate-template`, `update-certificate-template`, `delete-certificate-template`, `get-certificate-template`, `create-certificate-template-est-config`, `update-certificate-template-est-config`, `get-certificate-template-est-config`, `update-project-slack-config`, `get-project-slack-config`, `integration-synced`, `create-shared-secret`, `delete-shared-secret`, `read-shared-secret`. - The metadata associated with the event. This varies based on the event type. + The metadata associated with the event. This varies based on the event type. - The user agent of the actor, if applicable. + The user agent of the actor, if applicable. - The type of user agent. + The type of user agent. - The expiration date of the log entry. When this date is reached, the log entry will be deleted from Infisical. + The expiration date of the log entry. When this date is reached, the log entry will be deleted from Infisical. - The creation date of the log entry. + The creation date of the log entry. - The last update date of the log entry. This is unlikely to be out of sync with the `createdAt` field, as we do not update log entries after they've been created. + The last update date of the log entry. This is unlikely to be out of sync with the `createdAt` field, as we do not update log entries after they've been created. - The unique identifier for the organization where the event occurred. + The unique identifier for the organization where the event occurred. - The unique identifier for the project where the event occurred. + The unique identifier for the project where the event occurred. - The `projectId` field will only be present if the event occurred at the project level, not the organization level. + The `projectId` field will only be present if the event occurred at the project level, not the organization level. - The name of the project where the event occurred. + The name of the project where the event occurred. - The `projectName` field will only be present if the event occurred at the project level, not the organization level. + The `projectName` field will only be present if the event occurred at the project level, not the organization level. diff --git a/docs/documentation/platform/external-migrations/vault.mdx b/docs/documentation/platform/external-migrations/vault.mdx index ef139e8e4..8254e104f 100644 --- a/docs/documentation/platform/external-migrations/vault.mdx +++ b/docs/documentation/platform/external-migrations/vault.mdx @@ -8,12 +8,12 @@ description: "Learn how to migrate secrets from Vault to Infisical." Migrating from Vault Self-Hosted or Dedicated Vault is a straight forward process with our inbuilt migration option. In order to migrate from Vault, you'll need to provide Infisical an access token to your Vault instance. -Currently the Vault migration only supports migrating secrets from the KV v2 secrets engine. If you're using a different secrets engine, please open an issue on our [GitHub repository](https://github.com/infisical/infisical/issues). +Currently the Vault migration only supports migrating secrets from the KV V2 and V1 secrets engine. If you're using a different secrets engine, please open an issue on our [GitHub repository](https://github.com/infisical/infisical/issues). ### Prerequisites -- A Vault instance with the KV v2 secrets engine enabled. +- A Vault instance with the KV secret engine enabled. - An access token to your Vault instance. diff --git a/docs/documentation/platform/github-org-sync.mdx b/docs/documentation/platform/github-org-sync.mdx index 519e12db8..71dd9dbf6 100644 --- a/docs/documentation/platform/github-org-sync.mdx +++ b/docs/documentation/platform/github-org-sync.mdx @@ -45,6 +45,64 @@ Once configured, the GitHub Organization Synchronization feature functions as fo When a user logs in via the GitHub OAuth flow and selects the configured organization, the system will then automatically synchronize the teams they are a part of in GitHub with corresponding groups in Infisical. +## Manual Team Sync + +You can manually synchronize GitHub teams for all organization members who have previously logged in with GitHub. This bulk sync operation updates team memberships without requiring users to log in again. + + + + To perform manual syncs, you'll need to create a GitHub Personal Access Token with the appropriate permissions. GitHub offers two types of tokens: + + + + 1. Go to [GitHub Settings → Personal Access Tokens → Tokens (classic)](https://github.com/settings/tokens) + 2. Click **Generate new token** → **Generate new token (classic)** + 3. Give your token a descriptive name (e.g., "Infisical GitHub Sync") + 4. Set an appropriate expiration date + 5. Select the **read:org** scope - Required to read organization team information + 6. Click **Generate token** + 7. Copy the token immediately (you won't be able to see it again) + + ![Classic Token Creation](../../images/platform/external-syncs/github-classic-token.png) + + + 1. Go to [GitHub Settings → Personal Access Tokens → Fine-grained tokens](https://github.com/settings/personal-access-tokens/new) + 2. Click **Generate new token** + 3. Give your token a descriptive name (e.g., "Infisical GitHub Sync") + 4. Set an appropriate expiration date + 5. Select your organization under **Resource owner** + 6. Under **Organization permissions**, set **Members** to **Read** + 7. Click **Generate token** + 8. Copy the token immediately (you won't be able to see it again) + + ![Fine-grained Token Creation](../../images/platform/external-syncs/github-fine-grained-token.png) + + + + + + 1. Navigate to the **Single Sign-On (SSO)** page and select the **Provisioning** tab. + 2. Click the **Configure** button next to your GitHub Organization configuration. + 3. In the configuration modal, you'll find an optional **GitHub Access Token** field. + 4. Paste the token you generated in the previous step. + 5. Click **Update** to save the configuration. + + ![Token Configuration Modal](../../images/platform/external-syncs/github-token-config-modal.png) + + + + Once you have configured the GitHub access token: + + 1. Navigate to the **Single Sign-On (SSO)** page and select the **Provisioning** tab. + 2. You'll see a **Sync Now** section with a button to trigger the manual sync. + 3. Click **Sync Now** to synchronize GitHub teams for all organization members. + + ![Manual Sync Button](../../images/platform/external-syncs/github-manual-sync-button.png) + + The sync operation will process all organization members who have previously logged in with GitHub and update their team memberships accordingly. + + + ## Troubleshooting diff --git a/docs/documentation/platform/pki/acme-ca.mdx b/docs/documentation/platform/pki/acme-ca.mdx index 8b1fa10db..bf130da9e 100644 --- a/docs/documentation/platform/pki/acme-ca.mdx +++ b/docs/documentation/platform/pki/acme-ca.mdx @@ -147,6 +147,8 @@ In the following steps, we explore how to set up ACME Certificate Authority inte - **Directory URL**: Enter the ACME v2 directory URL for your chosen CA provider (e.g., `https://acme-v02.api.letsencrypt.org/directory` for Let's Encrypt). - **Account Email**: Email address to associate with your ACME account. This email will receive important notifications about your certificates. - **Enable Direct Issuance**: Toggle on to allow direct certificate issuance without requiring subscribers. + - **EAB Key Identifier (KID)**: (Optional) The Key Identifier (KID) provided by your ACME CA for External Account Binding (EAB). This is required by some ACME providers (e.g., ZeroSSL, DigiCert) to link your ACME account to an external account you've pre-registered with them. + - **EAB HMAC Key**: (Optional) The HMAC Key provided by your ACME CA for External Account Binding (EAB). This key is used in conjunction with the KID to prove ownership of the external account during ACME account registration. Finally, press **Create** to register the ACME CA with Infisical. @@ -277,6 +279,19 @@ Let's Encrypt is a free, automated, and open Certificate Authority that provides Always test your ACME integration using Let's Encrypt's staging environment first. This allows you to verify your DNS configuration and certificate issuance process without consuming your production rate limits. +## Example: DigiCert Integration + +DigiCert is a leading commercial Certificate Authority providing a wide range of trusted SSL/TLS certificates. Infisical can integrate with [DigiCert's ACME](https://docs.digicert.com/en/certcentral/certificate-tools/certificate-lifecycle-automation-guides/third-party-acme-integration/request-and-manage-certificates-with-acme.html) service to automate the provisioning and management of these certificates. + +- **Directory URL**: `https://acme.digicert.com/v2/acme/directory` +- **External Account Binding (EAB)**: Required. You will need a Key Identifier (KID) and HMAC Key from your DigiCert account to register the ACME CA in Infisical. +- **Certificate Validity**: Typically 90 days, with automatic renewal through Infisical. +- **Trusted By**: All major browsers and operating systems. + + + When integrating with DigiCert ACME, ensure you have obtained the necessary External Account Binding (EAB) Key Identifier (KID) and HMAC Key from your DigiCert account. + + ## FAQ diff --git a/docs/documentation/platform/secret-versioning.mdx b/docs/documentation/platform/secret-versioning.mdx index 6a0efb8b8..7ff8694f0 100644 --- a/docs/documentation/platform/secret-versioning.mdx +++ b/docs/documentation/platform/secret-versioning.mdx @@ -8,6 +8,7 @@ Every time a secret change is performed, a new version of the same secret is cre Such versions can be accessed visually by opening up the [secret sidebar](/documentation/platform/project#drawer) (as seen below) or [retrieved via API](/api-reference/endpoints/secrets/read) by specifying the `version` query parameter. +![secret versioning overview](../../images/platform/secret-versioning-overview.png) ![secret versioning](../../images/platform/secret-versioning.png) The secret versioning functionality is heavily connected to [Point-in-time Recovery](/documentation/platform/pit-recovery) of secrets in Infisical. diff --git a/docs/images/app-connections/hashicorp-vault/vault-infisical-connect-modal.png b/docs/images/app-connections/hashicorp-vault/vault-infisical-connect-modal.png index 872d11cab..ebe9fc2ad 100644 Binary files a/docs/images/app-connections/hashicorp-vault/vault-infisical-connect-modal.png and b/docs/images/app-connections/hashicorp-vault/vault-infisical-connect-modal.png differ diff --git a/docs/images/platform/audit-log-streams/custom-provider.png b/docs/images/platform/audit-log-streams/custom-provider.png new file mode 100644 index 000000000..e860e2e90 Binary files /dev/null and b/docs/images/platform/audit-log-streams/custom-provider.png differ diff --git a/docs/images/platform/audit-log-streams/datadog-details.png b/docs/images/platform/audit-log-streams/datadog-details.png new file mode 100644 index 000000000..29b1464be Binary files /dev/null and b/docs/images/platform/audit-log-streams/datadog-details.png differ diff --git a/docs/images/platform/audit-log-streams/datadog-logging-endpoint.png b/docs/images/platform/audit-log-streams/datadog-logging-endpoint.png deleted file mode 100644 index 7960b1145..000000000 Binary files a/docs/images/platform/audit-log-streams/datadog-logging-endpoint.png and /dev/null differ diff --git a/docs/images/platform/audit-log-streams/datadog-source-details.png b/docs/images/platform/audit-log-streams/datadog-source-details.png deleted file mode 100644 index 5ae25b0b3..000000000 Binary files a/docs/images/platform/audit-log-streams/datadog-source-details.png and /dev/null differ diff --git a/docs/images/platform/audit-log-streams/select-custom.png b/docs/images/platform/audit-log-streams/select-custom.png new file mode 100644 index 000000000..7a55b24a7 Binary files /dev/null and b/docs/images/platform/audit-log-streams/select-custom.png differ diff --git a/docs/images/platform/audit-log-streams/select-provider.png b/docs/images/platform/audit-log-streams/select-provider.png new file mode 100644 index 000000000..c289fd3af Binary files /dev/null and b/docs/images/platform/audit-log-streams/select-provider.png differ diff --git a/docs/images/platform/audit-log-streams/splunk-credentials.png b/docs/images/platform/audit-log-streams/splunk-credentials.png new file mode 100644 index 000000000..8b8624700 Binary files /dev/null and b/docs/images/platform/audit-log-streams/splunk-credentials.png differ diff --git a/docs/images/platform/audit-log-streams/splunk-data-inputs.png b/docs/images/platform/audit-log-streams/splunk-data-inputs.png new file mode 100644 index 000000000..3446f89f3 Binary files /dev/null and b/docs/images/platform/audit-log-streams/splunk-data-inputs.png differ diff --git a/docs/images/platform/audit-log-streams/splunk-details.png b/docs/images/platform/audit-log-streams/splunk-details.png new file mode 100644 index 000000000..b7ece41fc Binary files /dev/null and b/docs/images/platform/audit-log-streams/splunk-details.png differ diff --git a/docs/images/platform/audit-log-streams/splunk-http-collector.png b/docs/images/platform/audit-log-streams/splunk-http-collector.png new file mode 100644 index 000000000..d8090095c Binary files /dev/null and b/docs/images/platform/audit-log-streams/splunk-http-collector.png differ diff --git a/docs/images/platform/audit-log-streams/splunk-name.png b/docs/images/platform/audit-log-streams/splunk-name.png new file mode 100644 index 000000000..2c382539e Binary files /dev/null and b/docs/images/platform/audit-log-streams/splunk-name.png differ diff --git a/docs/images/platform/audit-log-streams/splunk-new-token.png b/docs/images/platform/audit-log-streams/splunk-new-token.png new file mode 100644 index 000000000..d4c53569d Binary files /dev/null and b/docs/images/platform/audit-log-streams/splunk-new-token.png differ diff --git a/docs/images/platform/audit-log-streams/stream-create.png b/docs/images/platform/audit-log-streams/stream-create.png index 949278e3d..1244fa558 100644 Binary files a/docs/images/platform/audit-log-streams/stream-create.png and b/docs/images/platform/audit-log-streams/stream-create.png differ diff --git a/docs/images/platform/audit-log-streams/stream-inputs.png b/docs/images/platform/audit-log-streams/stream-inputs.png deleted file mode 100644 index 6b9d7c57b..000000000 Binary files a/docs/images/platform/audit-log-streams/stream-inputs.png and /dev/null differ diff --git a/docs/images/platform/audit-log-streams/stream-list.png b/docs/images/platform/audit-log-streams/stream-list.png index c5cc5598b..ad355c3b0 100644 Binary files a/docs/images/platform/audit-log-streams/stream-list.png and b/docs/images/platform/audit-log-streams/stream-list.png differ diff --git a/docs/images/platform/external-syncs/github-classic-token.png b/docs/images/platform/external-syncs/github-classic-token.png new file mode 100644 index 000000000..f59c4f362 Binary files /dev/null and b/docs/images/platform/external-syncs/github-classic-token.png differ diff --git a/docs/images/platform/external-syncs/github-fine-grained-token.png b/docs/images/platform/external-syncs/github-fine-grained-token.png new file mode 100644 index 000000000..4924fedd0 Binary files /dev/null and b/docs/images/platform/external-syncs/github-fine-grained-token.png differ diff --git a/docs/images/platform/external-syncs/github-manual-sync-button.png b/docs/images/platform/external-syncs/github-manual-sync-button.png new file mode 100644 index 000000000..291b9f033 Binary files /dev/null and b/docs/images/platform/external-syncs/github-manual-sync-button.png differ diff --git a/docs/images/platform/external-syncs/github-org-sync-manual-sync-token.png b/docs/images/platform/external-syncs/github-org-sync-manual-sync-token.png new file mode 100644 index 000000000..5f81232cf Binary files /dev/null and b/docs/images/platform/external-syncs/github-org-sync-manual-sync-token.png differ diff --git a/docs/images/platform/external-syncs/github-org-sync-manual-sync.png b/docs/images/platform/external-syncs/github-org-sync-manual-sync.png new file mode 100644 index 000000000..3ff168629 Binary files /dev/null and b/docs/images/platform/external-syncs/github-org-sync-manual-sync.png differ diff --git a/docs/images/platform/external-syncs/github-token-config-modal.png b/docs/images/platform/external-syncs/github-token-config-modal.png new file mode 100644 index 000000000..106738d3c Binary files /dev/null and b/docs/images/platform/external-syncs/github-token-config-modal.png differ diff --git a/docs/images/platform/pki/ca/external-ca/create-external-ca-form.png b/docs/images/platform/pki/ca/external-ca/create-external-ca-form.png index ef572bfa7..bc32c23f6 100644 Binary files a/docs/images/platform/pki/ca/external-ca/create-external-ca-form.png and b/docs/images/platform/pki/ca/external-ca/create-external-ca-form.png differ diff --git a/docs/images/platform/secret-versioning-overview.png b/docs/images/platform/secret-versioning-overview.png new file mode 100644 index 000000000..94a50bd49 Binary files /dev/null and b/docs/images/platform/secret-versioning-overview.png differ diff --git a/docs/images/platform/secret-versioning.png b/docs/images/platform/secret-versioning.png index 593e8c96f..60b57cad9 100644 Binary files a/docs/images/platform/secret-versioning.png and b/docs/images/platform/secret-versioning.png differ diff --git a/docs/images/sdks/languages/php.svg b/docs/images/sdks/languages/php.svg new file mode 100644 index 000000000..37a5e6fe7 --- /dev/null +++ b/docs/images/sdks/languages/php.svg @@ -0,0 +1,96 @@ + + + Official PHP Logo + + + + image/svg+xml + + Official PHP Logo + + + Colin Viebrock + + + + + + + + + + + + Copyright Colin Viebrock 1997 - All rights reserved. + + + 1997 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/integrations/app-connections.mdx b/docs/integrations/app-connections.mdx new file mode 100644 index 000000000..9f4b5b80f --- /dev/null +++ b/docs/integrations/app-connections.mdx @@ -0,0 +1,8 @@ +--- +sidebarTitle: "Explore Options" +description: "Browse and search through all available app connections for Infisical." +--- + +import { AppConnectionsBrowser } from "/snippets/AppConnectionsBrowser.jsx"; + + \ No newline at end of file diff --git a/docs/integrations/app-connections/hashicorp-vault.mdx b/docs/integrations/app-connections/hashicorp-vault.mdx index 6e2ff68bf..c49b53ab8 100644 --- a/docs/integrations/app-connections/hashicorp-vault.mdx +++ b/docs/integrations/app-connections/hashicorp-vault.mdx @@ -149,6 +149,7 @@ Infisical supports two methods for connecting to Hashicorp Vault. - **Name**: The name of the connection being created. Must be slug-friendly. - **Description**: An optional description to provide details about this connection. + - **Gateway (optional):** The gateway connected to your private network. All requests made to your Vault instance will be made through the configured gateway. - **Instance URL**: The URL of your Hashicorp Vault instance. - **Namespace (optional)**: The namespace within your vault. Self-hosted and enterprise clusters may not use namespaces. - **Role ID**: The Role ID generated in the steps above. @@ -157,6 +158,7 @@ Infisical supports two methods for connecting to Hashicorp Vault. - **Name**: The name of the connection being created. Must be slug-friendly. - **Description**: An optional description to provide details about this connection. + - **Gateway (optional):** The gateway connected to your private network. All requests made to your Vault instance will be made through the configured gateway. - **Instance URL**: The URL of your Hashicorp Vault instance. - **Namespace (optional)**: The namespace within your vault. Self-hosted and enterprise clusters may not use namespaces. - **Access Token**: The Access Token generated in the steps above. diff --git a/docs/integrations/app-connections/overview.mdx b/docs/integrations/app-connections/overview.mdx index 92e6ab9d2..e698c4302 100644 --- a/docs/integrations/app-connections/overview.mdx +++ b/docs/integrations/app-connections/overview.mdx @@ -79,4 +79,4 @@ in the UI or by passing the associated `connectionId` when generating resources ## Platform Managed Credentials Some App Connections support the ability to have their credentials managed by Infisical. By enabling this option, -Infisical will modify the credentials to prevent external use of the configured access entity. \ No newline at end of file +Infisical will modify the credentials to prevent external use of the configured access entity. diff --git a/docs/integrations/dynamic-secrets.mdx b/docs/integrations/dynamic-secrets.mdx new file mode 100644 index 000000000..84ff43ab5 --- /dev/null +++ b/docs/integrations/dynamic-secrets.mdx @@ -0,0 +1,9 @@ +--- +title: "Dynamic Secrets" +sidebarTitle: "Explore Options" +description: "Browse and search through all available dynamic secrets for Infisical." +--- + +import { DynamicSecretsBrowser } from "/snippets/DynamicSecretsBrowser.jsx"; + + diff --git a/docs/integrations/framework-integrations.mdx b/docs/integrations/framework-integrations.mdx new file mode 100644 index 000000000..dfe78119a --- /dev/null +++ b/docs/integrations/framework-integrations.mdx @@ -0,0 +1,9 @@ +--- +title: "Framework Integrations" +sidebarTitle: "Explore Options" +description: "Browse and search through all available framework integrations for Infisical." +--- + +import { FrameworkIntegrationsBrowser } from "/snippets/FrameworkIntegrationsBrowser.jsx"; + + \ No newline at end of file diff --git a/docs/integrations/machine-authentication.mdx b/docs/integrations/machine-authentication.mdx new file mode 100644 index 000000000..da4ba1042 --- /dev/null +++ b/docs/integrations/machine-authentication.mdx @@ -0,0 +1,9 @@ +--- +title: "Machine Authentication" +sidebarTitle: "Explore Options" +description: "Browse and search through all available machine authentication methods for Infisical." +--- + +import { MachineAuthenticationBrowser } from "/snippets/MachineAuthenticationBrowser.jsx"; + + \ No newline at end of file diff --git a/docs/integrations/secret-rotations.mdx b/docs/integrations/secret-rotations.mdx new file mode 100644 index 000000000..00d1cbb6a --- /dev/null +++ b/docs/integrations/secret-rotations.mdx @@ -0,0 +1,8 @@ +--- +sidebarTitle: "Explore Options" +description: "Browse and search through all available secret rotations for Infisical." +--- + +import { RotationsBrowser } from "/snippets/RotationsBrowser.jsx"; + + \ No newline at end of file diff --git a/docs/integrations/secret-syncs.mdx b/docs/integrations/secret-syncs.mdx new file mode 100644 index 000000000..6d71517f1 --- /dev/null +++ b/docs/integrations/secret-syncs.mdx @@ -0,0 +1,8 @@ +--- +sidebarTitle: "Explore Options" +description: "Browse and search through all available secret syncs for Infisical." +--- + +import { SecretSyncsBrowser } from "/snippets/SecretSyncsBrowser.jsx"; + + \ No newline at end of file diff --git a/docs/integrations/user-authentication.mdx b/docs/integrations/user-authentication.mdx new file mode 100644 index 000000000..2b33fd7ba --- /dev/null +++ b/docs/integrations/user-authentication.mdx @@ -0,0 +1,9 @@ +--- +title: "User Authentication" +sidebarTitle: "Explore Options" +description: "Browse and search through all available user authentication methods for Infisical." +--- + +import { UserAuthenticationBrowser } from "/snippets/UserAuthenticationBrowser.jsx"; + + \ No newline at end of file diff --git a/docs/sdks/languages/php.mdx b/docs/sdks/languages/php.mdx new file mode 100644 index 000000000..e3db5e5cd --- /dev/null +++ b/docs/sdks/languages/php.mdx @@ -0,0 +1,204 @@ +--- +title: "Infisical PHP SDK" +sidebarTitle: "PHP" +icon: "/images/sdks/languages/php.svg" +--- + +If you're working with PHP, the official Infisical PHP SDK package is the easiest way to fetch and work with secrets for your application. + +## Installation + +```bash +composer require infisical/php-sdk +``` + +## Getting Started + +```php +auth()->universalAuth()->login( + "your-machine-identity-client-id", + "your-machine-identity-client-secret" +); + +// List secrets +$params = new \Infisical\SDK\Models\ListSecretsParameters( + environment: "dev", + secretPath: "/", + projectId: "your-project-id" +); + +$secrets = $sdk->secrets()->list($params); +echo "Fetched secrets: " . count($secrets) . "\n"; +``` + +## Core Methods + +The SDK methods are organized into the following high-level categories: + +1. `auth`: Handles authentication methods. +2. `secrets`: Manages CRUD operations for secrets. + +### `Auth` + +The `auth` component provides methods for authentication: + +#### Universal Auth + +**Authenticating** +```php +$response = $sdk->auth()->universal_auth()->login( + "your-machine-identity-client-id", + "your-machine-identity-client-secret" +); +``` + +**Parameters:** +- `clientId` (string): The client ID of your Machine Identity. +- `clientSecret` (string): The client secret of your Machine Identity. + + + We do not recommend hardcoding your [Machine Identity Tokens](/documentation/platform/identities/overview). Setting them as environment variables would be best. + + +### `Secrets` + +This sub-class handles operations related to secrets: + +#### List Secrets + +```php +use Infisical\SDK\Models\ListSecretsParameters; + +$params = new ListSecretsParameters( + environment: "dev", + secretPath: "/", + projectId: "your-project-id", + tagSlugs: ["tag1", "tag2"], // Optional + recursive: true, // Optional + expandSecretReferences: true, // Optional + attachToProcessEnv: false, // Optional + skipUniqueValidation: false // Optional +); + +$secrets = $sdk->secrets()->list($params); +``` + +**Parameters:** +- `environment` (string): The environment in which to list secrets (e.g., "dev"). +- `projectId` (string): The ID of your project. +- `secretPath` (string, optional): The path to the secrets. +- `tagSlugs` (array, optional): Tags to filter secrets. +- `recursive` (bool, optional): Whether to list secrets recursively. +- `expandSecretReferences` (bool, optional): Whether to expand secret references. +- `attachToProcessEnv` (bool, optional): Whether to attach secrets to process environment variables. +- `skipUniqueValidation` (bool, optional): Whether to skip unique validation. + +**Returns:** +- `Secret[]`: An array of secret objects. + +#### Create Secret + +```php +use Infisical\SDK\Models\CreateSecretParameters; + +$params = new CreateSecretParameters( + secretKey: "SECRET_NAME", + secretValue: "SECRET_VALUE", + environment: "dev", + secretPath: "/", + projectId: "your-project-id" +); + +$createdSecret = $sdk->secrets()->create($params); +``` + +**Parameters:** +- `secretKey` (string): The name of the secret to create. +- `secretValue` (string): The value of the secret. +- `environment` (string): The environment in which to create the secret. +- `projectId` (string): The ID of your project. +- `secretPath` (string, optional): The path to the secret. + +**Returns:** +- `Secret`: The created secret object. + +#### Get Secret + +```php +use Infisical\SDK\Models\GetSecretParameters; + +$params = new GetSecretParameters( + secretKey: "SECRET_NAME", + environment: "dev", + secretPath: "/", + projectId: "your-project-id" +); + +$secret = $sdk->secrets()->get($params); +``` + +**Parameters:** +- `secretKey` (string): The name of the secret to retrieve. +- `environment` (string): The environment in which to retrieve the secret. +- `projectId` (string): The ID of your project. +- `secretPath` (string, optional): The path to the secret. + +**Returns:** +- `Secret`: The retrieved secret object. + +#### Update Secret + +```php +use Infisical\SDK\Models\UpdateSecretParameters; + +$params = new UpdateSecretParameters( + secretKey: "SECRET_NAME", + newSecretValue: "UPDATED_SECRET_VALUE", + environment: "dev", + secretPath: "/", + projectId: "your-project-id" +); + +$updatedSecret = $sdk->secrets()->update($params); +``` + +**Parameters:** +- `secretKey` (string): The name of the secret to update. +- `newSecretValue` (string): The new value of the secret. +- `environment` (string): The environment in which to update the secret. +- `projectId` (string): The ID of your project. +- `secretPath` (string, optional): The path to the secret. + +**Returns:** +- `Secret`: The updated secret object. + +#### Delete Secret + +```php +use Infisical\SDK\Models\DeleteSecretParameters; + +$params = new DeleteSecretParameters( + secretKey: "SECRET_NAME", + environment: "dev", + secretPath: "/", + projectId: "your-project-id" +); + +$deletedSecret = $sdk->secrets()->delete($params); +``` + +**Parameters:** +- `secretKey` (string): The name of the secret to delete. +- `environment` (string): The environment in which to delete the secret. +- `projectId` (string): The ID of your project. +- `secretPath` (string, optional): The path to the secret. + +**Returns:** +- `Secret`: The deleted secret object. \ No newline at end of file diff --git a/docs/sdks/overview.mdx b/docs/sdks/overview.mdx index 0b6949108..f9a8fcac3 100644 --- a/docs/sdks/overview.mdx +++ b/docs/sdks/overview.mdx @@ -32,6 +32,9 @@ From local development to production, Infisical SDKs provide the easiest way for Manage secrets for your Go application on demand + + + Manage secrets for your PHP application on demand Manage secrets for your Ruby application on demand diff --git a/docs/self-hosting/configuration/envars.mdx b/docs/self-hosting/configuration/envars.mdx index 53adf95a4..6f3f01933 100644 --- a/docs/self-hosting/configuration/envars.mdx +++ b/docs/self-hosting/configuration/envars.mdx @@ -142,7 +142,7 @@ DB_READ_REPLICAS=[{"DB_CONNECTION_URI":""}] Redis is used for caching and background tasks. You can use either a standalone Redis instance or a Redis Sentinel setup. - + Redis connection string. @@ -173,6 +173,29 @@ Redis is used for caching and background tasks. You can use either a standalone Authentication password for Redis Sentinel + + Authentication username for Redis Node + + + Authentication password for Redis Node + + + + + Comma-separated list of Redis Cluster host:port pairs. ``` + 192.168.65.254:26379,192.168.65.254:26380 ``` + + + Authentication username for Redis Node + + + Authentication password for Redis Node + diff --git a/docs/snippets/AppConnectionsBrowser.jsx b/docs/snippets/AppConnectionsBrowser.jsx new file mode 100644 index 000000000..72ad40cff --- /dev/null +++ b/docs/snippets/AppConnectionsBrowser.jsx @@ -0,0 +1,155 @@ +import React, { useState, useMemo } from 'react'; + +export const AppConnectionsBrowser = () => { + const [searchTerm, setSearchTerm] = useState(''); + const [selectedCategory, setSelectedCategory] = useState('All'); + + const categories = ['All', 'Cloud Providers', 'Databases', 'CI/CD', 'Monitoring', 'Directory Services', 'Identity & Auth', 'Data Analytics', 'Hosting', 'DevOps Tools', 'Security']; + + const connections = [ + {"name": "AWS", "slug": "aws", "path": "/integrations/app-connections/aws", "description": "Learn how to connect your AWS applications to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "Azure Key Vault", "slug": "azure-key-vault", "path": "/integrations/app-connections/azure-key-vault", "description": "Learn how to connect your Azure Key Vault to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "Azure App Configuration", "slug": "azure-app-configuration", "path": "/integrations/app-connections/azure-app-configuration", "description": "Learn how to connect your Azure App Configuration to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "Azure Client Secrets", "slug": "azure-client-secrets", "path": "/integrations/app-connections/azure-client-secrets", "description": "Learn how to connect your Azure Client Secrets to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "Azure DevOps", "slug": "azure-devops", "path": "/integrations/app-connections/azure-devops", "description": "Learn how to connect your Azure DevOps to pull secrets from Infisical.", "category": "CI/CD"}, + {"name": "Azure ADCS", "slug": "azure-adcs", "path": "/integrations/app-connections/azure-adcs", "description": "Learn how to connect your Azure ADCS to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "GCP", "slug": "gcp", "path": "/integrations/app-connections/gcp", "description": "Learn how to connect your GCP applications to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "HashiCorp Vault", "slug": "hashicorp-vault", "path": "/integrations/app-connections/hashicorp-vault", "description": "Learn how to connect your HashiCorp Vault to pull secrets from Infisical.", "category": "Security"}, + {"name": "1Password", "slug": "1password", "path": "/integrations/app-connections/1password", "description": "Learn how to connect your 1Password to pull secrets from Infisical.", "category": "Security"}, + {"name": "Vercel", "slug": "vercel", "path": "/integrations/app-connections/vercel", "description": "Learn how to connect your Vercel application to pull secrets from Infisical.", "category": "Hosting"}, + {"name": "Netlify", "slug": "netlify", "path": "/integrations/app-connections/netlify", "description": "Learn how to connect your Netlify application to pull secrets from Infisical.", "category": "Hosting"}, + {"name": "Railway", "slug": "railway", "path": "/integrations/app-connections/railway", "description": "Learn how to connect your Railway application to pull secrets from Infisical.", "category": "Hosting"}, + {"name": "Fly.io", "slug": "flyio", "path": "/integrations/app-connections/flyio", "description": "Learn how to connect your Fly.io application to pull secrets from Infisical.", "category": "Hosting"}, + {"name": "Render", "slug": "render", "path": "/integrations/app-connections/render", "description": "Learn how to connect your Render application to pull secrets from Infisical.", "category": "Hosting"}, + {"name": "Heroku", "slug": "heroku", "path": "/integrations/app-connections/heroku", "description": "Learn how to connect your Heroku application to pull secrets from Infisical.", "category": "Hosting"}, + {"name": "DigitalOcean", "slug": "digital-ocean", "path": "/integrations/app-connections/digital-ocean", "description": "Learn how to connect your DigitalOcean application to pull secrets from Infisical.", "category": "Hosting"}, + {"name": "Supabase", "slug": "supabase", "path": "/integrations/app-connections/supabase", "description": "Learn how to connect your Supabase application to pull secrets from Infisical.", "category": "Databases"}, + {"name": "Checkly", "slug": "checkly", "path": "/integrations/app-connections/checkly", "description": "Learn how to connect your Checkly application to pull secrets from Infisical.", "category": "Monitoring"}, + {"name": "GitHub", "slug": "github", "path": "/integrations/app-connections/github", "description": "Learn how to connect your GitHub application to pull secrets from Infisical.", "category": "CI/CD"}, + {"name": "GitHub Radar", "slug": "github-radar", "path": "/integrations/app-connections/github-radar", "description": "Learn how to connect your GitHub Radar to pull secrets from Infisical.", "category": "CI/CD"}, + {"name": "GitLab", "slug": "gitlab", "path": "/integrations/app-connections/gitlab", "description": "Learn how to connect your GitLab application to pull secrets from Infisical.", "category": "CI/CD"}, + {"name": "TeamCity", "slug": "teamcity", "path": "/integrations/app-connections/teamcity", "description": "Learn how to connect your TeamCity to pull secrets from Infisical.", "category": "CI/CD"}, + {"name": "Bitbucket", "slug": "bitbucket", "path": "/integrations/app-connections/bitbucket", "description": "Learn how to connect your Bitbucket to pull secrets from Infisical.", "category": "CI/CD"}, + {"name": "Terraform Cloud", "slug": "terraform-cloud", "path": "/integrations/app-connections/terraform-cloud", "description": "Learn how to connect your Terraform Cloud to pull secrets from Infisical.", "category": "DevOps Tools"}, + {"name": "Cloudflare", "slug": "cloudflare", "path": "/integrations/app-connections/cloudflare", "description": "Learn how to connect your Cloudflare application to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "Databricks", "slug": "databricks", "path": "/integrations/app-connections/databricks", "description": "Learn how to connect your Databricks to pull secrets from Infisical.", "category": "Data Analytics"}, + {"name": "Windmill", "slug": "windmill", "path": "/integrations/app-connections/windmill", "description": "Learn how to connect your Windmill to pull secrets from Infisical.", "category": "DevOps Tools"}, + {"name": "Camunda", "slug": "camunda", "path": "/integrations/app-connections/camunda", "description": "Learn how to connect your Camunda to pull secrets from Infisical.", "category": "DevOps Tools"}, + {"name": "Humanitec", "slug": "humanitec", "path": "/integrations/app-connections/humanitec", "description": "Learn how to connect your Humanitec to pull secrets from Infisical.", "category": "DevOps Tools"}, + {"name": "OCI", "slug": "oci", "path": "/integrations/app-connections/oci", "description": "Learn how to connect your OCI applications to pull secrets from Infisical.", "category": "Cloud Providers"}, + {"name": "Zabbix", "slug": "zabbix", "path": "/integrations/app-connections/zabbix", "description": "Learn how to connect your Zabbix to pull secrets from Infisical.", "category": "Monitoring"}, + {"name": "MySQL", "slug": "mysql", "path": "/integrations/app-connections/mysql", "description": "Learn how to connect your MySQL database to pull secrets from Infisical.", "category": "Databases"}, + {"name": "PostgreSQL", "slug": "postgres", "path": "/integrations/app-connections/postgres", "description": "Learn how to connect your PostgreSQL database to pull secrets from Infisical.", "category": "Databases"}, + {"name": "Microsoft SQL Server", "slug": "mssql", "path": "/integrations/app-connections/mssql", "description": "Learn how to connect your SQL Server database to pull secrets from Infisical.", "category": "Databases"}, + {"name": "Oracle Database", "slug": "oracledb", "path": "/integrations/app-connections/oracledb", "description": "Learn how to connect your Oracle database to pull secrets from Infisical.", "category": "Databases"}, + {"name": "LDAP", "slug": "ldap", "path": "/integrations/app-connections/ldap", "description": "Learn how to connect your LDAP to pull secrets from Infisical.", "category": "Directory Services"}, + {"name": "Auth0", "slug": "auth0", "path": "/integrations/app-connections/auth0", "description": "Learn how to connect your Auth0 to pull secrets from Infisical.", "category": "Identity & Auth"}, + {"name": "Okta", "slug": "okta", "path": "/integrations/app-connections/okta", "description": "Learn how to connect your Okta to pull secrets from Infisical.", "category": "Identity & Auth"} + ].sort(function(a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + + const filteredConnections = useMemo(() => { + let filtered = connections; + + if (selectedCategory !== 'All') { + filtered = filtered.filter(connection => connection.category === selectedCategory); + } + + if (searchTerm) { + filtered = filtered.filter(connection => + connection.name.toLowerCase().includes(searchTerm.toLowerCase()) || + connection.description.toLowerCase().includes(searchTerm.toLowerCase()) || + connection.category.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return filtered; + }, [searchTerm, selectedCategory]); + + return ( +
+ {/* Search Bar */} +
+
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+
+ + {/* Category Filter */} +
+
+ {categories.map(category => ( + + ))} +
+
+ + {/* Results Count */} +
+

+ {filteredConnections.length} app connection{filteredConnections.length !== 1 ? 's' : ''} found + {selectedCategory !== 'All' && ` in ${selectedCategory}`} + {searchTerm && ` for "${searchTerm}"`} +

+
+ + {/* Connections List */} + {filteredConnections.length > 0 ? ( + + ) : ( +
+
+

No app connections found matching your criteria

+ {searchTerm && ( +

Try adjusting your search terms or filters

+ )} +
+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/docs/snippets/DynamicSecretsBrowser.jsx b/docs/snippets/DynamicSecretsBrowser.jsx new file mode 100644 index 000000000..6438deea0 --- /dev/null +++ b/docs/snippets/DynamicSecretsBrowser.jsx @@ -0,0 +1,140 @@ +import React, { useState, useMemo } from 'react'; + +export const DynamicSecretsBrowser = () => { + const [searchTerm, setSearchTerm] = useState(''); + const [selectedCategory, setSelectedCategory] = useState('All'); + + const categories = ['All', 'Databases', 'Cloud Providers', 'Message Queues', 'Caches', 'Directory Services', 'CI/CD', 'Container Orchestration', 'Authentication']; + + const dynamicSecrets = [ + {"name": "AWS IAM", "slug": "aws-iam", "path": "/documentation/platform/dynamic-secrets/aws-iam", "description": "Learn how to generate dynamic AWS IAM credentials on-demand.", "category": "Cloud Providers"}, + {"name": "AWS ElastiCache", "slug": "aws-elasticache", "path": "/documentation/platform/dynamic-secrets/aws-elasticache", "description": "Learn how to generate dynamic AWS ElastiCache credentials on-demand.", "category": "Caches"}, + {"name": "Azure Entra ID", "slug": "azure-entra-id", "path": "/documentation/platform/dynamic-secrets/azure-entra-id", "description": "Learn how to generate dynamic Azure Entra ID credentials on-demand.", "category": "Cloud Providers"}, + {"name": "GCP IAM", "slug": "gcp-iam", "path": "/documentation/platform/dynamic-secrets/gcp-iam", "description": "Learn how to generate dynamic GCP IAM credentials on-demand.", "category": "Cloud Providers"}, + {"name": "Cassandra", "slug": "cassandra", "path": "/documentation/platform/dynamic-secrets/cassandra", "description": "Learn how to generate dynamic Cassandra database credentials on-demand.", "category": "Databases"}, + {"name": "Couchbase", "slug": "couchbase", "path": "/documentation/platform/dynamic-secrets/couchbase", "description": "Learn how to generate dynamic Couchbase database credentials on-demand.", "category": "Databases"}, + {"name": "MongoDB", "slug": "mongodb", "path": "/documentation/platform/dynamic-secrets/mongo-db", "description": "Learn how to generate dynamic MongoDB database credentials on-demand.", "category": "Databases"}, + {"name": "MongoDB Atlas", "slug": "mongodb-atlas", "path": "/documentation/platform/dynamic-secrets/mongo-atlas", "description": "Learn how to generate dynamic MongoDB Atlas database credentials on-demand.", "category": "Databases"}, + {"name": "MySQL", "slug": "mysql", "path": "/documentation/platform/dynamic-secrets/mysql", "description": "Learn how to generate dynamic MySQL database credentials on-demand.", "category": "Databases"}, + {"name": "PostgreSQL", "slug": "postgresql", "path": "/documentation/platform/dynamic-secrets/postgresql", "description": "Learn how to generate dynamic PostgreSQL database credentials on-demand.", "category": "Databases"}, + {"name": "Microsoft SQL Server", "slug": "mssql", "path": "/documentation/platform/dynamic-secrets/mssql", "description": "Learn how to generate dynamic Microsoft SQL Server credentials on-demand.", "category": "Databases"}, + {"name": "Oracle Database", "slug": "oracle", "path": "/documentation/platform/dynamic-secrets/oracle", "description": "Learn how to generate dynamic Oracle Database credentials on-demand.", "category": "Databases"}, + {"name": "SAP ASE", "slug": "sap-ase", "path": "/documentation/platform/dynamic-secrets/sap-ase", "description": "Learn how to generate dynamic SAP ASE database credentials on-demand.", "category": "Databases"}, + {"name": "SAP HANA", "slug": "sap-hana", "path": "/documentation/platform/dynamic-secrets/sap-hana", "description": "Learn how to generate dynamic SAP HANA database credentials on-demand.", "category": "Databases"}, + {"name": "Snowflake", "slug": "snowflake", "path": "/documentation/platform/dynamic-secrets/snowflake", "description": "Learn how to generate dynamic Snowflake database credentials on-demand.", "category": "Databases"}, + {"name": "Vertica", "slug": "vertica", "path": "/documentation/platform/dynamic-secrets/vertica", "description": "Learn how to generate dynamic Vertica database credentials on-demand.", "category": "Databases"}, + {"name": "Redis", "slug": "redis", "path": "/documentation/platform/dynamic-secrets/redis", "description": "Learn how to generate dynamic Redis credentials on-demand.", "category": "Caches"}, + {"name": "ElasticSearch", "slug": "elasticsearch", "path": "/documentation/platform/dynamic-secrets/elastic-search", "description": "Learn how to generate dynamic ElasticSearch credentials on-demand.", "category": "Databases"}, + {"name": "RabbitMQ", "slug": "rabbitmq", "path": "/documentation/platform/dynamic-secrets/rabbit-mq", "description": "Learn how to generate dynamic RabbitMQ credentials on-demand.", "category": "Message Queues"}, + {"name": "LDAP", "slug": "ldap", "path": "/documentation/platform/dynamic-secrets/ldap", "description": "Learn how to generate dynamic LDAP credentials on-demand.", "category": "Directory Services"}, + {"name": "GitHub", "slug": "github", "path": "/documentation/platform/dynamic-secrets/github", "description": "Learn how to generate dynamic GitHub credentials on-demand.", "category": "CI/CD"}, + {"name": "Kubernetes", "slug": "kubernetes", "path": "/documentation/platform/dynamic-secrets/kubernetes", "description": "Learn how to generate dynamic Kubernetes credentials on-demand.", "category": "Container Orchestration"}, + {"name": "TOTP", "slug": "totp", "path": "/documentation/platform/dynamic-secrets/totp", "description": "Learn how to generate dynamic TOTP codes on-demand.", "category": "Authentication"} + ].sort(function(a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + + const filteredDynamicSecrets = useMemo(() => { + let filtered = dynamicSecrets; + + if (selectedCategory !== 'All') { + filtered = filtered.filter(secret => secret.category === selectedCategory); + } + + if (searchTerm) { + filtered = filtered.filter(secret => + secret.name.toLowerCase().includes(searchTerm.toLowerCase()) || + secret.description.toLowerCase().includes(searchTerm.toLowerCase()) || + secret.category.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return filtered; + }, [searchTerm, selectedCategory]); + + return ( +
+ {/* Search Bar */} +
+
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+
+ + {/* Category Filter */} +
+
+ {categories.map(category => ( + + ))} +
+
+ + {/* Results Count */} +
+

+ {filteredDynamicSecrets.length} dynamic secret{filteredDynamicSecrets.length !== 1 ? 's' : ''} found + {selectedCategory !== 'All' && ` in ${selectedCategory}`} + {searchTerm && ` for "${searchTerm}"`} +

+
+ + {/* Dynamic Secrets List */} + {filteredDynamicSecrets.length > 0 ? ( +
+ {filteredDynamicSecrets.map((secret, index) => ( + +
+
+

+ {secret.name} +

+ + {secret.category} + +
+

+ {secret.description} +

+
+
+ ))} +
+ ) : ( +
+
+

No dynamic secrets found matching your criteria

+ {searchTerm && ( +

Try adjusting your search terms or filters

+ )} +
+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/docs/snippets/FrameworkIntegrationsBrowser.jsx b/docs/snippets/FrameworkIntegrationsBrowser.jsx new file mode 100644 index 000000000..f85da41ed --- /dev/null +++ b/docs/snippets/FrameworkIntegrationsBrowser.jsx @@ -0,0 +1,101 @@ +import React, { useState, useMemo } from 'react'; + +export const FrameworkIntegrationsBrowser = () => { + const [searchTerm, setSearchTerm] = useState(''); + + const integrations = [ + {"name": "React", "slug": "react", "path": "/integrations/frameworks/react", "description": "Learn how to integrate Infisical with React applications for secure secret management.", "category": "Web Frameworks"}, + {"name": "Next.js", "slug": "nextjs", "path": "/integrations/frameworks/nextjs", "description": "Learn how to integrate Infisical with Next.js applications.", "category": "Web Frameworks"}, + {"name": "Vue", "slug": "vuejs", "path": "/integrations/frameworks/vue", "description": "Learn how to integrate Infisical with Vue.js applications.", "category": "Web Frameworks"}, + {"name": "Nuxt", "slug": "nuxtjs", "path": "/integrations/frameworks/nuxt", "description": "Learn how to integrate Infisical with Nuxt.js applications.", "category": "Web Frameworks"}, + {"name": "SvelteKit", "slug": "sveltekit", "path": "/integrations/frameworks/sveltekit", "description": "Learn how to integrate Infisical with SvelteKit applications.", "category": "Web Frameworks"}, + {"name": "Express, Fastify, Koa", "slug": "express", "path": "/integrations/frameworks/express", "description": "Learn how to integrate Infisical with Express.js backend applications.", "category": "Web Frameworks"}, + {"name": "NestJS", "slug": "nestjs", "path": "/integrations/frameworks/nestjs", "description": "Learn how to integrate Infisical with NestJS applications.", "category": "Web Frameworks"}, + {"name": "Django", "slug": "django", "path": "/integrations/frameworks/django", "description": "Learn how to integrate Infisical with Django applications.", "category": "Web Frameworks"}, + {"name": "Flask", "slug": "flask", "path": "/integrations/frameworks/flask", "description": "Learn how to integrate Infisical with Flask applications.", "category": "Web Frameworks"}, + {"name": "Ruby on Rails", "slug": "rails", "path": "/integrations/frameworks/rails", "description": "Learn how to integrate Infisical with Ruby on Rails applications.", "category": "Web Frameworks"}, + {"name": "Spring Boot", "slug": "spring-boot-maven", "path": "/integrations/frameworks/spring-boot-maven", "description": "Learn how to integrate Infisical with Spring Boot applications.", "category": "Web Frameworks"}, + {"name": "Laravel", "slug": "laravel", "path": "/integrations/frameworks/laravel", "description": "Learn how to integrate Infisical with Laravel applications.", "category": "Web Frameworks"}, + {"name": ".NET", "slug": "dotnet", "path": "/integrations/frameworks/dotnet", "description": "Learn how to integrate Infisical with .NET applications.", "category": "Web Frameworks"}, + {"name": "Fiber", "slug": "fiber", "path": "/integrations/frameworks/fiber", "description": "Learn how to integrate Infisical with Fiber (Go) framework.", "category": "Web Frameworks"}, + {"name": "Gatsby", "slug": "gatsby", "path": "/integrations/frameworks/gatsby", "description": "Learn how to integrate Infisical with Gatsby applications.", "category": "Web Frameworks"}, + {"name": "Remix", "slug": "remix", "path": "/integrations/frameworks/remix", "description": "Learn how to integrate Infisical with Remix applications.", "category": "Web Frameworks"}, + {"name": "Vite", "slug": "vite", "path": "/integrations/frameworks/vite", "description": "Learn how to integrate Infisical with Vite applications.", "category": "Web Frameworks"}, + {"name": "AB Initio", "slug": "ab-initio", "path": "/integrations/frameworks/ab-initio", "description": "Learn how to integrate Infisical with AB Initio applications.", "category": "Web Frameworks"} + ].sort(function(a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + + const filteredIntegrations = useMemo(() => { + if (searchTerm) { + return integrations.filter(integration => + integration.name.toLowerCase().includes(searchTerm.toLowerCase()) || + integration.description.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + return integrations; + }, [searchTerm]); + + return ( +
+ {/* Search Bar */} +
+
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+
+ + {/* Results Count */} +
+

+ {filteredIntegrations.length} framework integration{filteredIntegrations.length !== 1 ? 's' : ''} found + {searchTerm && ` for "${searchTerm}"`} +

+
+ + {/* Integrations List */} + {filteredIntegrations.length > 0 ? ( +
+ {filteredIntegrations.map((integration, index) => ( + +
+
+

+ {integration.name} +

+
+

+ {integration.description} +

+
+
+ ))} +
+ ) : ( +
+
+

No framework integrations found matching your criteria

+ {searchTerm && ( +

Try adjusting your search terms or filters

+ )} +
+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/docs/snippets/MachineAuthenticationBrowser.jsx b/docs/snippets/MachineAuthenticationBrowser.jsx new file mode 100644 index 000000000..521493846 --- /dev/null +++ b/docs/snippets/MachineAuthenticationBrowser.jsx @@ -0,0 +1,136 @@ +import React, { useState, useMemo } from 'react'; + +export const MachineAuthenticationBrowser = () => { + const [searchTerm, setSearchTerm] = useState(''); + const [selectedCategory, setSelectedCategory] = useState('All'); + + const categories = ['All', 'Token-based', 'Cloud Provider', 'Kubernetes', 'Certificate-based', 'Directory-based']; + + const authMethods = [ + {"name": "Universal Auth", "slug": "universal-auth", "path": "/documentation/platform/identities/universal-auth", "description": "Learn how to authenticate machines using Universal Auth tokens with client ID and secret.", "category": "Token-based"}, + {"name": "Token Auth", "slug": "token-auth", "path": "/documentation/platform/identities/token-auth", "description": "Learn how to authenticate machines using long-lived access tokens.", "category": "Token-based"}, + {"name": "JWT Auth", "slug": "jwt-auth", "path": "/documentation/platform/identities/jwt-auth", "description": "Learn how to authenticate machines using JSON Web Tokens (JWT).", "category": "Token-based"}, + {"name": "AWS Auth", "slug": "aws-iam-auth", "path": "/documentation/platform/identities/aws-auth", "description": "Learn how to authenticate AWS services and resources using IAM roles.", "category": "Cloud Provider"}, + {"name": "Azure Auth", "slug": "azure-auth", "path": "/documentation/platform/identities/azure-auth", "description": "Learn how to authenticate Azure services using managed identities.", "category": "Cloud Provider"}, + {"name": "GCP Auth", "slug": "gcp-auth", "path": "/documentation/platform/identities/gcp-auth", "description": "Learn how to authenticate GCP services using service accounts.", "category": "Cloud Provider"}, + {"name": "Alibaba Cloud Auth", "slug": "alicloud-auth", "path": "/documentation/platform/identities/alicloud-auth", "description": "Learn how to authenticate Alibaba Cloud services using RAM roles.", "category": "Cloud Provider"}, + {"name": "OCI Auth", "slug": "oci-auth", "path": "/documentation/platform/identities/oci-auth", "description": "Learn how to authenticate Oracle Cloud Infrastructure services.", "category": "Cloud Provider"}, + {"name": "Kubernetes Auth", "slug": "kubernetes-auth", "path": "/documentation/platform/identities/kubernetes-auth", "description": "Learn how to authenticate Kubernetes workloads using service account tokens.", "category": "Kubernetes"}, + {"name": "OIDC Auth", "slug": "oidc-auth-general", "path": "/documentation/platform/identities/oidc-auth/general", "description": "Learn how to authenticate machines using OpenID Connect (OIDC) providers.", "category": "Token-based"}, + {"name": "OIDC Auth for GitHub Actions", "slug": "oidc-auth-github", "path": "/documentation/platform/identities/oidc-auth/github", "description": "Learn how to authenticate GitHub Actions using OIDC.", "category": "Token-based"}, + {"name": "OIDC Auth for GitLab CI/CD", "slug": "oidc-auth-gitlab", "path": "/documentation/platform/identities/oidc-auth/gitlab", "description": "Learn how to authenticate GitLab CI/CD using OIDC.", "category": "Token-based"}, + {"name": "OIDC Auth for Azure", "slug": "oidc-auth-azure", "path": "/documentation/platform/identities/oidc-auth/azure", "description": "Learn how to authenticate Azure services using OIDC.", "category": "Token-based"}, + {"name": "OIDC Auth for CircleCI", "slug": "oidc-auth-circleci", "path": "/documentation/platform/identities/oidc-auth/circleci", "description": "Learn how to authenticate CircleCI workflows using OIDC.", "category": "Token-based"}, + {"name": "OIDC Auth for Terraform Cloud", "slug": "oidc-auth-terraform", "path": "/documentation/platform/identities/oidc-auth/terraform-cloud", "description": "Learn how to authenticate Terraform Cloud using OIDC.", "category": "Token-based"}, + {"name": "OIDC Auth for SPIRE", "slug": "oidc-auth-spire", "path": "/documentation/platform/identities/oidc-auth/spire", "description": "Learn how to authenticate workloads using SPIFFE/SPIRE OIDC.", "category": "Token-based"}, + {"name": "TLS Certificate Auth", "slug": "tls-cert-auth", "path": "/documentation/platform/identities/tls-cert-auth", "description": "Learn how to authenticate machines using TLS client certificates.", "category": "Certificate-based"}, + {"name": "LDAP Auth", "slug": "ldap-auth-general", "path": "/documentation/platform/identities/ldap-auth/general", "description": "Learn how to authenticate machines using LDAP credentials.", "category": "Directory-based"}, + {"name": "LDAP Auth for JumpCloud", "slug": "ldap-auth-jumpcloud", "path": "/documentation/platform/identities/ldap-auth/jumpcloud", "description": "Learn how to authenticate machines using JumpCloud LDAP.", "category": "Directory-based"} + ].sort(function(a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + + const filteredAuthMethods = useMemo(() => { + let filtered = authMethods; + + if (selectedCategory !== 'All') { + filtered = filtered.filter(method => method.category === selectedCategory); + } + + if (searchTerm) { + filtered = filtered.filter(method => + method.name.toLowerCase().includes(searchTerm.toLowerCase()) || + method.description.toLowerCase().includes(searchTerm.toLowerCase()) || + method.category.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return filtered; + }, [searchTerm, selectedCategory]); + + return ( +
+ {/* Search Bar */} +
+
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+
+ + {/* Category Filter */} +
+
+ {categories.map(category => ( + + ))} +
+
+ + {/* Results Count */} +
+

+ {filteredAuthMethods.length} authentication method{filteredAuthMethods.length !== 1 ? 's' : ''} found + {selectedCategory !== 'All' && ` in ${selectedCategory}`} + {searchTerm && ` for "${searchTerm}"`} +

+
+ + {/* Authentication Methods List */} + {filteredAuthMethods.length > 0 ? ( +
+ {filteredAuthMethods.map((method, index) => ( + +
+
+

+ {method.name} +

+ + {method.category} + +
+

+ {method.description} +

+
+
+ ))} +
+ ) : ( +
+
+

No authentication methods found matching your criteria

+ {searchTerm && ( +

Try adjusting your search terms or filters

+ )} +
+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/docs/snippets/RotationsBrowser.jsx b/docs/snippets/RotationsBrowser.jsx new file mode 100644 index 000000000..3d50656b6 --- /dev/null +++ b/docs/snippets/RotationsBrowser.jsx @@ -0,0 +1,126 @@ +import React, { useState, useMemo } from 'react'; + +export const RotationsBrowser = () => { + const [searchTerm, setSearchTerm] = useState(''); + const [selectedCategory, setSelectedCategory] = useState('All'); + + const categories = ['All', 'Databases', 'Identity & Auth', 'Cloud Providers']; + + const rotations = [ + {"name": "AWS IAM User", "slug": "aws-iam-user", "path": "/documentation/platform/secret-rotation/aws-iam-user-secret", "description": "Learn how to automatically rotate AWS IAM user access keys.", "category": "Cloud Providers"}, + {"name": "Azure Client Secret", "slug": "azure-client-secret", "path": "/documentation/platform/secret-rotation/azure-client-secret", "description": "Learn how to automatically rotate Azure client secrets.", "category": "Cloud Providers"}, + {"name": "Auth0 Client Secret", "slug": "auth0-client-secret", "path": "/documentation/platform/secret-rotation/auth0-client-secret", "description": "Learn how to automatically rotate Auth0 client secrets.", "category": "Identity & Auth"}, + {"name": "Okta Client Secret", "slug": "okta-client-secret", "path": "/documentation/platform/secret-rotation/okta-client-secret", "description": "Learn how to automatically rotate Okta client secrets.", "category": "Identity & Auth"}, + {"name": "LDAP Password", "slug": "ldap-password", "path": "/documentation/platform/secret-rotation/ldap-password", "description": "Learn how to automatically rotate LDAP user passwords.", "category": "Identity & Auth"}, + {"name": "MySQL", "slug": "mysql-credentials", "path": "/documentation/platform/secret-rotation/mysql-credentials", "description": "Learn how to automatically rotate MySQL database credentials.", "category": "Databases"}, + {"name": "PostgreSQL", "slug": "postgres-credentials", "path": "/documentation/platform/secret-rotation/postgres-credentials", "description": "Learn how to automatically rotate PostgreSQL database credentials.", "category": "Databases"}, + {"name": "Microsoft SQL Server", "slug": "mssql-credentials", "path": "/documentation/platform/secret-rotation/mssql-credentials", "description": "Learn how to automatically rotate Microsoft SQL Server credentials.", "category": "Databases"}, + {"name": "Oracle Database", "slug": "oracledb-credentials", "path": "/documentation/platform/secret-rotation/oracledb-credentials", "description": "Learn how to automatically rotate Oracle Database credentials.", "category": "Databases"} + ].sort(function(a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + + const filteredRotations = useMemo(() => { + let filtered = rotations; + + if (selectedCategory !== 'All') { + filtered = filtered.filter(rotation => rotation.category === selectedCategory); + } + + if (searchTerm) { + filtered = filtered.filter(rotation => + rotation.name.toLowerCase().includes(searchTerm.toLowerCase()) || + rotation.description.toLowerCase().includes(searchTerm.toLowerCase()) || + rotation.category.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return filtered; + }, [searchTerm, selectedCategory]); + + return ( +
+ {/* Search Bar */} +
+
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+
+ + {/* Category Filter */} +
+
+ {categories.map(category => ( + + ))} +
+
+ + {/* Results Count */} +
+

+ {filteredRotations.length} secret rotation{filteredRotations.length !== 1 ? 's' : ''} found + {selectedCategory !== 'All' && ` in ${selectedCategory}`} + {searchTerm && ` for "${searchTerm}"`} +

+
+ + {/* Rotations List */} + {filteredRotations.length > 0 ? ( + + ) : ( +
+
+

No secret rotations found matching your criteria

+ {searchTerm && ( +

Try adjusting your search terms or filters

+ )} +
+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/docs/snippets/SecretSyncsBrowser.jsx b/docs/snippets/SecretSyncsBrowser.jsx new file mode 100644 index 000000000..d32f5ac04 --- /dev/null +++ b/docs/snippets/SecretSyncsBrowser.jsx @@ -0,0 +1,147 @@ +import React, { useState, useMemo } from 'react'; + +export const SecretSyncsBrowser = () => { + const [searchTerm, setSearchTerm] = useState(''); + const [selectedCategory, setSelectedCategory] = useState('All'); + + const categories = ['All', 'Cloud Providers', 'Databases', 'CI/CD', 'Monitoring', 'Data Analytics', 'Hosting', 'DevOps Tools', 'Security']; + + const syncs = [ + {"name": "AWS Parameter Store", "slug": "aws-parameter-store", "path": "/integrations/secret-syncs/aws-parameter-store", "description": "Learn how to sync secrets from Infisical to AWS Parameter Store.", "category": "Cloud Providers"}, + {"name": "AWS Secrets Manager", "slug": "aws-secrets-manager", "path": "/integrations/secret-syncs/aws-secrets-manager", "description": "Learn how to sync secrets from Infisical to AWS Secrets Manager.", "category": "Cloud Providers"}, + {"name": "Azure Key Vault", "slug": "azure-key-vault", "path": "/integrations/secret-syncs/azure-key-vault", "description": "Learn how to sync secrets from Infisical to Azure Key Vault.", "category": "Cloud Providers"}, + {"name": "Azure App Configuration", "slug": "azure-app-configuration", "path": "/integrations/secret-syncs/azure-app-configuration", "description": "Learn how to sync secrets from Infisical to Azure App Configuration.", "category": "Cloud Providers"}, + {"name": "Azure DevOps", "slug": "azure-devops", "path": "/integrations/secret-syncs/azure-devops", "description": "Learn how to sync secrets from Infisical to Azure DevOps.", "category": "CI/CD"}, + {"name": "GCP Secret Manager", "slug": "gcp-secret-manager", "path": "/integrations/secret-syncs/gcp-secret-manager", "description": "Learn how to sync secrets from Infisical to GCP Secret Manager.", "category": "Cloud Providers"}, + {"name": "HashiCorp Vault", "slug": "hashicorp-vault", "path": "/integrations/secret-syncs/hashicorp-vault", "description": "Learn how to sync secrets from Infisical to HashiCorp Vault.", "category": "Security"}, + {"name": "1Password", "slug": "1password", "path": "/integrations/secret-syncs/1password", "description": "Learn how to sync secrets from Infisical to 1Password.", "category": "Security"}, + {"name": "Vercel", "slug": "vercel", "path": "/integrations/secret-syncs/vercel", "description": "Learn how to sync secrets from Infisical to Vercel.", "category": "Hosting"}, + {"name": "Netlify", "slug": "netlify", "path": "/integrations/secret-syncs/netlify", "description": "Learn how to sync secrets from Infisical to Netlify.", "category": "Hosting"}, + {"name": "Railway", "slug": "railway", "path": "/integrations/secret-syncs/railway", "description": "Learn how to sync secrets from Infisical to Railway.", "category": "Hosting"}, + {"name": "Fly.io", "slug": "flyio", "path": "/integrations/secret-syncs/flyio", "description": "Learn how to sync secrets from Infisical to Fly.io.", "category": "Hosting"}, + {"name": "Render", "slug": "render", "path": "/integrations/secret-syncs/render", "description": "Learn how to sync secrets from Infisical to Render.", "category": "Hosting"}, + {"name": "Heroku", "slug": "heroku", "path": "/integrations/secret-syncs/heroku", "description": "Learn how to sync secrets from Infisical to Heroku.", "category": "Hosting"}, + {"name": "DigitalOcean App Platform", "slug": "digital-ocean-app-platform", "path": "/integrations/secret-syncs/digital-ocean-app-platform", "description": "Learn how to sync secrets from Infisical to DigitalOcean App Platform.", "category": "Hosting"}, + {"name": "Supabase", "slug": "supabase", "path": "/integrations/secret-syncs/supabase", "description": "Learn how to sync secrets from Infisical to Supabase.", "category": "Databases"}, + {"name": "Checkly", "slug": "checkly", "path": "/integrations/secret-syncs/checkly", "description": "Learn how to sync secrets from Infisical to Checkly.", "category": "Monitoring"}, + {"name": "GitHub", "slug": "github", "path": "/integrations/secret-syncs/github", "description": "Learn how to sync secrets from Infisical to GitHub.", "category": "CI/CD"}, + {"name": "GitLab", "slug": "gitlab", "path": "/integrations/secret-syncs/gitlab", "description": "Learn how to sync secrets from Infisical to GitLab.", "category": "CI/CD"}, + {"name": "TeamCity", "slug": "teamcity", "path": "/integrations/secret-syncs/teamcity", "description": "Learn how to sync secrets from Infisical to TeamCity.", "category": "CI/CD"}, + {"name": "Bitbucket", "slug": "bitbucket", "path": "/integrations/secret-syncs/bitbucket", "description": "Learn how to sync secrets from Infisical to Bitbucket.", "category": "CI/CD"}, + {"name": "Terraform Cloud", "slug": "terraform-cloud", "path": "/integrations/secret-syncs/terraform-cloud", "description": "Learn how to sync secrets from Infisical to Terraform Cloud.", "category": "DevOps Tools"}, + {"name": "Cloudflare Pages", "slug": "cloudflare-pages", "path": "/integrations/secret-syncs/cloudflare-pages", "description": "Learn how to sync secrets from Infisical to Cloudflare Pages.", "category": "Hosting"}, + {"name": "Cloudflare Workers", "slug": "cloudflare-workers", "path": "/integrations/secret-syncs/cloudflare-workers", "description": "Learn how to sync secrets from Infisical to Cloudflare Workers.", "category": "Cloud Providers"}, + {"name": "Databricks", "slug": "databricks", "path": "/integrations/secret-syncs/databricks", "description": "Learn how to sync secrets from Infisical to Databricks.", "category": "Data Analytics"}, + {"name": "Windmill", "slug": "windmill", "path": "/integrations/secret-syncs/windmill", "description": "Learn how to sync secrets from Infisical to Windmill.", "category": "DevOps Tools"}, + {"name": "Camunda", "slug": "camunda", "path": "/integrations/secret-syncs/camunda", "description": "Learn how to sync secrets from Infisical to Camunda.", "category": "DevOps Tools"}, + {"name": "Humanitec", "slug": "humanitec", "path": "/integrations/secret-syncs/humanitec", "description": "Learn how to sync secrets from Infisical to Humanitec.", "category": "DevOps Tools"}, + {"name": "OCI Vault", "slug": "oci-vault", "path": "/integrations/secret-syncs/oci-vault", "description": "Learn how to sync secrets from Infisical to OCI Vault.", "category": "Cloud Providers"}, + {"name": "Zabbix", "slug": "zabbix", "path": "/integrations/secret-syncs/zabbix", "description": "Learn how to sync secrets from Infisical to Zabbix.", "category": "Monitoring"} + ].sort(function(a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + + const filteredSyncs = useMemo(() => { + let filtered = syncs; + + if (selectedCategory !== 'All') { + filtered = filtered.filter(sync => sync.category === selectedCategory); + } + + if (searchTerm) { + filtered = filtered.filter(sync => + sync.name.toLowerCase().includes(searchTerm.toLowerCase()) || + sync.description.toLowerCase().includes(searchTerm.toLowerCase()) || + sync.category.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return filtered; + }, [searchTerm, selectedCategory]); + + return ( +
+ {/* Search Bar */} +
+
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+
+ + {/* Category Filter */} +
+
+ {categories.map(category => ( + + ))} +
+
+ + {/* Results Count */} +
+

+ {filteredSyncs.length} secret sync{filteredSyncs.length !== 1 ? 's' : ''} found + {selectedCategory !== 'All' && ` in ${selectedCategory}`} + {searchTerm && ` for "${searchTerm}"`} +

+
+ + {/* Secret Syncs List */} + {filteredSyncs.length > 0 ? ( + + ) : ( +
+
+

No secret syncs found matching your criteria

+ {searchTerm && ( +

Try adjusting your search terms or filters

+ )} +
+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/docs/snippets/UserAuthenticationBrowser.jsx b/docs/snippets/UserAuthenticationBrowser.jsx new file mode 100644 index 000000000..76b77ad93 --- /dev/null +++ b/docs/snippets/UserAuthenticationBrowser.jsx @@ -0,0 +1,135 @@ +import React, { useState, useMemo } from 'react'; + +export const UserAuthenticationBrowser = () => { + const [searchTerm, setSearchTerm] = useState(''); + const [selectedCategory, setSelectedCategory] = useState('All'); + + const categories = ['All', 'SSO', 'LDAP', 'SCIM', 'General']; + + const authMethods = [ + {"name": "Auth0 OIDC", "slug": "auth0-oidc-sso", "path": "/documentation/platform/sso/auth0-oidc", "description": "Learn how to configure Auth0 OIDC SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Auth0 SAML", "slug": "auth0-saml-sso", "path": "/documentation/platform/sso/auth0-saml", "description": "Learn how to configure Auth0 SAML SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Entra ID / Azure AD SAML", "slug": "azure-ad-sso", "path": "/documentation/platform/sso/azure", "description": "Learn how to configure Azure Active Directory (Entra ID) SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Google", "slug": "google-sso", "path": "/documentation/platform/sso/google", "description": "Learn how to configure Google SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Google SAML", "slug": "google-saml-sso", "path": "/documentation/platform/sso/google-saml", "description": "Learn how to configure Google SAML SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "GitHub", "slug": "github-sso", "path": "/documentation/platform/sso/github", "description": "Learn how to configure GitHub SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "GitLab", "slug": "gitlab-sso", "path": "/documentation/platform/sso/gitlab", "description": "Learn how to configure GitLab SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "JumpCloud", "slug": "jumpcloud-sso", "path": "/documentation/platform/sso/jumpcloud", "description": "Learn how to configure JumpCloud SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Keycloak OIDC", "slug": "keycloak-oidc-sso", "path": "/documentation/platform/sso/keycloak-oidc/overview", "description": "Learn how to configure Keycloak OIDC SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Keycloak SAML", "slug": "keycloak-saml-sso", "path": "/documentation/platform/sso/keycloak-saml", "description": "Learn how to configure Keycloak SAML SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Okta", "slug": "okta-oidc-sso", "path": "/documentation/platform/sso/okta", "description": "Learn how to configure Okta OIDC SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "Okta SAML", "slug": "okta-saml-sso", "path": "/documentation/platform/sso/okta-saml", "description": "Learn how to configure Okta SAML SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "OneLogin SAML", "slug": "onelogin-saml-sso", "path": "/documentation/platform/sso/onelogin-saml", "description": "Learn how to configure OneLogin SAML SSO for user authentication in Infisical.", "category": "SSO"}, + {"name": "General OIDC", "slug": "general-oidc-sso", "path": "/documentation/platform/sso/general-oidc", "description": "Learn how to configure generic OIDC providers for SSO in Infisical.", "category": "SSO"}, + {"name": "General SAML 2.0", "slug": "general-saml-sso", "path": "/documentation/platform/sso/general-saml", "description": "Learn how to configure generic SAML 2.0 providers for SSO in Infisical.", "category": "SSO"}, + {"name": "LDAP", "slug": "ldap", "path": "/documentation/platform/ldap/overview", "description": "Learn how to configure LDAP authentication for user login in Infisical.", "category": "LDAP"}, + {"name": "SCIM", "slug": "scim", "path": "/documentation/platform/scim/overview", "description": "Learn how to configure SCIM provisioning for automated user management in Infisical.", "category": "SCIM"}, + {"name": "Email/Password", "slug": "email-password", "path": "/documentation/getting-started/introduction", "description": "Learn how to use standard email and password authentication in Infisical.", "category": "General"} + ].sort(function(a, b) { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + + const filteredAuthMethods = useMemo(() => { + let filtered = authMethods; + + if (selectedCategory !== 'All') { + filtered = filtered.filter(method => method.category === selectedCategory); + } + + if (searchTerm) { + filtered = filtered.filter(method => + method.name.toLowerCase().includes(searchTerm.toLowerCase()) || + method.description.toLowerCase().includes(searchTerm.toLowerCase()) || + method.category.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return filtered; + }, [searchTerm, selectedCategory]); + + return ( +
+ {/* Search Bar */} +
+
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+
+ + {/* Category Filter */} +
+
+ {categories.map(category => ( + + ))} +
+
+ + {/* Results Count */} +
+

+ {filteredAuthMethods.length} user authentication method{filteredAuthMethods.length !== 1 ? 's' : ''} found + {selectedCategory !== 'All' && ` in ${selectedCategory}`} + {searchTerm && ` for "${searchTerm}"`} +

+
+ + {/* Authentication Methods List */} + {filteredAuthMethods.length > 0 ? ( +
+ {filteredAuthMethods.map((method, index) => ( + +
+
+

+ {method.name} +

+ + {method.category} + +
+

+ {method.description} +

+
+
+ ))} +
+ ) : ( +
+
+

No user authentication methods found matching your criteria

+ {searchTerm && ( +

Try adjusting your search terms or filters

+ )} +
+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/frontend/public/images/integrations/Datadog.png b/frontend/public/images/integrations/Datadog.png new file mode 100644 index 000000000..7c1b33de0 Binary files /dev/null and b/frontend/public/images/integrations/Datadog.png differ diff --git a/frontend/public/images/integrations/EnvKey.png b/frontend/public/images/integrations/EnvKey.png new file mode 100644 index 000000000..bf1ce03ed Binary files /dev/null and b/frontend/public/images/integrations/EnvKey.png differ diff --git a/frontend/public/images/integrations/Splunk.png b/frontend/public/images/integrations/Splunk.png new file mode 100644 index 000000000..54f13cd25 Binary files /dev/null and b/frontend/public/images/integrations/Splunk.png differ diff --git a/frontend/src/components/projects/NewProjectModal.tsx b/frontend/src/components/projects/NewProjectModal.tsx index fa3ae2c70..1bbe9f6f1 100644 --- a/frontend/src/components/projects/NewProjectModal.tsx +++ b/frontend/src/components/projects/NewProjectModal.tsx @@ -153,7 +153,7 @@ const NewProjectForm = ({ onOpenChange }: NewProjectFormProps) => { reset(); onOpenChange(false); navigate({ - to: getProjectHomePage(project.type), + to: getProjectHomePage(project.type, project.environments), params: { projectId: project.id } }); } catch (err) { diff --git a/frontend/src/components/secret-syncs/SecretSyncStatusBadge.tsx b/frontend/src/components/secret-syncs/SecretSyncStatusBadge.tsx index 53b53d5c0..e0d541138 100644 --- a/frontend/src/components/secret-syncs/SecretSyncStatusBadge.tsx +++ b/frontend/src/components/secret-syncs/SecretSyncStatusBadge.tsx @@ -1,6 +1,7 @@ import { faCheck, faExclamationTriangle, + faHourglass, faRotate, IconDefinition } from "@fortawesome/free-solid-svg-icons"; @@ -29,7 +30,11 @@ export const SecretSyncStatusBadge = ({ status }: Props) => { text = "Synced"; icon = faCheck; break; - case SecretSyncStatus.Pending: // no need to differentiate from user perspective + case SecretSyncStatus.Pending: + variant = "primary"; + text = "Queued"; + icon = faHourglass; + break; case SecretSyncStatus.Running: default: variant = "primary"; @@ -42,11 +47,7 @@ export const SecretSyncStatusBadge = ({ status }: Props) => { {text} diff --git a/frontend/src/components/v2/CreatableSelect/CreatableSelect.tsx b/frontend/src/components/v2/CreatableSelect/CreatableSelect.tsx index 37db2f637..c569456fd 100644 --- a/frontend/src/components/v2/CreatableSelect/CreatableSelect.tsx +++ b/frontend/src/components/v2/CreatableSelect/CreatableSelect.tsx @@ -60,7 +60,8 @@ export const CreatableSelect = ({ isSelected && "text-mineshaft-200", "px-3 py-2 text-xs hover:cursor-pointer" ), - noOptionsMessage: () => "text-mineshaft-400 p-2 rounded-md" + noOptionsMessage: () => "text-mineshaft-400 p-2 rounded-md", + loadingMessage: () => "text-mineshaft-400 p-2 rounded-md" }} {...props} /> diff --git a/frontend/src/components/v2/EmptyState/EmptyState.tsx b/frontend/src/components/v2/EmptyState/EmptyState.tsx index 9816a3fe2..f6b926953 100644 --- a/frontend/src/components/v2/EmptyState/EmptyState.tsx +++ b/frontend/src/components/v2/EmptyState/EmptyState.tsx @@ -10,6 +10,7 @@ type Props = { children?: ReactNode; icon?: IconDefinition; iconSize?: SizeProp; + titleClassName?: string; }; export const EmptyState = ({ @@ -17,7 +18,8 @@ export const EmptyState = ({ className, children, icon = faCubesStacked, - iconSize = "2x" + iconSize = "2x", + titleClassName }: Props) => (
-
{title}
+
{title}
{children}
diff --git a/frontend/src/components/v2/FilterableSelect/FilterableSelect.tsx b/frontend/src/components/v2/FilterableSelect/FilterableSelect.tsx index 47a5acd56..8d0849a04 100644 --- a/frontend/src/components/v2/FilterableSelect/FilterableSelect.tsx +++ b/frontend/src/components/v2/FilterableSelect/FilterableSelect.tsx @@ -67,7 +67,7 @@ export const FilterableSelect = ({ }), menuPortal: (provided) => ({ ...provided, - zIndex: 9999 + zIndex: 99999 }) }} tabSelectsValue={tabSelectsValue} @@ -91,7 +91,7 @@ export const FilterableSelect = ({ ), placeholder: () => `${isMulti ? "py-[0.22rem]" : "leading-7"} text-mineshaft-400 text-sm pl-1`, - input: () => "pl-1", + input: () => `pl-1 ${isMulti ? "py-[0.22rem]" : ""}`, valueContainer: () => `px-1 max-h-[8.2rem] ${ isMulti ? "!overflow-y-auto thin-scrollbar py-1" : "py-[0.1rem]" @@ -114,7 +114,8 @@ export const FilterableSelect = ({ isSelected && "text-mineshaft-200", "rounded px-3 py-2 text-xs hover:cursor-pointer" ), - noOptionsMessage: () => "text-mineshaft-400 p-2 rounded-md" + noOptionsMessage: () => "text-mineshaft-400 p-2 rounded-md", + loadingMessage: () => "text-mineshaft-400 p-2 rounded-md" }} {...props} /> diff --git a/frontend/src/components/v2/Table/Table.tsx b/frontend/src/components/v2/Table/Table.tsx index cc180ffb6..b8ca27dc1 100644 --- a/frontend/src/components/v2/Table/Table.tsx +++ b/frontend/src/components/v2/Table/Table.tsx @@ -1,4 +1,4 @@ -import { DetailedHTMLProps, HTMLAttributes, ReactNode, TdHTMLAttributes } from "react"; +import { DetailedHTMLProps, forwardRef, HTMLAttributes, ReactNode, TdHTMLAttributes } from "react"; import { twMerge } from "tailwind-merge"; import { Skeleton } from "../Skeleton"; @@ -9,22 +9,20 @@ export type TableContainerProps = { className?: string; } & DetailedHTMLProps, HTMLDivElement>; -export const TableContainer = ({ - children, - className, - isRounded = true, - ...props -}: TableContainerProps): JSX.Element => ( -
- {children} -
+export const TableContainer = forwardRef( + ({ children, className, isRounded = true, ...props }, ref): JSX.Element => ( +
+ {children} +
+ ) ); // main parent table diff --git a/frontend/src/context/OrgPermissionContext/index.tsx b/frontend/src/context/OrgPermissionContext/index.tsx index fccd53935..f3bc0195d 100644 --- a/frontend/src/context/OrgPermissionContext/index.tsx +++ b/frontend/src/context/OrgPermissionContext/index.tsx @@ -2,6 +2,7 @@ export { useOrgPermission } from "./OrgPermissionContext"; export type { TOrgPermission } from "./types"; export { OrgPermissionActions, + OrgPermissionAuditLogsActions, OrgPermissionBillingActions, OrgPermissionGroupActions, OrgPermissionIdentityActions, diff --git a/frontend/src/context/OrgPermissionContext/types.ts b/frontend/src/context/OrgPermissionContext/types.ts index 50e147aa0..4a569be06 100644 --- a/frontend/src/context/OrgPermissionContext/types.ts +++ b/frontend/src/context/OrgPermissionContext/types.ts @@ -52,6 +52,7 @@ export enum OrgPermissionSubjects { Gateway = "gateway", SecretShare = "secret-share", GithubOrgSync = "github-org-sync", + GithubOrgSyncManual = "github-org-sync-manual", MachineIdentityAuthTemplate = "machine-identity-auth-template" } @@ -71,6 +72,10 @@ export enum OrgPermissionAppConnectionActions { Connect = "connect" } +export enum OrgPermissionAuditLogsActions { + Read = "read" +} + export enum OrgPermissionKmipActions { Proxy = "proxy", Setup = "setup" @@ -111,6 +116,7 @@ export type OrgPermissionSet = | [OrgPermissionActions, OrgPermissionSubjects.IncidentAccount] | [OrgPermissionActions, OrgPermissionSubjects.Scim] | [OrgPermissionActions, OrgPermissionSubjects.GithubOrgSync] + | [OrgPermissionActions, OrgPermissionSubjects.GithubOrgSyncManual] | [OrgPermissionActions, OrgPermissionSubjects.Sso] | [OrgPermissionActions, OrgPermissionSubjects.Ldap] | [OrgPermissionGroupActions, OrgPermissionSubjects.Groups] @@ -118,7 +124,7 @@ export type OrgPermissionSet = | [OrgPermissionBillingActions, OrgPermissionSubjects.Billing] | [OrgPermissionActions, OrgPermissionSubjects.Kms] | [OrgPermissionAdminConsoleAction, OrgPermissionSubjects.AdminConsole] - | [OrgPermissionActions, OrgPermissionSubjects.AuditLogs] + | [OrgPermissionAuditLogsActions, OrgPermissionSubjects.AuditLogs] | [OrgPermissionActions, OrgPermissionSubjects.ProjectTemplates] | [OrgPermissionAppConnectionActions, OrgPermissionSubjects.AppConnections] | [OrgPermissionIdentityActions, OrgPermissionSubjects.Identity] diff --git a/frontend/src/context/ProjectPermissionContext/index.tsx b/frontend/src/context/ProjectPermissionContext/index.tsx index f564ac74e..a1669e18f 100644 --- a/frontend/src/context/ProjectPermissionContext/index.tsx +++ b/frontend/src/context/ProjectPermissionContext/index.tsx @@ -2,6 +2,7 @@ export { useProjectPermission } from "./ProjectPermissionContext"; export type { ProjectPermissionSet, TProjectPermission } from "./types"; export { ProjectPermissionActions, + ProjectPermissionAuditLogsActions, ProjectPermissionCertificateActions, ProjectPermissionCmekActions, ProjectPermissionDynamicSecretActions, diff --git a/frontend/src/context/ProjectPermissionContext/types.ts b/frontend/src/context/ProjectPermissionContext/types.ts index dad72cada..acfab612f 100644 --- a/frontend/src/context/ProjectPermissionContext/types.ts +++ b/frontend/src/context/ProjectPermissionContext/types.ts @@ -150,6 +150,10 @@ export enum ProjectPermissionSecretEventActions { SubscribeImportMutations = "subscribe-on-import-mutations" } +export enum ProjectPermissionAuditLogsActions { + Read = "read" +} + export enum PermissionConditionOperators { $IN = "$in", $ALL = "$all", @@ -365,7 +369,7 @@ export type ProjectPermissionSet = | [ProjectPermissionActions, ProjectPermissionSub.Groups] | [ProjectPermissionActions, ProjectPermissionSub.Integrations] | [ProjectPermissionActions, ProjectPermissionSub.Webhooks] - | [ProjectPermissionActions, ProjectPermissionSub.AuditLogs] + | [ProjectPermissionAuditLogsActions, ProjectPermissionSub.AuditLogs] | [ProjectPermissionActions, ProjectPermissionSub.Environments] | [ProjectPermissionActions, ProjectPermissionSub.IpAllowList] | [ProjectPermissionActions, ProjectPermissionSub.Settings] diff --git a/frontend/src/context/index.tsx b/frontend/src/context/index.tsx index 833956d77..bfb504664 100644 --- a/frontend/src/context/index.tsx +++ b/frontend/src/context/index.tsx @@ -2,6 +2,7 @@ export { useOrganization } from "./OrganizationContext"; export type { TOrgPermission } from "./OrgPermissionContext"; export { OrgPermissionActions, + OrgPermissionAuditLogsActions, OrgPermissionBillingActions, OrgPermissionGroupActions, OrgPermissionIdentityActions, @@ -11,6 +12,7 @@ export { export type { TProjectPermission } from "./ProjectPermissionContext"; export { ProjectPermissionActions, + ProjectPermissionAuditLogsActions, ProjectPermissionCertificateActions, ProjectPermissionCmekActions, ProjectPermissionDynamicSecretActions, diff --git a/frontend/src/helpers/auditLogStreams.ts b/frontend/src/helpers/auditLogStreams.ts new file mode 100644 index 000000000..00d2b9e51 --- /dev/null +++ b/frontend/src/helpers/auditLogStreams.ts @@ -0,0 +1,32 @@ +import { faCode, IconDefinition } from "@fortawesome/free-solid-svg-icons"; + +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; +import { TAuditLogStream } from "@app/hooks/api/types"; +import { DiscriminativePick } from "@app/types"; + +export const AUDIT_LOG_STREAM_PROVIDER_MAP: Record< + LogProvider, + { name: string; image?: string; icon?: IconDefinition; size?: number } +> = { + [LogProvider.Custom]: { name: "Custom", icon: faCode }, + [LogProvider.Datadog]: { name: "Datadog", image: "Datadog.png" }, + [LogProvider.Splunk]: { name: "Splunk", image: "Splunk.png", size: 65 } +}; + +// Strictly for showing to the client in the front-end +export function getProviderUrl( + logStream: DiscriminativePick +) { + switch (logStream.provider) { + case LogProvider.Custom: + return logStream.credentials.url; + case LogProvider.Datadog: + return logStream.credentials.url; + case LogProvider.Splunk: + return `https://${logStream.credentials.hostname}:8088/services/collector/event`; + default: + throw new Error( + `Unhandled provider in getProviderUrl: ${(logStream as TAuditLogStream).provider}` + ); + } +} diff --git a/frontend/src/helpers/download.ts b/frontend/src/helpers/download.ts index 50adf4fe2..d1659a956 100644 --- a/frontend/src/helpers/download.ts +++ b/frontend/src/helpers/download.ts @@ -4,3 +4,15 @@ export const downloadTxtFile = (filename: string, content: string) => { const blob = new Blob([content], { type: "text/plain;charset=utf-8" }); FileSaver.saveAs(blob, filename); }; + +export const downloadFile = (content: string, filename: string, mimeType: string = "text/csv") => { + const blob = new Blob([content], { type: mimeType }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); +}; diff --git a/frontend/src/helpers/project.ts b/frontend/src/helpers/project.ts index 3b04b263d..7c9185556 100644 --- a/frontend/src/helpers/project.ts +++ b/frontend/src/helpers/project.ts @@ -1,6 +1,6 @@ import { apiRequest } from "@app/config/request"; import { createWorkspace } from "@app/hooks/api/workspace/queries"; -import { ProjectType } from "@app/hooks/api/workspace/types"; +import { ProjectType, WorkspaceEnv } from "@app/hooks/api/workspace/types"; const secretsToBeAdded = [ { @@ -72,12 +72,14 @@ export const getProjectBaseURL = (type: ProjectType) => { } }; -export const getProjectHomePage = (type: ProjectType) => { +// @ts-expect-error akhilmhdh: will remove this later +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export const getProjectHomePage = (type: ProjectType, environments: WorkspaceEnv[]) => { switch (type) { case ProjectType.SecretManager: - return "/projects/secret-management/$projectId/overview"; + return "/projects/secret-management/$projectId/overview" as const; case ProjectType.CertificateManager: - return "/projects/cert-management/$projectId/subscribers"; + return "/projects/cert-management/$projectId/subscribers" as const; case ProjectType.SecretScanning: return `/projects/${type}/$projectId/data-sources` as const; default: diff --git a/frontend/src/hooks/api/admin/mutation.ts b/frontend/src/hooks/api/admin/mutation.ts index b196f19e7..918a0ecd5 100644 --- a/frontend/src/hooks/api/admin/mutation.ts +++ b/frontend/src/hooks/api/admin/mutation.ts @@ -1,6 +1,7 @@ import { useMutation, useQueryClient } from "@tanstack/react-query"; import { apiRequest } from "@app/config/request"; +import { Organization } from "@app/hooks/api/organization/types"; import { organizationKeys } from "../organization/queries"; import { User } from "../users/types"; @@ -8,9 +9,12 @@ import { adminQueryKeys, adminStandaloneKeys } from "./queries"; import { RootKeyEncryptionStrategy, TCreateAdminUserDTO, + TCreateOrganizationDTO, TInvalidateCacheDTO, + TResendOrgInviteDTO, TServerConfig, - TUpdateServerConfigDTO + TUpdateServerConfigDTO, + TUsageReportResponse } from "./types"; export const useCreateAdminUser = () => { @@ -193,3 +197,58 @@ export const useInvalidateCache = () => { } }); }; + +export const useServerAdminCreateOrganization = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async (opt: TCreateOrganizationDTO) => { + const { data } = await apiRequest.post<{ organization: Organization }>( + "/api/v1/admin/organization-management/organizations", + opt + ); + return data; + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: adminQueryKeys.getOrganizations() }); + } + }); +}; + +export const useServerAdminResendOrgInvite = () => { + return useMutation({ + mutationFn: async ({ organizationId, membershipId }: TResendOrgInviteDTO) => { + await apiRequest.post( + `/api/v1/admin/organization-management/organizations/${organizationId}/memberships/${membershipId}/resend-invite` + ); + } + }); +}; + +export const useServerAdminAccessOrg = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async (orgId: string) => { + const { data } = await apiRequest.post( + `/api/v1/admin/organization-management/organizations/${orgId}/access` + ); + return data; + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: organizationKeys.getUserOrganizations }); + queryClient.invalidateQueries({ queryKey: adminQueryKeys.getOrganizations() }); + } + }); +}; + +export const useGenerateUsageReport = () => { + return useMutation({ + mutationFn: async () => { + const { data } = await apiRequest.post( + "/api/v1/admin/usage-report/generate" + ); + return data; + } + }); +}; diff --git a/frontend/src/hooks/api/admin/queries.ts b/frontend/src/hooks/api/admin/queries.ts index 871c7288c..4b10ba3ce 100644 --- a/frontend/src/hooks/api/admin/queries.ts +++ b/frontend/src/hooks/api/admin/queries.ts @@ -1,4 +1,11 @@ -import { useInfiniteQuery, useQuery, UseQueryOptions } from "@tanstack/react-query"; +import { + DefaultError, + InfiniteData, + UndefinedInitialDataInfiniteOptions, + useInfiniteQuery, + useQuery, + UseQueryOptions +} from "@tanstack/react-query"; import { apiRequest } from "@app/config/request"; import { Identity } from "@app/hooks/api/identities/types"; @@ -25,8 +32,8 @@ export const adminStandaloneKeys = { export const adminQueryKeys = { serverConfig: () => ["server-config"] as const, getUsers: (filters: AdminGetUsersFilters) => [adminStandaloneKeys.getUsers, { filters }] as const, - getOrganizations: (filters: AdminGetOrganizationsFilters) => - [adminStandaloneKeys.getOrganizations, { filters }] as const, + getOrganizations: (filters?: AdminGetOrganizationsFilters) => + [adminStandaloneKeys.getOrganizations, ...(filters ? [{ filters }] : [])] as const, getIdentities: (filters: AdminGetIdentitiesFilters) => [adminStandaloneKeys.getIdentities, { filters }] as const, getAdminSlackConfig: () => ["admin-slack-config"] as const, @@ -83,7 +90,18 @@ export const useGetServerConfig = ({ enabled: options?.enabled ?? true }); -export const useAdminGetUsers = (filters: AdminGetUsersFilters) => { +export const useAdminGetUsers = ( + filters: AdminGetUsersFilters, + options?: Partial< + UndefinedInitialDataInfiniteOptions< + User[], + DefaultError, + InfiniteData, + ReturnType, + number + > + > +) => { return useInfiniteQuery({ initialPageParam: 0, queryKey: adminQueryKeys.getUsers(filters), @@ -101,7 +119,8 @@ export const useAdminGetUsers = (filters: AdminGetUsersFilters) => { return data.users; }, getNextPageParam: (lastPage, pages) => - lastPage.length !== 0 ? pages.length * filters.limit : undefined + lastPage.length !== 0 ? pages.length * filters.limit : undefined, + ...options }); }; diff --git a/frontend/src/hooks/api/admin/types.ts b/frontend/src/hooks/api/admin/types.ts index aca8b5bb3..f8336fcac 100644 --- a/frontend/src/hooks/api/admin/types.ts +++ b/frontend/src/hooks/api/admin/types.ts @@ -1,3 +1,5 @@ +import { OrgMembershipStatus } from "@app/hooks/api/organization/types"; + import { Organization } from "../types"; export enum LoginMethod { @@ -20,6 +22,7 @@ export type OrganizationWithProjects = Organization & { lastName: string | null; }; membershipId: string; + status: OrgMembershipStatus; role: string; roleId: string | null; }[]; @@ -53,6 +56,7 @@ export type TServerConfig = { fipsEnabled: boolean; envOverrides?: Record; paramsFolderSecretDetectionEnabled: boolean; + isOfflineUsageReportsEnabled: boolean; }; export type TUpdateServerConfigDTO = { @@ -142,3 +146,19 @@ export interface TGetEnvOverrides { fields: { key: string; value: string; hasEnvEntry: boolean; description?: string }[]; }; } + +export type TUsageReportResponse = { + filename: string; + csvContent: string; + signature: string; +}; + +export type TCreateOrganizationDTO = { + name: string; + inviteAdminEmails: string[]; +}; + +export type TResendOrgInviteDTO = { + organizationId: string; + membershipId: string; +}; diff --git a/frontend/src/hooks/api/auditLogStreams/enums.ts b/frontend/src/hooks/api/auditLogStreams/enums.ts new file mode 100644 index 000000000..9c03dc2bd --- /dev/null +++ b/frontend/src/hooks/api/auditLogStreams/enums.ts @@ -0,0 +1,5 @@ +export enum LogProvider { + Datadog = "datadog", + Splunk = "splunk", + Custom = "custom" +} diff --git a/frontend/src/hooks/api/auditLogStreams/index.tsx b/frontend/src/hooks/api/auditLogStreams/index.tsx index 72b1fba1a..0c2adeab0 100644 --- a/frontend/src/hooks/api/auditLogStreams/index.tsx +++ b/frontend/src/hooks/api/auditLogStreams/index.tsx @@ -1,6 +1,2 @@ -export { - useCreateAuditLogStream, - useDeleteAuditLogStream, - useUpdateAuditLogStream -} from "./mutations"; -export { useGetAuditLogStreamDetails, useGetAuditLogStreams } from "./queries"; +export * from "./mutations"; +export * from "./queries"; diff --git a/frontend/src/hooks/api/auditLogStreams/mutations.tsx b/frontend/src/hooks/api/auditLogStreams/mutations.tsx index 1ed93f95b..24253ca63 100644 --- a/frontend/src/hooks/api/auditLogStreams/mutations.tsx +++ b/frontend/src/hooks/api/auditLogStreams/mutations.tsx @@ -12,50 +12,54 @@ import { export const useCreateAuditLogStream = () => { const queryClient = useQueryClient(); - - return useMutation<{ auditLogStream: TAuditLogStream }, object, TCreateAuditLogStreamDTO>({ - mutationFn: async (dto) => { + return useMutation({ + mutationFn: async ({ provider, ...params }: TCreateAuditLogStreamDTO) => { const { data } = await apiRequest.post<{ auditLogStream: TAuditLogStream }>( - "/api/v1/audit-log-streams", - dto + `/api/v1/audit-log-streams/${provider}`, + params ); - return data; + + return data.auditLogStream; }, - onSuccess: (_, { orgId }) => { - queryClient.invalidateQueries({ queryKey: auditLogStreamKeys.list(orgId) }); - } + onSuccess: () => queryClient.invalidateQueries({ queryKey: auditLogStreamKeys.list() }) }); }; export const useUpdateAuditLogStream = () => { const queryClient = useQueryClient(); - - return useMutation<{ auditLogStream: TAuditLogStream }, object, TUpdateAuditLogStreamDTO>({ - mutationFn: async (dto) => { + return useMutation({ + mutationFn: async ({ auditLogStreamId, provider, ...params }: TUpdateAuditLogStreamDTO) => { const { data } = await apiRequest.patch<{ auditLogStream: TAuditLogStream }>( - `/api/v1/audit-log-streams/${dto.id}`, - dto + `/api/v1/audit-log-streams/${provider}/${auditLogStreamId}`, + params ); - return data; + + return data.auditLogStream; }, - onSuccess: (_, { orgId }) => { - queryClient.invalidateQueries({ queryKey: auditLogStreamKeys.list(orgId) }); + onSuccess: (_, { auditLogStreamId, provider }) => { + queryClient.invalidateQueries({ queryKey: auditLogStreamKeys.list() }); + queryClient.invalidateQueries({ + queryKey: auditLogStreamKeys.getById(provider, auditLogStreamId) + }); } }); }; export const useDeleteAuditLogStream = () => { const queryClient = useQueryClient(); - - return useMutation<{ auditLogStream: TAuditLogStream }, object, TDeleteAuditLogStreamDTO>({ - mutationFn: async (dto) => { + return useMutation({ + mutationFn: async ({ auditLogStreamId, provider }: TDeleteAuditLogStreamDTO) => { const { data } = await apiRequest.delete<{ auditLogStream: TAuditLogStream }>( - `/api/v1/audit-log-streams/${dto.id}` + `/api/v1/audit-log-streams/${provider}/${auditLogStreamId}` ); - return data; + + return data.auditLogStream; }, - onSuccess: (_, { orgId }) => { - queryClient.invalidateQueries({ queryKey: auditLogStreamKeys.list(orgId) }); + onSuccess: (_, { auditLogStreamId, provider }) => { + queryClient.invalidateQueries({ queryKey: auditLogStreamKeys.list() }); + queryClient.invalidateQueries({ + queryKey: auditLogStreamKeys.getById(provider, auditLogStreamId) + }); } }); }; diff --git a/frontend/src/hooks/api/auditLogStreams/queries.tsx b/frontend/src/hooks/api/auditLogStreams/queries.tsx index ff7d8b499..97d7d6267 100644 --- a/frontend/src/hooks/api/auditLogStreams/queries.tsx +++ b/frontend/src/hooks/api/auditLogStreams/queries.tsx @@ -1,40 +1,89 @@ -import { useQuery } from "@tanstack/react-query"; +import { useQuery, UseQueryOptions } from "@tanstack/react-query"; import { apiRequest } from "@app/config/request"; -import { TAuditLogStream } from "./types"; +import { TAuditLogStreamProviderOption } from "./types/provider-options"; +import { LogProvider } from "./enums"; +import { TAuditLogStream, TAuditLogStreamProviderMap } from "./types"; export const auditLogStreamKeys = { - list: (orgId: string) => ["audit-log-stream", { orgId }], - getById: (id: string) => ["audit-log-stream-details", { id }] + all: ["audit-log-stream"] as const, + options: () => [...auditLogStreamKeys.all, "options"] as const, + list: () => [...auditLogStreamKeys.all, "list"] as const, + getById: (provider: string, id: string) => + [...auditLogStreamKeys.all, provider, "get-by-id", id] as const }; -const fetchAuditLogStreams = async () => { - const { data } = await apiRequest.get<{ auditLogStreams: TAuditLogStream[] }>( - "/api/v1/audit-log-streams" - ); +export const useGetAuditLogStreamOptions = ( + options?: Omit< + UseQueryOptions< + TAuditLogStreamProviderOption[], + unknown, + TAuditLogStreamProviderOption[], + ReturnType + >, + "queryKey" | "queryFn" + > +) => { + return useQuery({ + queryKey: auditLogStreamKeys.options(), + queryFn: async () => { + const { data } = await apiRequest.get<{ providerOptions: TAuditLogStreamProviderOption[] }>( + "/api/v1/audit-log-streams/options" + ); - return data.auditLogStreams; -}; - -export const useGetAuditLogStreams = (orgId: string) => - useQuery({ - queryKey: auditLogStreamKeys.list(orgId), - queryFn: () => fetchAuditLogStreams(), - enabled: Boolean(orgId) + return data.providerOptions; + }, + ...options }); - -const fetchAuditLogStreamDetails = async (id: string) => { - const { data } = await apiRequest.get<{ auditLogStream: TAuditLogStream }>( - `/api/v1/audit-log-streams/${id}` - ); - - return data.auditLogStream; }; -export const useGetAuditLogStreamDetails = (id: string) => - useQuery({ - queryKey: auditLogStreamKeys.getById(id), - queryFn: () => fetchAuditLogStreamDetails(id), - enabled: Boolean(id) +export const useListAuditLogStreams = ( + options?: Omit< + UseQueryOptions< + TAuditLogStream[], + unknown, + TAuditLogStream[], + ReturnType + >, + "queryKey" | "queryFn" + > +) => { + return useQuery({ + queryKey: auditLogStreamKeys.list(), + queryFn: async () => { + const { data } = await apiRequest.get<{ auditLogStreams: TAuditLogStream[] }>( + "/api/v1/audit-log-streams" + ); + + return data.auditLogStreams; + }, + ...options }); +}; + +export const useGetAuditLogStreamById = ( + provider: T, + logStreamId: string, + options?: Omit< + UseQueryOptions< + TAuditLogStreamProviderMap[T], + unknown, + TAuditLogStreamProviderMap[T], + ReturnType + >, + "queryKey" | "queryFn" + > +) => { + return useQuery({ + queryKey: auditLogStreamKeys.getById(provider, logStreamId), + queryFn: async () => { + const { data } = await apiRequest.get<{ auditLogStream: TAuditLogStreamProviderMap[T] }>( + `/api/v1/audit-log-streams/${provider}/${logStreamId}` + ); + + return data.auditLogStream; + }, + ...options + }); +}; diff --git a/frontend/src/hooks/api/auditLogStreams/types.ts b/frontend/src/hooks/api/auditLogStreams/types.ts deleted file mode 100644 index 8e21a3209..000000000 --- a/frontend/src/hooks/api/auditLogStreams/types.ts +++ /dev/null @@ -1,28 +0,0 @@ -export type LogStreamHeaders = { - key: string; - value: string; -}; - -export type TAuditLogStream = { - id: string; - url: string; - headers?: LogStreamHeaders[]; -}; - -export type TCreateAuditLogStreamDTO = { - url: string; - headers?: LogStreamHeaders[]; - orgId: string; -}; - -export type TUpdateAuditLogStreamDTO = { - id: string; - url?: string; - headers?: LogStreamHeaders[]; - orgId: string; -}; - -export type TDeleteAuditLogStreamDTO = { - id: string; - orgId: string; -}; diff --git a/frontend/src/hooks/api/auditLogStreams/types/index.ts b/frontend/src/hooks/api/auditLogStreams/types/index.ts new file mode 100644 index 000000000..d3dffe6a9 --- /dev/null +++ b/frontend/src/hooks/api/auditLogStreams/types/index.ts @@ -0,0 +1,25 @@ +import { LogProvider } from "../enums"; +import { TCustomProviderLogStream } from "./providers/custom-provider"; +import { TDatadogProviderLogStream } from "./providers/datadog-provider"; +import { TSplunkProviderLogStream } from "./providers/splunk-provider"; + +export type TAuditLogStream = + | TCustomProviderLogStream + | TDatadogProviderLogStream + | TSplunkProviderLogStream; + +export type TAuditLogStreamProviderMap = { + [LogProvider.Custom]: TCustomProviderLogStream; + [LogProvider.Datadog]: TDatadogProviderLogStream; + [LogProvider.Splunk]: TSplunkProviderLogStream; +}; + +export type TCreateAuditLogStreamDTO = Pick; +export type TUpdateAuditLogStreamDTO = Pick & { + provider: LogProvider; + auditLogStreamId: string; +}; +export type TDeleteAuditLogStreamDTO = { + provider: LogProvider; + auditLogStreamId: string; +}; diff --git a/frontend/src/hooks/api/auditLogStreams/types/provider-options.ts b/frontend/src/hooks/api/auditLogStreams/types/provider-options.ts new file mode 100644 index 000000000..e9b06dfef --- /dev/null +++ b/frontend/src/hooks/api/auditLogStreams/types/provider-options.ts @@ -0,0 +1,11 @@ +import { LogProvider } from "../enums"; + +export type TAuditLogStreamProviderOptionBase = { + name: string; +}; + +export type TAuditLogStreamProviderOption = { + [P in keyof typeof LogProvider]: TAuditLogStreamProviderOptionBase & { + provider: (typeof LogProvider)[P]; + }; +}[keyof typeof LogProvider]; diff --git a/frontend/src/hooks/api/auditLogStreams/types/providers/custom-provider.ts b/frontend/src/hooks/api/auditLogStreams/types/providers/custom-provider.ts new file mode 100644 index 000000000..83ff9e010 --- /dev/null +++ b/frontend/src/hooks/api/auditLogStreams/types/providers/custom-provider.ts @@ -0,0 +1,10 @@ +import { LogProvider } from "../../enums"; +import { TRootProviderLogStream } from "./root-provider"; + +export type TCustomProviderLogStream = TRootProviderLogStream & { + provider: LogProvider.Custom; + credentials: { + url: string; + headers: { key: string; value: string }[]; + }; +}; diff --git a/frontend/src/hooks/api/auditLogStreams/types/providers/datadog-provider.ts b/frontend/src/hooks/api/auditLogStreams/types/providers/datadog-provider.ts new file mode 100644 index 000000000..85198bb1a --- /dev/null +++ b/frontend/src/hooks/api/auditLogStreams/types/providers/datadog-provider.ts @@ -0,0 +1,10 @@ +import { LogProvider } from "../../enums"; +import { TRootProviderLogStream } from "./root-provider"; + +export type TDatadogProviderLogStream = TRootProviderLogStream & { + provider: LogProvider.Datadog; + credentials: { + url: string; + token: string; + }; +}; diff --git a/frontend/src/hooks/api/auditLogStreams/types/providers/root-provider.ts b/frontend/src/hooks/api/auditLogStreams/types/providers/root-provider.ts new file mode 100644 index 000000000..5ea3137e5 --- /dev/null +++ b/frontend/src/hooks/api/auditLogStreams/types/providers/root-provider.ts @@ -0,0 +1,6 @@ +export type TRootProviderLogStream = { + id: string; + orgId: string; + createdAt: string; + updatedAt: string; +}; diff --git a/frontend/src/hooks/api/auditLogStreams/types/providers/splunk-provider.ts b/frontend/src/hooks/api/auditLogStreams/types/providers/splunk-provider.ts new file mode 100644 index 000000000..bf5c676ef --- /dev/null +++ b/frontend/src/hooks/api/auditLogStreams/types/providers/splunk-provider.ts @@ -0,0 +1,10 @@ +import { LogProvider } from "../../enums"; +import { TRootProviderLogStream } from "./root-provider"; + +export type TSplunkProviderLogStream = TRootProviderLogStream & { + provider: LogProvider.Splunk; + credentials: { + hostname: string; + token: string; + }; +}; diff --git a/frontend/src/hooks/api/ca/types.ts b/frontend/src/hooks/api/ca/types.ts index 8dd874a75..336688ca4 100644 --- a/frontend/src/hooks/api/ca/types.ts +++ b/frontend/src/hooks/api/ca/types.ts @@ -16,6 +16,8 @@ export type TAcmeCertificateAuthority = { }; directoryUrl: string; accountEmail: string; + eabKid?: string; + eabHmacKey?: string; }; }; diff --git a/frontend/src/hooks/api/dashboard/queries.tsx b/frontend/src/hooks/api/dashboard/queries.tsx index e748e3e5b..fde3a5ee3 100644 --- a/frontend/src/hooks/api/dashboard/queries.tsx +++ b/frontend/src/hooks/api/dashboard/queries.tsx @@ -1,5 +1,6 @@ import { useCallback } from "react"; import { useQuery, UseQueryOptions } from "@tanstack/react-query"; +import { AxiosError } from "axios"; import { apiRequest } from "@app/config/request"; import { @@ -273,6 +274,12 @@ export const useGetProjectSecretsDetails = ( ...options, // wait for all values to be available enabled: Boolean(projectId) && (options?.enabled ?? true), + retry: (count, error) => { + // don't retry 404s + if (error instanceof AxiosError && error.status === 404) return false; + + return count <= 5; + }, queryKey: dashboardKeys.getProjectSecretsDetails({ secretPath, search, diff --git a/frontend/src/hooks/api/dashboard/types.ts b/frontend/src/hooks/api/dashboard/types.ts index 78c56394f..fbd5107cd 100644 --- a/frontend/src/hooks/api/dashboard/types.ts +++ b/frontend/src/hooks/api/dashboard/types.ts @@ -72,7 +72,7 @@ export type DashboardProjectSecretsOverview = Omit< DashboardProjectSecretsOverviewResponse, "secrets" | "secretRotations" > & { - secrets?: SecretV3RawSanitized[]; + secrets?: (SecretV3RawSanitized & { sourceEnv?: string })[]; secretRotations?: (TSecretRotationV2 & { secrets: (SecretV3RawSanitized | null)[]; })[]; diff --git a/frontend/src/hooks/api/githubOrgSyncConfig/index.tsx b/frontend/src/hooks/api/githubOrgSyncConfig/index.tsx index 585426469..66b0246dc 100644 --- a/frontend/src/hooks/api/githubOrgSyncConfig/index.tsx +++ b/frontend/src/hooks/api/githubOrgSyncConfig/index.tsx @@ -1,6 +1,7 @@ export { useCreateGithubSyncOrgConfig, useDeleteGithubSyncOrgConfig, + useSyncAllGithubTeams, useUpdateGithubSyncOrgConfig } from "./mutations"; export { githubOrgSyncConfigQueryKeys } from "./queries"; diff --git a/frontend/src/hooks/api/githubOrgSyncConfig/mutations.tsx b/frontend/src/hooks/api/githubOrgSyncConfig/mutations.tsx index 0cb9b56e8..3c78550ed 100644 --- a/frontend/src/hooks/api/githubOrgSyncConfig/mutations.tsx +++ b/frontend/src/hooks/api/githubOrgSyncConfig/mutations.tsx @@ -40,3 +40,19 @@ export const useDeleteGithubSyncOrgConfig = () => { } }); }; + +export const useSyncAllGithubTeams = () => { + return useMutation({ + mutationFn: async (): Promise<{ + totalUsers: number; + errors: string[]; + createdTeams: string[]; + updatedTeams: string[]; + removedMemberships: number; + syncDuration: number; + }> => { + const response = await apiRequest.post("/api/v1/github-org-sync-config/sync-all-teams"); + return response.data; + } + }); +}; diff --git a/frontend/src/hooks/api/migration/index.ts b/frontend/src/hooks/api/migration/index.ts index f8dd99d03..0c2adeab0 100644 --- a/frontend/src/hooks/api/migration/index.ts +++ b/frontend/src/hooks/api/migration/index.ts @@ -1 +1,2 @@ export * from "./mutations"; +export * from "./queries"; diff --git a/frontend/src/hooks/api/migration/mutations.tsx b/frontend/src/hooks/api/migration/mutations.tsx index 529d5c463..182797954 100644 --- a/frontend/src/hooks/api/migration/mutations.tsx +++ b/frontend/src/hooks/api/migration/mutations.tsx @@ -46,18 +46,21 @@ export const useImportVault = () => { vaultAccessToken, vaultNamespace, vaultUrl, - mappingType + mappingType, + gatewayId }: { vaultAccessToken: string; vaultNamespace?: string; vaultUrl: string; mappingType: string; + gatewayId?: string; }) => { await apiRequest.post("/api/v3/external-migration/vault/", { vaultAccessToken, vaultNamespace, vaultUrl, - mappingType + mappingType, + gatewayId }); } }); diff --git a/frontend/src/hooks/api/migration/queries.tsx b/frontend/src/hooks/api/migration/queries.tsx new file mode 100644 index 000000000..2279b0eea --- /dev/null +++ b/frontend/src/hooks/api/migration/queries.tsx @@ -0,0 +1,20 @@ +import { apiRequest } from "@app/config/request"; +import { useQuery } from "@tanstack/react-query"; +import { ExternalMigrationProviders } from "./types"; + +const externalMigrationQueryKeys = { + customMigrationAvailable: (provider: ExternalMigrationProviders) => [ + "custom-migration-available", + provider + ] +}; + +export const useHasCustomMigrationAvailable = (provider: ExternalMigrationProviders) => { + return useQuery({ + queryKey: externalMigrationQueryKeys.customMigrationAvailable(provider), + queryFn: () => + apiRequest.get<{ enabled: boolean }>( + `/api/v3/external-migration/custom-migration-enabled/${provider}` + ) + }); +}; diff --git a/frontend/src/hooks/api/migration/types.ts b/frontend/src/hooks/api/migration/types.ts new file mode 100644 index 000000000..945f18d8e --- /dev/null +++ b/frontend/src/hooks/api/migration/types.ts @@ -0,0 +1,4 @@ +export enum ExternalMigrationProviders { + Vault = "vault", + EnvKey = "env-key" +} diff --git a/frontend/src/hooks/api/organization/types.ts b/frontend/src/hooks/api/organization/types.ts index 71f2a8b90..e9c36fada 100644 --- a/frontend/src/hooks/api/organization/types.ts +++ b/frontend/src/hooks/api/organization/types.ts @@ -159,3 +159,8 @@ export enum OrgIdentityOrderBy { Name = "name", Role = "role" } + +export enum OrgMembershipStatus { + Invited = "invited", + Accepted = "accepted" +} diff --git a/frontend/src/hooks/api/users/types.ts b/frontend/src/hooks/api/users/types.ts index 0a43e850e..5a90d4b64 100644 --- a/frontend/src/hooks/api/users/types.ts +++ b/frontend/src/hooks/api/users/types.ts @@ -19,10 +19,10 @@ export type User = { createdAt: Date; updatedAt: Date; username: string; - email?: string; + email?: string | null; superAdmin: boolean; - firstName?: string; - lastName?: string; + firstName?: string | null; + lastName?: string | null; authProvider?: AuthMethod; authMethods: AuthMethod[]; isMfaEnabled: boolean; diff --git a/frontend/src/hooks/api/workspace/queries.tsx b/frontend/src/hooks/api/workspace/queries.tsx index 7a0e3d2e2..3c7a6d30c 100644 --- a/frontend/src/hooks/api/workspace/queries.tsx +++ b/frontend/src/hooks/api/workspace/queries.tsx @@ -47,7 +47,8 @@ import { UpdateEnvironmentDTO, UpdatePitVersionLimitDTO, UpdateProjectDTO, - Workspace + Workspace, + WorkspaceEnv } from "./types"; export const fetchWorkspaceById = async (workspaceId: string) => { @@ -396,12 +397,16 @@ export const useDeleteWorkspace = () => { export const useCreateWsEnvironment = () => { const queryClient = useQueryClient(); - return useMutation({ - mutationFn: ({ workspaceId, name, slug }) => { - return apiRequest.post(`/api/v1/workspace/${workspaceId}/environments`, { - name, - slug - }); + return useMutation({ + mutationFn: async ({ workspaceId, name, slug }) => { + const { data } = await apiRequest.post<{ environment: WorkspaceEnv }>( + `/api/v1/workspace/${workspaceId}/environments`, + { + name, + slug + } + ); + return data.environment; }, onSuccess: () => { queryClient.invalidateQueries({ diff --git a/frontend/src/hooks/useResizableColWidth.tsx b/frontend/src/hooks/useResizableColWidth.tsx index f2ad80625..6af269217 100644 --- a/frontend/src/hooks/useResizableColWidth.tsx +++ b/frontend/src/hooks/useResizableColWidth.tsx @@ -1,12 +1,13 @@ -import { MouseEvent, useCallback, useEffect, useRef, useState } from "react"; +import { MouseEvent, RefObject, useCallback, useEffect, useRef, useState } from "react"; type Params = { minWidth: number; maxWidth: number; initialWidth: number; + ref: RefObject; }; -export const useResizableColWidth = ({ minWidth, maxWidth, initialWidth }: Params) => { +export const useResizableColWidth = ({ minWidth, maxWidth, initialWidth, ref }: Params) => { const [colWidth, setColWidth] = useState(initialWidth); const [isResizing, setIsResizing] = useState(false); const startX = useRef(0); @@ -63,6 +64,28 @@ export const useResizableColWidth = ({ minWidth, maxWidth, initialWidth }: Param }; }, [isResizing, handleMouseMove, handleMouseUp]); + useEffect(() => { + const element = ref?.current; + if (!element) return; + + const handleResize = () => { + if (colWidth > maxWidth) { + setColWidth(Math.max(maxWidth, minWidth)); + } else if (ref.current?.clientWidth && colWidth > ref.current.clientWidth * 0.9) { + // this else is a fallback to ensure col is always visible + setColWidth(initialWidth); + } + }; + + const resizeObserver = new ResizeObserver(handleResize); + resizeObserver.observe(element); + + // eslint-disable-next-line consistent-return + return () => { + resizeObserver.disconnect(); + }; + }, [ref, maxWidth, colWidth]); + return { colWidth, handleMouseDown, diff --git a/frontend/src/hooks/utils/secrets-overview.tsx b/frontend/src/hooks/utils/secrets-overview.tsx index e136df3f2..d77b41f5f 100644 --- a/frontend/src/hooks/utils/secrets-overview.tsx +++ b/frontend/src/hooks/utils/secrets-overview.tsx @@ -130,7 +130,11 @@ export const useSecretOverview = (secrets: DashboardProjectSecretsOverview["secr const getEnvSecretKeyCount = useCallback( (env: string) => { - return secrets?.filter((secret) => secret.env === env).length ?? 0; + return ( + secrets?.filter((secret) => + secret.sourceEnv ? secret.sourceEnv === env : secret.env === env + ).length ?? 0 + ); }, [secrets] ); diff --git a/frontend/src/layouts/AdminLayout/AdminLayout.tsx b/frontend/src/layouts/AdminLayout/AdminLayout.tsx index 097654f26..21be0bb82 100644 --- a/frontend/src/layouts/AdminLayout/AdminLayout.tsx +++ b/frontend/src/layouts/AdminLayout/AdminLayout.tsx @@ -1,11 +1,15 @@ import { useTranslation } from "react-i18next"; import { faMobile } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { Outlet, useRouterState } from "@tanstack/react-router"; +import { Outlet } from "@tanstack/react-router"; import { Banner } from "@app/components/page-frames/Banner"; -import { BreadcrumbContainer, TBreadcrumbFormat } from "@app/components/v2"; -import { useServerConfig } from "@app/context"; +import { useServerConfig, useSubscription } from "@app/context"; +import { useFetchServerStatus } from "@app/hooks/api"; +import { AuditLogBanner } from "@app/layouts/OrganizationLayout/components/AuditLogBanner"; +import { Navbar } from "@app/layouts/OrganizationLayout/components/NavBar"; +import { RedisBanner } from "@app/layouts/OrganizationLayout/components/RedisBanner"; +import { SmtpBanner } from "@app/layouts/OrganizationLayout/components/SmtpBanner"; import { InsecureConnectionBanner } from "../OrganizationLayout/components/InsecureConnectionBanner"; import { AdminSidebar } from "./Sidebar"; @@ -13,26 +17,27 @@ import { AdminSidebar } from "./Sidebar"; export const AdminLayout = () => { const { t } = useTranslation(); const { config } = useServerConfig(); - - const matches = useRouterState({ select: (s) => s.matches.at(-1)?.context }); - - const breadcrumbs = matches && "breadcrumbs" in matches ? matches.breadcrumbs : undefined; + const { data: serverDetails, isLoading } = useFetchServerStatus(); + const { subscription } = useSubscription(); const containerHeight = config.pageFrameContent ? "h-[94vh]" : "h-screen"; return ( <> -
diff --git a/frontend/src/layouts/AdminLayout/Sidebar.tsx b/frontend/src/layouts/AdminLayout/Sidebar.tsx index e1cd223f8..25b327102 100644 --- a/frontend/src/layouts/AdminLayout/Sidebar.tsx +++ b/frontend/src/layouts/AdminLayout/Sidebar.tsx @@ -1,57 +1,62 @@ -import { faChevronLeft } from "@fortawesome/free-solid-svg-icons"; +import { faCheckCircle } from "@fortawesome/free-regular-svg-icons"; +import { + faBuilding, + faChevronLeft, + faCog, + faDatabase, + faKey, + faLock, + faPlug, + faUserTie +} from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Link, useMatchRoute } from "@tanstack/react-router"; -import { Lottie, Menu, MenuGroup, MenuItem } from "@app/components/v2"; +import { Menu, MenuGroup, MenuItem } from "@app/components/v2"; const generalTabs = [ { label: "General", - icon: "settings-cog", + icon: faCog, link: "/admin/" }, { label: "Encryption", - icon: "lock-closed", + icon: faLock, link: "/admin/encryption" }, { label: "Authentication", - icon: "check", + icon: faCheckCircle, link: "/admin/authentication" }, { label: "Integrations", - icon: "sliding-carousel", + icon: faPlug, link: "/admin/integrations" }, { label: "Caching", - icon: "note", + icon: faDatabase, link: "/admin/caching" }, { label: "Environment Variables", - icon: "unlock", + icon: faKey, link: "/admin/environment" } ]; -const resourceTabs = [ +const othersTabs = [ { - label: "Organizations", - icon: "groups", - link: "/admin/resources/organizations" + label: "Access Controls", + icon: faUserTie, + link: "/admin/access-management" }, { - label: "User Identities", - icon: "user", - link: "/admin/resources/user-identities" - }, - { - label: "Machine Identities", - icon: "wrench", - link: "/admin/resources/machine-identities" + label: "Resource Overview", + icon: faBuilding, + link: "/admin/resources/overview" } ]; @@ -61,6 +66,44 @@ export const AdminSidebar = () => { return ( ); diff --git a/frontend/src/layouts/OrganizationLayout/components/AuditLogBanner/AuditLogBanner.tsx b/frontend/src/layouts/OrganizationLayout/components/AuditLogBanner/AuditLogBanner.tsx index 9f7494076..755611587 100644 --- a/frontend/src/layouts/OrganizationLayout/components/AuditLogBanner/AuditLogBanner.tsx +++ b/frontend/src/layouts/OrganizationLayout/components/AuditLogBanner/AuditLogBanner.tsx @@ -1,12 +1,10 @@ -import { useOrganization } from "@app/context"; -import { useFetchServerStatus, useGetAuditLogStreams } from "@app/hooks/api"; +import { useFetchServerStatus, useListAuditLogStreams } from "@app/hooks/api"; import { OrgAlertBanner } from "../OrgAlertBanner"; export const AuditLogBanner = () => { - const org = useOrganization(); const { data: status, isLoading: isLoadingStatus } = useFetchServerStatus(); - const { data: streams, isLoading: isLoadingStreams } = useGetAuditLogStreams(org.currentOrg.id); + const { data: streams, isLoading: isLoadingStreams } = useListAuditLogStreams(); if (isLoadingStreams || isLoadingStatus || !streams) return null; diff --git a/frontend/src/layouts/OrganizationLayout/components/NavBar/Navbar.tsx b/frontend/src/layouts/OrganizationLayout/components/NavBar/Navbar.tsx index 3bda912dd..f72fa7975 100644 --- a/frontend/src/layouts/OrganizationLayout/components/NavBar/Navbar.tsx +++ b/frontend/src/layouts/OrganizationLayout/components/NavBar/Navbar.tsx @@ -10,13 +10,14 @@ import { faEnvelope, faInfo, faInfoCircle, + faServer, faSignOut, faUser, faUsers } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useQueryClient } from "@tanstack/react-query"; -import { Link, useNavigate, useRouter, useRouterState } from "@tanstack/react-router"; +import { Link, useLocation, useNavigate, useRouter, useRouterState } from "@tanstack/react-router"; import { Mfa } from "@app/components/auth/Mfa"; import { createNotification } from "@app/components/notifications"; @@ -136,6 +137,7 @@ export const Navbar = () => { [notifications] ); + const location = useLocation(); const matches = useRouterState({ select: (s) => s.matches.at(-1)?.context }); const breadcrumbs = matches && "breadcrumbs" in matches ? matches.breadcrumbs : undefined; @@ -197,6 +199,8 @@ export const Navbar = () => { ); } + const isServerAdminPanel = location.pathname.startsWith("/admin"); + return (
@@ -205,96 +209,117 @@ export const Navbar = () => {

/

-
- - -
-
- -
-
{currentOrg?.name}
-
- {getPlan(subscription)} -
-
- - -
- - - -
-
- + -
organizations
- {orgs?.map((org) => { - return ( - - + + +
+ + +
organizations
+ {orgs?.map((org) => { + return ( + + + + ); + })} +
+ } onClick={logOutUser}> + Log Out - ); - })} -
- } onClick={logOutUser}> - Log Out - - - -
-

/

- {breadcrumbs ? ( - - ) : null} + + +
+

/

+ {breadcrumbs ? ( + + ) : null} + + )}
diff --git a/frontend/src/layouts/OrganizationLayout/components/OrgAlertBanner/OrgAlertBanner.tsx b/frontend/src/layouts/OrganizationLayout/components/OrgAlertBanner/OrgAlertBanner.tsx index de4b65a71..80adce989 100644 --- a/frontend/src/layouts/OrganizationLayout/components/OrgAlertBanner/OrgAlertBanner.tsx +++ b/frontend/src/layouts/OrganizationLayout/components/OrgAlertBanner/OrgAlertBanner.tsx @@ -27,11 +27,11 @@ export const OrgAlertBanner = ({ text, link }: Props) => { target="_blank" className="group flex items-center" > - + here diff --git a/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx b/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx index 2b4fcff80..995083ee7 100644 --- a/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx +++ b/frontend/src/layouts/ProjectLayout/components/AssumePrivilegeModeBanner/AssumePrivilegeModeBanner.tsx @@ -36,7 +36,10 @@ export const AssumePrivilegeModeBanner = () => { }, { onSuccess: () => { - const url = getProjectHomePage(currentWorkspace.type); + const url = getProjectHomePage( + currentWorkspace.type, + currentWorkspace.environments + ); window.location.href = url.replace("$projectId", currentWorkspace.id); } } diff --git a/frontend/src/layouts/ProjectLayout/components/ProjectSelect/ProjectSelect.tsx b/frontend/src/layouts/ProjectLayout/components/ProjectSelect/ProjectSelect.tsx index b66717a5c..ebc28a227 100644 --- a/frontend/src/layouts/ProjectLayout/components/ProjectSelect/ProjectSelect.tsx +++ b/frontend/src/layouts/ProjectLayout/components/ProjectSelect/ProjectSelect.tsx @@ -101,7 +101,7 @@ export const ProjectSelect = () => {
{ // to reproduce change this back to router.push and switch between two projects with different env count // look into this on dashboard revamp const url = linkOptions({ - to: getProjectHomePage(workspace.type), + to: getProjectHomePage(workspace.type, workspace.environments), params: { projectId: workspace.id } diff --git a/frontend/src/layouts/SecretManagerLayout/SecretManagerLayout.tsx b/frontend/src/layouts/SecretManagerLayout/SecretManagerLayout.tsx index ad31d9017..0584e8e9c 100644 --- a/frontend/src/layouts/SecretManagerLayout/SecretManagerLayout.tsx +++ b/frontend/src/layouts/SecretManagerLayout/SecretManagerLayout.tsx @@ -11,7 +11,7 @@ import { faVault } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { Link, Outlet } from "@tanstack/react-router"; +import { Link, Outlet, useLocation } from "@tanstack/react-router"; import { motion } from "framer-motion"; import { Badge, Lottie, Menu, MenuGroup, MenuItem } from "@app/components/v2"; @@ -31,6 +31,7 @@ export const SecretManagerLayout = () => { const { t } = useTranslation(); const workspaceId = currentWorkspace?.id || ""; const projectSlug = currentWorkspace?.slug || ""; + const location = useLocation(); const { data: secretApprovalReqCount } = useGetSecretApprovalRequestCount({ workspaceId @@ -73,11 +74,21 @@ export const SecretManagerLayout = () => { {({ isActive }) => ( - +
diff --git a/frontend/src/pages/admin/OrganizationResourcesPage/OrganizationResourcesPage.tsx b/frontend/src/pages/admin/AccessManagementPage/AccessManagementPage.tsx similarity index 60% rename from frontend/src/pages/admin/OrganizationResourcesPage/OrganizationResourcesPage.tsx rename to frontend/src/pages/admin/AccessManagementPage/AccessManagementPage.tsx index 34bc0e57b..8128a53e0 100644 --- a/frontend/src/pages/admin/OrganizationResourcesPage/OrganizationResourcesPage.tsx +++ b/frontend/src/pages/admin/AccessManagementPage/AccessManagementPage.tsx @@ -3,23 +3,23 @@ import { useTranslation } from "react-i18next"; import { PageHeader } from "@app/components/v2"; -import { OrganizationsTable } from "./components"; +import { ServerAdminsTable } from "./components"; -export const OrganizationResourcesPage = () => { +export const AccessManagementPage = () => { const { t } = useTranslation(); return (
- {t("common.head-title", { title: "Admin" })} + {t("common.head-title", { title: "Access Control" })}
- +
diff --git a/frontend/src/pages/admin/AccessManagementPage/components/AddServerAdminModal.tsx b/frontend/src/pages/admin/AccessManagementPage/components/AddServerAdminModal.tsx new file mode 100644 index 000000000..aa02d40e8 --- /dev/null +++ b/frontend/src/pages/admin/AccessManagementPage/components/AddServerAdminModal.tsx @@ -0,0 +1,141 @@ +import { useMemo, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; + +import { createNotification } from "@app/components/notifications"; +import { Button, FilterableSelect, FormControl, Modal, ModalContent } from "@app/components/v2"; +import { useDebounce } from "@app/hooks"; +import { useAdminGetUsers, useAdminGrantServerAdminAccess } from "@app/hooks/api"; +import { User } from "@app/hooks/api/users/types"; + +type Props = { + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; +}; + +type ContentProps = { + onClose: () => void; +}; + +const getUserLabel = (user: Pick) => { + const { firstName, lastName, username, email } = user; + + const name = `${firstName ?? ""} ${lastName ?? ""}`.trim(); + const userEmail = email || username; + + if (!name) return userEmail; + + return `${name}${userEmail ? ` (${userEmail})` : ""}`; +}; + +const AddServerAdminSchema = z.object({ + user: z.object({ + id: z.string(), + firstName: z.string().nullish(), + lastName: z.string().nullish(), + email: z.string().nullish(), + username: z.string() + }) +}); + +type FormData = z.infer; + +const Content = ({ onClose }: ContentProps) => { + const grantAdmin = useAdminGrantServerAdminAccess(); + + const { + handleSubmit, + control, + formState: { isSubmitting } + } = useForm({ + resolver: zodResolver(AddServerAdminSchema) + }); + + const [searchUserFilter, setSearchUserFilter] = useState(""); + const [debouncedSearchTerm, setDebouncedSearchTerm] = useDebounce(searchUserFilter, 500); + + const { data, isFetching } = useAdminGetUsers( + { + limit: 20, + searchTerm: debouncedSearchTerm, + adminsOnly: false + }, + { + placeholderData: (prev) => prev + } + ); + + const users = useMemo(() => data?.pages.flat().filter((user) => !user.superAdmin) ?? [], [data]); + + const onSubmit = async ({ user }: FormData) => { + try { + await grantAdmin.mutateAsync(user.id); + + createNotification({ + type: "success", + text: "Successfully granted server admin status" + }); + onClose(); + } catch { + createNotification({ + text: "Failed to grant server admin status", + type: "error" + }); + } + }; + + return ( +
+ ( + + getUserLabel(user)} + getOptionValue={(user) => user.id} + value={field.value} + onChange={field.onChange} + onInputChange={(value) => { + setSearchUserFilter(value); + if (!value) setDebouncedSearchTerm(""); + }} + /> + + )} + control={control} + name="user" + /> +
+ + +
+ + ); +}; + +export const AddServerAdminModal = ({ isOpen, onOpenChange }: Props) => { + return ( + + + onOpenChange(false)} /> + + + ); +}; diff --git a/frontend/src/pages/admin/AccessManagementPage/components/ServerAdminsTable.tsx b/frontend/src/pages/admin/AccessManagementPage/components/ServerAdminsTable.tsx new file mode 100644 index 000000000..e9298c62b --- /dev/null +++ b/frontend/src/pages/admin/AccessManagementPage/components/ServerAdminsTable.tsx @@ -0,0 +1,476 @@ +import { Dispatch, SetStateAction, useState } from "react"; +import { + faEllipsisV, + faMagnifyingGlass, + faPlus, + faShieldHalved, + faTrash, + faUsers, + faUserXmark, + faWarning, + faXmark +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { InfiniteData } from "@tanstack/react-query"; +import { twMerge } from "tailwind-merge"; + +import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal"; +import { createNotification } from "@app/components/notifications"; +import { + Badge, + Button, + Checkbox, + DeleteActionModal, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + EmptyState, + IconButton, + Input, + Table, + TableContainer, + TableSkeleton, + TBody, + Td, + Th, + THead, + Tooltip, + Tr +} from "@app/components/v2"; +import { useSubscription, useUser } from "@app/context"; +import { useDebounce, usePopUp } from "@app/hooks"; +import { + useAdminBulkDeleteUsers, + useAdminDeleteUser, + useAdminGetUsers, + useRemoveUserServerAdminAccess +} from "@app/hooks/api"; +import { User } from "@app/hooks/api/users/types"; +import { UsePopUpState } from "@app/hooks/usePopUp"; +import { AddServerAdminModal } from "@app/pages/admin/AccessManagementPage/components/AddServerAdminModal"; + +const removeServerAdminUpgradePlanMessage = "Removing Server Admin permissions from user"; + +const ServerAdminsPanelTable = ({ + handlePopUpOpen, + users: usersPages, + isPending, + searchUserFilter, + setSearchUserFilter, + isFetchingNextPage, + fetchNextPage, + hasNextPage, + selectedUsers, + setSelectedUsers +}: { + handlePopUpOpen: ( + popUpName: keyof UsePopUpState< + ["removeUser", "upgradePlan", "addServerAdmin", "removeServerAdmin"] + >, + data?: { + username: string; + id: string; + message?: string; + } + ) => void; + isPending: boolean; + users: InfiniteData | undefined; + searchUserFilter: string; + setSearchUserFilter: (filter: string) => void; + selectedUsers: User[]; + setSelectedUsers: Dispatch>; + isFetchingNextPage: boolean; + fetchNextPage: () => void; + hasNextPage: boolean; +}) => { + const { subscription } = useSubscription(); + + const users = usersPages?.pages.flat(); + + const isEmpty = !isPending && !users?.length; + + const selectedUserIds = selectedUsers.map((user) => user.id); + + const isPageSelected = users?.length + ? users.every((user) => selectedUserIds.includes(user.id)) + : false; + + // eslint-disable-next-line no-nested-ternary + const isPageIndeterminate = isPageSelected + ? false + : users?.length + ? users?.some((user) => selectedUserIds.includes(user.id)) + : false; + + return ( + <> +
+ setSearchUserFilter(e.target.value)} + leftIcon={} + placeholder="Search admins..." + className="flex-1" + /> + +
+
+ + + + + + + + + + + {isPending && } + {!isPending && + users?.map((user) => { + const { username, email, firstName, lastName, id } = user; + const name = firstName || lastName ? `${firstName} ${lastName}` : null; + + const isSelected = selectedUserIds.includes(id); + return ( + + + + + + + ); + })} + +
+ { + if (isPageSelected) { + setSelectedUsers((prev) => + prev.filter((u) => !users?.find((user) => user.id === u.id)) + ); + } else { + setSelectedUsers((prev) => [ + ...prev, + ...(users?.filter((u) => !prev.find((user) => user.id === u.id)) ?? []) + ]); + } + }} + /> + NameUsername +
+ { + e.stopPropagation(); + setSelectedUsers((prev) => + isSelected ? prev.filter((u) => u.id !== id) : [...prev, user] + ); + }} + /> + +

+ {name ?? Not Set} +

+
+

{username || email}

+
+
+ + + + + + + + { + e.stopPropagation(); + handlePopUpOpen("removeUser", { username, id }); + }} + icon={} + > + Remove User + + + + +
+ } + onClick={(e) => { + e.stopPropagation(); + if (!subscription?.instanceUserManagement) { + handlePopUpOpen("upgradePlan", { + username, + id, + message: removeServerAdminUpgradePlanMessage + }); + return; + } + handlePopUpOpen("removeServerAdmin", { username, id }); + }} + > + Remove Server Admin + + + + +
+ {!isPending && isEmpty && } +
+ {!isEmpty && ( + + )} +
+ + ); +}; + +export const ServerAdminsTable = () => { + const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ + "removeUser", + "upgradePlan", + "addServerAdmin", + "removeServerAdmin", + "removeUsers" + ] as const); + + const { + user: { id: userId } + } = useUser(); + + const { mutateAsync: deleteUser } = useAdminDeleteUser(); + const { mutateAsync: deleteUsers } = useAdminBulkDeleteUsers(); + const { mutateAsync: removeAdminAccess } = useRemoveUserServerAdminAccess(); + + const [selectedUsers, setSelectedUsers] = useState([]); + const [searchUserFilter, setSearchUserFilter] = useState(""); + const [debouncedSearchTerm] = useDebounce(searchUserFilter, 500); + + const { + data: users, + isPending, + isFetchingNextPage, + hasNextPage, + fetchNextPage + } = useAdminGetUsers({ + limit: 20, + searchTerm: debouncedSearchTerm, + adminsOnly: true + }); + + const handleRemoveUser = async () => { + const { id } = popUp?.removeUser?.data as { id: string; username: string }; + + try { + await deleteUser(id); + createNotification({ + type: "success", + text: "Successfully deleted user" + }); + } catch { + createNotification({ + type: "error", + text: "Error deleting user" + }); + } + + handlePopUpClose("removeUser"); + }; + + const handleRemoveServerAdminAccess = async () => { + const { id } = popUp?.removeServerAdmin?.data as { id: string; username: string }; + + try { + await removeAdminAccess(id); + createNotification({ + type: "success", + text: "Successfully removed server admin access from user" + }); + } catch { + createNotification({ + type: "error", + text: "Error removing server admin access from user" + }); + } + + handlePopUpClose("removeServerAdmin"); + }; + + const handleRemoveUsers = async () => { + try { + await deleteUsers(selectedUsers.map((user) => user.id)); + + createNotification({ + text: "Successfully removed users", + type: "success" + }); + + setSelectedUsers([]); + handlePopUpClose("removeUsers"); + } catch { + createNotification({ + text: "Failed to remove users", + type: "error" + }); + } + }; + + return ( + <> +
0 && "h-16" + )} + > +
+
{selectedUsers.length} Selected
+ + +
+
+
+ + handlePopUpToggle("removeUser", isOpen)} + onDeleteApproved={handleRemoveUser} + /> + handlePopUpToggle("removeServerAdmin", isOpen)} + deleteKey="confirm" + onDeleteApproved={handleRemoveServerAdminAccess} + buttonText="Remove Access" + /> + handlePopUpToggle("addServerAdmin", isOpen)} + /> + handlePopUpToggle("upgradePlan", isOpen)} + text={`${popUp?.upgradePlan?.data?.message} is only available on Infisical's Pro plan and above.`} + /> + handlePopUpToggle("removeUsers", isOpen)} + deleteKey="confirm" + onDeleteApproved={() => handleRemoveUsers()} + buttonText="Remove" + > +
+ The following users will be deleted: +
+
+
    + {selectedUsers?.map((user) => { + const email = user.email ?? user.username; + return ( +
  • +
    +

    + {user.firstName || user.lastName ? ( + <> + {`${`${user.firstName} ${user.lastName}`.trim()} `}( + {email}) + + ) : ( + {email} + )}{" "} +

    + {userId === user.id && ( + +
    + + + Deleting Yourself + +
    +
    + )} +
    +
  • + ); + })} +
+
+
+
+ + ); +}; diff --git a/frontend/src/pages/admin/AccessManagementPage/components/index.tsx b/frontend/src/pages/admin/AccessManagementPage/components/index.tsx new file mode 100644 index 000000000..fa73b9d70 --- /dev/null +++ b/frontend/src/pages/admin/AccessManagementPage/components/index.tsx @@ -0,0 +1 @@ +export * from "./ServerAdminsTable"; diff --git a/frontend/src/pages/admin/UserIdentitiesResourcesPage/route.tsx b/frontend/src/pages/admin/AccessManagementPage/route.tsx similarity index 55% rename from frontend/src/pages/admin/UserIdentitiesResourcesPage/route.tsx rename to frontend/src/pages/admin/AccessManagementPage/route.tsx index 6d1420ee5..0980fd7e3 100644 --- a/frontend/src/pages/admin/UserIdentitiesResourcesPage/route.tsx +++ b/frontend/src/pages/admin/AccessManagementPage/route.tsx @@ -1,11 +1,11 @@ import { createFileRoute, linkOptions } from "@tanstack/react-router"; -import { UserIdentitiesResourcesPage } from "./UserIdentitiesResourcesPage"; +import { AccessManagementPage } from "./AccessManagementPage"; export const Route = createFileRoute( - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/user-identities" + "/_authenticate/_inject-org-details/admin/_admin-layout/access-management" )({ - component: UserIdentitiesResourcesPage, + component: AccessManagementPage, beforeLoad: async () => { return { breadcrumbs: [ @@ -14,9 +14,9 @@ export const Route = createFileRoute( link: linkOptions({ to: "/admin" }) }, { - label: "User Identities", + label: "Access Control", link: linkOptions({ - to: "/admin/resources/user-identities" + to: "/admin/access-management" }) } ] diff --git a/frontend/src/pages/admin/GeneralPage/GeneralPage.tsx b/frontend/src/pages/admin/GeneralPage/GeneralPage.tsx index c9215a165..e5a76e93c 100644 --- a/frontend/src/pages/admin/GeneralPage/GeneralPage.tsx +++ b/frontend/src/pages/admin/GeneralPage/GeneralPage.tsx @@ -2,11 +2,13 @@ import { Helmet } from "react-helmet"; import { useTranslation } from "react-i18next"; import { PageHeader } from "@app/components/v2"; +import { useGetServerConfig } from "@app/hooks/api/admin"; -import { GeneralPageForm } from "./components"; +import { GeneralPageForm, UsageReportSection } from "./components"; export const GeneralPage = () => { const { t } = useTranslation(); + const { data: serverConfig } = useGetServerConfig(); return (
@@ -19,7 +21,10 @@ export const GeneralPage = () => { title="General" description="Manage general settings for your Infisical instance." /> - +
+ + {serverConfig?.isOfflineUsageReportsEnabled && } +
diff --git a/frontend/src/pages/admin/GeneralPage/components/GeneralPageForm.tsx b/frontend/src/pages/admin/GeneralPage/components/GeneralPageForm.tsx index febc7f328..da15f5eea 100644 --- a/frontend/src/pages/admin/GeneralPage/components/GeneralPageForm.tsx +++ b/frontend/src/pages/admin/GeneralPage/components/GeneralPageForm.tsx @@ -103,7 +103,7 @@ export const GeneralPageForm = () => { return (
diff --git a/frontend/src/pages/admin/GeneralPage/components/UsageReportSection.tsx b/frontend/src/pages/admin/GeneralPage/components/UsageReportSection.tsx new file mode 100644 index 000000000..d05800996 --- /dev/null +++ b/frontend/src/pages/admin/GeneralPage/components/UsageReportSection.tsx @@ -0,0 +1,53 @@ +import { faDownload, faFileAlt, faSpinner } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { createNotification } from "@app/components/notifications"; +import { Button, Card, CardTitle } from "@app/components/v2"; +import { downloadFile } from "@app/helpers/download"; +import { useGenerateUsageReport } from "@app/hooks/api/admin/mutation"; + +export const UsageReportSection = () => { + const generateUsageReport = useGenerateUsageReport(); + + const handleGenerateReport = async () => { + try { + const response = await generateUsageReport.mutateAsync(); + const { csvContent, filename } = response; + + downloadFile(csvContent, filename, "text/csv"); + + createNotification({ + text: `Usage report downloaded: "${filename}"`, + type: "success" + }); + } catch (error) { + console.error("Failed to generate usage report:", error); + createNotification({ + text: "Failed to generate usage report. Please try again.", + type: "error" + }); + } + }; + + return ( + + + + Offline Usage Reports + + +
+ Generate secure usage reports for offline license compliance and billing verification. +
+ + +
+ ); +}; diff --git a/frontend/src/pages/admin/GeneralPage/components/index.ts b/frontend/src/pages/admin/GeneralPage/components/index.ts index 15ea2f5ba..2ec57dadf 100644 --- a/frontend/src/pages/admin/GeneralPage/components/index.ts +++ b/frontend/src/pages/admin/GeneralPage/components/index.ts @@ -1 +1,2 @@ export { GeneralPageForm } from "./GeneralPageForm"; +export { UsageReportSection } from "./UsageReportSection"; diff --git a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/MachineIdentitiesResourcesPage.tsx b/frontend/src/pages/admin/MachineIdentitiesResourcesPage/MachineIdentitiesResourcesPage.tsx deleted file mode 100644 index b3faefcbf..000000000 --- a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/MachineIdentitiesResourcesPage.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Helmet } from "react-helmet"; -import { useTranslation } from "react-i18next"; - -import { PageHeader } from "@app/components/v2"; - -import { MachineIdentitiesTable } from "./components"; - -export const MachineIdentitiesResourcesPage = () => { - const { t } = useTranslation(); - - return ( -
- - {t("common.head-title", { title: "Admin" })} - -
-
- - -
-
-
- ); -}; diff --git a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/components/index.tsx b/frontend/src/pages/admin/MachineIdentitiesResourcesPage/components/index.tsx deleted file mode 100644 index 007cc568a..000000000 --- a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/components/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { MachineIdentitiesTable } from "./MachineIdentitiesTable"; diff --git a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/route.tsx b/frontend/src/pages/admin/MachineIdentitiesResourcesPage/route.tsx deleted file mode 100644 index 359db53b2..000000000 --- a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/route.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { createFileRoute, linkOptions } from "@tanstack/react-router"; - -import { MachineIdentitiesResourcesPage } from "./MachineIdentitiesResourcesPage"; - -export const Route = createFileRoute( - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/machine-identities" -)({ - component: MachineIdentitiesResourcesPage, - beforeLoad: async () => { - return { - breadcrumbs: [ - { - label: "Admin", - link: linkOptions({ to: "/admin" }) - }, - { - label: "Machine Identities", - link: linkOptions({ - to: "/admin/resources/machine-identities" - }) - } - ] - }; - } -}); diff --git a/frontend/src/pages/admin/OrganizationResourcesPage/components/OrganizationsTable.tsx b/frontend/src/pages/admin/OrganizationResourcesPage/components/OrganizationsTable.tsx deleted file mode 100644 index 0740d43bc..000000000 --- a/frontend/src/pages/admin/OrganizationResourcesPage/components/OrganizationsTable.tsx +++ /dev/null @@ -1,396 +0,0 @@ -import { useState } from "react"; -import { - faBuilding, - faCircleQuestion, - faEllipsis, - faMagnifyingGlass -} from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; - -import { createNotification } from "@app/components/notifications"; -import { - Badge, - Button, - DeleteActionModal, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, - EmptyState, - Input, - Modal, - ModalContent, - Table, - TableContainer, - TableSkeleton, - TBody, - Td, - Th, - THead, - Tooltip, - Tr -} from "@app/components/v2"; -import { useDebounce, usePopUp } from "@app/hooks"; -import { - useAdminDeleteOrganization, - useAdminDeleteOrganizationMembership, - useAdminDeleteUser, - useAdminGetOrganizations -} from "@app/hooks/api"; -import { OrganizationWithProjects } from "@app/hooks/api/admin/types"; -import { UsePopUpState } from "@app/hooks/usePopUp"; - -const ViewMembersModalContent = ({ - popUp, - handlePopUpOpen -}: { - popUp: UsePopUpState<["viewMembers"]>; - handlePopUpOpen: ( - popUpName: keyof UsePopUpState<["deleteOrganizationMembership", "deleteUser"]>, - data?: { - username?: string; - membershipId?: string; - userId?: string; - orgName?: string; - orgId?: string; - organization?: OrganizationWithProjects; - } - ) => void; -}) => { - const organization = popUp.viewMembers?.data?.organization as OrganizationWithProjects; - - return ( -
- {organization?.members?.map((member) => ( -
-
-
-

-

- {member.user.firstName ? ( -
- {member.user.firstName} {member.user.lastName} -
- ) : ( -

Not set

- )} -
-
-
{member.user.username || member.user.email}
- -
- {member.role.replace("-", " ")} - {Boolean(member.roleId) && ( - - - - )} -
-
-
-

-
-
-
- - - - - - - handlePopUpOpen("deleteOrganizationMembership", { - membershipId: member.membershipId, - orgId: organization.id, - username: member.user.username, - orgName: organization.name - }) - } - > - Remove From Organization - - handlePopUpOpen("deleteUser", { userId: member.user.id })} - > - Delete User - - - -
-
- ))} -
- ); -}; - -const ViewMembersModal = ({ - isOpen, - onOpenChange, - popUp, - handlePopUpOpen -}: { - isOpen: boolean; - onOpenChange: (isOpen: boolean) => void; - popUp: UsePopUpState<["viewMembers", "deleteOrganizationMembership", "deleteUser"]>; - handlePopUpOpen: ( - popUpName: keyof UsePopUpState<["deleteOrganizationMembership", "deleteUser"]> - ) => void; -}) => { - return ( - - { - event.preventDefault(); - }} - title="Organization Members" - subTitle="View the members of the organization." - > - - - - ); -}; - -const OrganizationsPanelTable = ({ - popUp, - handlePopUpOpen, - handlePopUpToggle -}: { - popUp: UsePopUpState< - ["deleteOrganization", "viewMembers", "deleteOrganizationMembership", "deleteUser"] - >; - handlePopUpOpen: ( - popUpName: keyof UsePopUpState< - ["deleteOrganization", "viewMembers", "deleteOrganizationMembership", "deleteUser"] - >, - data?: { - orgName?: string; - orgId?: string; - message?: string; - organization?: OrganizationWithProjects; - } - ) => void; - handlePopUpToggle: ( - popUpName: keyof UsePopUpState<["deleteOrganization", "viewMembers"]>, - isOpen?: boolean - ) => void; -}) => { - const [searchOrganizationsFilter, setSearchOrganizationsFilter] = useState(""); - const [debouncedSearchTerm] = useDebounce(searchOrganizationsFilter, 500); - - const { data, isPending, isFetchingNextPage, hasNextPage, fetchNextPage } = - useAdminGetOrganizations({ - limit: 20, - searchTerm: debouncedSearchTerm - }); - - const isEmpty = !isPending && !data?.pages?.[0].length; - - return ( - <> -
- setSearchOrganizationsFilter(e.target.value)} - leftIcon={} - placeholder="Search organizations..." - className="flex-1" - /> -
-
- - - - - - - - - - - {isPending && } - {!isPending && - data?.pages?.map((orgs) => - orgs.map((org) => { - return ( - - - - - - - ); - }) - )} - -
NameMembersProjects -
- {org.name ? ( - org.name - ) : ( - Not set - )} - - {org.members.length} {org.members.length === 1 ? "member" : "members"} - - - {org.projects.length} {org.projects.length === 1 ? "project" : "projects"} - -
- - -
- -
-
- - { - e.stopPropagation(); - handlePopUpOpen("deleteOrganization", { - orgId: org.id, - orgName: org.name - }); - }} - > - Delete Organization - - -
-
-
- {!isPending && isEmpty && } -
- {!isEmpty && ( - - )} -
- handlePopUpToggle("viewMembers", isOpen)} - /> - - ); -}; - -export const OrganizationsTable = () => { - const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ - "deleteOrganization", - "deleteOrganizationMembership", - "deleteUser", - "viewMembers" - ] as const); - - const { mutateAsync: deleteOrganization } = useAdminDeleteOrganization(); - const { mutateAsync: deleteOrganizationMembership } = useAdminDeleteOrganizationMembership(); - const { mutateAsync: deleteUser } = useAdminDeleteUser(); - - const handleDeleteOrganization = async () => { - const { orgId } = popUp?.deleteOrganization?.data as { orgId: string }; - - await deleteOrganization(orgId); - createNotification({ - type: "success", - text: "Successfully deleted organization" - }); - - handlePopUpClose("deleteOrganization"); - }; - - const handleDeleteOrganizationMembership = async () => { - const { orgId, membershipId } = popUp?.deleteOrganizationMembership?.data as { - orgId: string; - membershipId: string; - }; - - if (!orgId || !membershipId) { - return; - } - - await deleteOrganizationMembership({ organizationId: orgId, membershipId }); - createNotification({ - type: "success", - text: "Successfully removed user from organization" - }); - - handlePopUpClose("viewMembers"); - handlePopUpClose("deleteOrganizationMembership"); - }; - - const handleDeleteUser = async () => { - const { userId } = popUp?.deleteUser?.data as { userId: string }; - - if (!userId) { - return; - } - - await deleteUser(userId); - createNotification({ - type: "success", - text: "Successfully deleted user" - }); - - handlePopUpClose("viewMembers"); - handlePopUpClose("deleteUser"); - }; - - return ( -
- - handlePopUpToggle("deleteOrganization", isOpen)} - onDeleteApproved={handleDeleteOrganization} - /> - handlePopUpToggle("deleteOrganizationMembership", isOpen)} - onDeleteApproved={handleDeleteOrganizationMembership} - /> - handlePopUpToggle("deleteUser", isOpen)} - onDeleteApproved={handleDeleteUser} - /> -
- ); -}; diff --git a/frontend/src/pages/admin/OrganizationResourcesPage/components/index.tsx b/frontend/src/pages/admin/OrganizationResourcesPage/components/index.tsx deleted file mode 100644 index 9a054c599..000000000 --- a/frontend/src/pages/admin/OrganizationResourcesPage/components/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { OrganizationsTable } from "./OrganizationsTable"; diff --git a/frontend/src/pages/admin/ResourceOverviewPage/ResourceOverviewPage.tsx b/frontend/src/pages/admin/ResourceOverviewPage/ResourceOverviewPage.tsx new file mode 100644 index 000000000..e9096d39a --- /dev/null +++ b/frontend/src/pages/admin/ResourceOverviewPage/ResourceOverviewPage.tsx @@ -0,0 +1,42 @@ +import { Helmet } from "react-helmet"; +import { useTranslation } from "react-i18next"; + +import { PageHeader, Tab, TabList, TabPanel, Tabs } from "@app/components/v2"; + +import { MachineIdentitiesTable, OrganizationsTable, UserIdentitiesTable } from "./components"; + +export const ResourceOverviewPage = () => { + const { t } = useTranslation(); + + return ( +
+ + {t("common.head-title", { title: "Resource Overview" })} + +
+
+ + + + Organizations + Users + Identities + + + + + + + + + + + +
+
+
+ ); +}; diff --git a/frontend/src/pages/admin/ResourceOverviewPage/components/AddOrganizationModal.tsx b/frontend/src/pages/admin/ResourceOverviewPage/components/AddOrganizationModal.tsx new file mode 100644 index 000000000..9b96ac5c3 --- /dev/null +++ b/frontend/src/pages/admin/ResourceOverviewPage/components/AddOrganizationModal.tsx @@ -0,0 +1,203 @@ +import { useMemo, useState } from "react"; +import { Controller, useFieldArray, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; + +import { createNotification } from "@app/components/notifications"; +import { Button, FormControl, Input, Modal, ModalContent } from "@app/components/v2"; +import { CreatableSelect } from "@app/components/v2/CreatableSelect"; +import { useDebounce } from "@app/hooks"; +import { useAdminGetUsers, useServerAdminCreateOrganization } from "@app/hooks/api"; +import { User } from "@app/hooks/api/users/types"; +import { GenericResourceNameSchema } from "@app/lib/schemas"; + +type Props = { + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; +}; + +type ContentProps = { + onClose: () => void; +}; + +type Invitee = Pick; +type NewOption = { label: string; value: string }; + +const getUserLabel = (user: Invitee | NewOption) => { + if (Object.prototype.hasOwnProperty.call(user, "value")) { + return (user as NewOption).label; + } + + const { firstName, lastName, username, email } = user as Invitee; + + const name = `${firstName ?? ""} ${lastName ?? ""}`.trim(); + const userEmail = email || username; + + if (!name) return userEmail; + + return `${name}${userEmail ? ` (${userEmail})` : ""}`; +}; + +const AddOrgSchema = z.object({ + name: GenericResourceNameSchema.nonempty("Organization name required"), + invitees: z + .object({ + id: z.string(), + firstName: z.string().nullish(), + lastName: z.string().nullish(), + email: z.string().nullish(), + username: z.string().nullish() + }) + .array() + .min(1, "At least one admin is required") +}); + +type FormData = z.infer; + +const Content = ({ onClose }: ContentProps) => { + const createOrg = useServerAdminCreateOrganization(); + + const { + handleSubmit, + control, + formState: { isSubmitting } + } = useForm({ + defaultValues: { + name: "", + invitees: [] + }, + resolver: zodResolver(AddOrgSchema) + }); + + const [searchUserFilter, setSearchUserFilter] = useState(""); + const [debouncedSearchTerm, setDebouncedSearchTerm] = useDebounce(searchUserFilter, 500); + + const { data, isFetching } = useAdminGetUsers( + { + limit: 20, + searchTerm: debouncedSearchTerm, + adminsOnly: false + }, + { + placeholderData: (prev) => prev + } + ); + + const users = useMemo(() => data?.pages.flat() ?? [], [data]); + + const onSubmit = async ({ name, invitees }: FormData) => { + try { + await createOrg.mutateAsync({ + name, + inviteAdminEmails: invitees + .filter((user) => Boolean(user.email)) + .map((user) => user.email) as string[] + }); + + createNotification({ + type: "success", + text: "Successfully created organization" + }); + onClose(); + } catch { + createNotification({ + text: "Failed to create organization", + type: "error" + }); + } + }; + + const { append } = useFieldArray({ control, name: "invitees" }); + + return ( + + ( + + + + )} + control={control} + name="name" + /> + ( + + ( +

Invite new users to this organization by typing out their email address.

+ )} + onCreateOption={(inputValue) => + append({ id: `${inputValue}_${Math.random()}`, email: inputValue }) + } + formatCreateLabel={(inputValue) => `Invite "${inputValue}"`} + isValidNewOption={(input) => + Boolean(input) && + z.string().email().safeParse(input).success && + !users + ?.flatMap((user) => { + const emails: string[] = []; + + if (user.email) { + emails.push(user.email); + } + + if (user.username) { + emails.push(user.username); + } + + return emails; + }) + .includes(input) + } + isLoading={searchUserFilter !== debouncedSearchTerm || isFetching} + className="w-full" + placeholder="Search users or invite new ones..." + isMulti + name="members" + options={users} + getOptionLabel={(user) => getUserLabel(user)} + getOptionValue={(user) => user.id} + value={field.value} + onChange={field.onChange} + onInputChange={(value) => { + setSearchUserFilter(value); + if (!value) setDebouncedSearchTerm(""); + }} + /> +
+ )} + control={control} + name="invitees" + /> +
+ + +
+ + ); +}; + +export const AddOrganizationModal = ({ isOpen, onOpenChange }: Props) => { + return ( + + + onOpenChange(false)} /> + + + ); +}; diff --git a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/components/MachineIdentitiesTable.tsx b/frontend/src/pages/admin/ResourceOverviewPage/components/MachineIdentitiesTable.tsx similarity index 95% rename from frontend/src/pages/admin/MachineIdentitiesResourcesPage/components/MachineIdentitiesTable.tsx rename to frontend/src/pages/admin/ResourceOverviewPage/components/MachineIdentitiesTable.tsx index 9c44b72c4..6370bab54 100644 --- a/frontend/src/pages/admin/MachineIdentitiesResourcesPage/components/MachineIdentitiesTable.tsx +++ b/frontend/src/pages/admin/ResourceOverviewPage/components/MachineIdentitiesTable.tsx @@ -2,8 +2,8 @@ import { useState } from "react"; import { faEllipsisV, faMagnifyingGlass, - faServer, faShieldHalved, + faWrench, faXmark } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -136,7 +136,7 @@ const IdentityPanelTable = ({ )} - {!isPending && isEmpty && } + {!isPending && isEmpty && } {!isEmpty && ( + )} +
+ handlePopUpToggle("viewMembers", isOpen)} + /> + + ); +}; + +export const OrganizationsTable = () => { + const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ + "deleteOrganization", + "deleteOrganizationMembership", + "deleteUser", + "viewMembers", + "createOrganization" + ] as const); + + const { mutateAsync: deleteOrganization } = useAdminDeleteOrganization(); + const { mutateAsync: deleteOrganizationMembership } = useAdminDeleteOrganizationMembership(); + const { mutateAsync: deleteUser } = useAdminDeleteUser(); + + const handleDeleteOrganization = async () => { + const { orgId } = popUp?.deleteOrganization?.data as { orgId: string }; + + await deleteOrganization(orgId); + createNotification({ + type: "success", + text: "Successfully deleted organization" + }); + + handlePopUpClose("deleteOrganization"); + }; + + const handleDeleteOrganizationMembership = async () => { + const { orgId, membershipId } = popUp?.deleteOrganizationMembership?.data as { + orgId: string; + membershipId: string; + }; + + if (!orgId || !membershipId) { + return; + } + + await deleteOrganizationMembership({ organizationId: orgId, membershipId }); + createNotification({ + type: "success", + text: "Successfully removed user from organization" + }); + + handlePopUpClose("viewMembers"); + handlePopUpClose("deleteOrganizationMembership"); + }; + + const handleDeleteUser = async () => { + const { userId } = popUp?.deleteUser?.data as { userId: string }; + + if (!userId) { + return; + } + + await deleteUser(userId); + createNotification({ + type: "success", + text: "Successfully deleted user" + }); + + handlePopUpClose("viewMembers"); + handlePopUpClose("deleteUser"); + }; + + return ( +
+
+
+

Organizations

+

+ Manage, join and view organizations across your instance. +

+
+ +
+ + handlePopUpToggle("deleteOrganization", isOpen)} + onDeleteApproved={handleDeleteOrganization} + /> + handlePopUpToggle("deleteOrganizationMembership", isOpen)} + onDeleteApproved={handleDeleteOrganizationMembership} + /> + handlePopUpToggle("deleteUser", isOpen)} + onDeleteApproved={handleDeleteUser} + /> + handlePopUpToggle("createOrganization", isOpen)} + /> +
+ ); +}; diff --git a/frontend/src/pages/admin/UserIdentitiesResourcesPage/components/UserIdentitiesTable.tsx b/frontend/src/pages/admin/ResourceOverviewPage/components/UserIdentitiesTable.tsx similarity index 97% rename from frontend/src/pages/admin/UserIdentitiesResourcesPage/components/UserIdentitiesTable.tsx rename to frontend/src/pages/admin/ResourceOverviewPage/components/UserIdentitiesTable.tsx index 1f2471aa2..9856ee497 100644 --- a/frontend/src/pages/admin/UserIdentitiesResourcesPage/components/UserIdentitiesTable.tsx +++ b/frontend/src/pages/admin/ResourceOverviewPage/components/UserIdentitiesTable.tsx @@ -218,7 +218,7 @@ const UserPanelTable = ({
-

{email}

+

{username || email}

@@ -463,6 +463,12 @@ export const UserIdentitiesTable = () => {
+
+
+

User Identities

+

Manage user identities across your instance.

+
+
{ /> handlePopUpToggle("removeUsers", isOpen)} deleteKey="confirm" onDeleteApproved={() => handleRemoveUsers()} - buttonText="Remove" + buttonText="Delete" >
- The following members will be removed: + The following users will be deleted:
    @@ -549,7 +555,7 @@ export const UserIdentitiesTable = () => { className="ml-1 mt-[0.05rem] inline-flex w-min items-center gap-1.5 whitespace-nowrap" > - Removing Yourself + Deleting Yourself
diff --git a/frontend/src/pages/admin/ResourceOverviewPage/components/index.ts b/frontend/src/pages/admin/ResourceOverviewPage/components/index.ts new file mode 100644 index 000000000..ce70dee05 --- /dev/null +++ b/frontend/src/pages/admin/ResourceOverviewPage/components/index.ts @@ -0,0 +1,3 @@ +export * from "./MachineIdentitiesTable"; +export * from "./OrganizationsTable"; +export * from "./UserIdentitiesTable"; diff --git a/frontend/src/pages/admin/OrganizationResourcesPage/route.tsx b/frontend/src/pages/admin/ResourceOverviewPage/route.tsx similarity index 66% rename from frontend/src/pages/admin/OrganizationResourcesPage/route.tsx rename to frontend/src/pages/admin/ResourceOverviewPage/route.tsx index 9b0bf8f12..ea27c1a06 100644 --- a/frontend/src/pages/admin/OrganizationResourcesPage/route.tsx +++ b/frontend/src/pages/admin/ResourceOverviewPage/route.tsx @@ -1,11 +1,11 @@ import { createFileRoute, linkOptions } from "@tanstack/react-router"; -import { OrganizationResourcesPage } from "./OrganizationResourcesPage"; +import { ResourceOverviewPage } from "./ResourceOverviewPage"; export const Route = createFileRoute( - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/organizations" + "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview" )({ - component: OrganizationResourcesPage, + component: ResourceOverviewPage, beforeLoad: async () => { return { breadcrumbs: [ @@ -14,9 +14,9 @@ export const Route = createFileRoute( link: linkOptions({ to: "/admin" }) }, { - label: "Organizations", + label: "Resource Overview", link: linkOptions({ - to: "/admin/resources/organizations" + to: "/admin/resources/overview" }) } ] diff --git a/frontend/src/pages/admin/UserIdentitiesResourcesPage/UserIdentitiesResourcesPage.tsx b/frontend/src/pages/admin/UserIdentitiesResourcesPage/UserIdentitiesResourcesPage.tsx deleted file mode 100644 index 35c4d9466..000000000 --- a/frontend/src/pages/admin/UserIdentitiesResourcesPage/UserIdentitiesResourcesPage.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Helmet } from "react-helmet"; -import { useTranslation } from "react-i18next"; - -import { PageHeader } from "@app/components/v2"; - -import { UserIdentitiesTable } from "./components"; - -export const UserIdentitiesResourcesPage = () => { - const { t } = useTranslation(); - - return ( -
- - {t("common.head-title", { title: "Admin" })} - -
-
- - -
-
-
- ); -}; diff --git a/frontend/src/pages/admin/UserIdentitiesResourcesPage/components/index.tsx b/frontend/src/pages/admin/UserIdentitiesResourcesPage/components/index.tsx deleted file mode 100644 index 3fe6b81f3..000000000 --- a/frontend/src/pages/admin/UserIdentitiesResourcesPage/components/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { UserIdentitiesTable } from "./UserIdentitiesTable"; diff --git a/frontend/src/pages/auth/SelectOrgPage/SelectOrgSection.tsx b/frontend/src/pages/auth/SelectOrgPage/SelectOrgSection.tsx index 9e6850f82..4dd0bbe24 100644 --- a/frontend/src/pages/auth/SelectOrgPage/SelectOrgSection.tsx +++ b/frontend/src/pages/auth/SelectOrgPage/SelectOrgSection.tsx @@ -88,7 +88,15 @@ export const SelectOrganizationSection = () => { // org has an org-level auth method enabled (e.g. SAML) // -> logout + redirect to SAML SSO let url = ""; - if (organization.orgAuthMethod === AuthMethod.OIDC) { + if (organization.googleSsoAuthEnforced) { + if (authToken.authMethod !== AuthMethod.GOOGLE) { + url = `/api/v1/sso/redirect/google?org_slug=${organization.slug}`; + + if (callbackPort) { + url += `&callback_port=${callbackPort}`; + } + } + } else if (organization.orgAuthMethod === AuthMethod.OIDC) { url = `/api/v1/sso/oidc/login?orgSlug=${organization.slug}${ callbackPort ? `&callbackPort=${callbackPort}` : "" }`; @@ -98,15 +106,6 @@ export const SelectOrganizationSection = () => { if (callbackPort) { url += `?callback_port=${callbackPort}`; } - } else if ( - organization.googleSsoAuthEnforced && - authToken.authMethod !== AuthMethod.GOOGLE - ) { - url = `/api/v1/sso/redirect/google?org_slug=${organization.slug}`; - - if (callbackPort) { - url += `&callback_port=${callbackPort}`; - } } // we are conditionally checking if the url is set because it may not be set if google SSO is enforced, but the user is already logged in with google SSO diff --git a/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx b/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx index 8b0a88bd0..68757f549 100644 --- a/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx +++ b/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx @@ -42,6 +42,17 @@ import { import { UsePopUpState } from "@app/hooks/usePopUp"; import { slugSchema } from "@app/lib/schemas"; +const REQUIRED_EAB_DIRECTORIES = [ + "https://acme.digicert.com/v2/acme/directory", + "https://acme.zerossl.com/v2/DV90", + "https://acme.ssl.com/sslcom-dv-rsa", + "https://acme.ssl.com/sslcom-dv-ecc", + "https://dv.acme-v02.api.pki.goog/directory", + "https://acme.sectigo.com/v2/OV", + "https://acme.sectigo.com/v2/EV", + "https://acme.cisco.com/ACMEv2/directory" +]; + const baseSchema = z.object({ type: z.nativeEnum(CaType), name: slugSchema({ @@ -51,18 +62,39 @@ const baseSchema = z.object({ status: z.nativeEnum(CaStatus) }); -const acmeConfigurationSchema = z.object({ - dnsAppConnection: z.object({ - id: z.string(), - name: z.string() - }), - dnsProviderConfig: z.object({ - provider: z.nativeEnum(AcmeDnsProvider), - hostedZoneId: z.string() - }), - directoryUrl: z.string(), - accountEmail: z.string() -}); +const acmeConfigurationSchema = z + .object({ + dnsAppConnection: z.object({ + id: z.string(), + name: z.string() + }), + dnsProviderConfig: z.object({ + provider: z.nativeEnum(AcmeDnsProvider), + hostedZoneId: z.string() + }), + directoryUrl: z.string(), + accountEmail: z.string(), + eabKid: z.string().optional(), + eabHmacKey: z.string().optional() + }) + .superRefine((data, ctx) => { + if (REQUIRED_EAB_DIRECTORIES.includes(data.directoryUrl)) { + if (!data.eabKid || data.eabKid.trim() === "") { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "EAB Key Identifier (KID) is required for this directory URL", + path: ["eabKid"] + }); + } + if (!data.eabHmacKey || data.eabHmacKey.trim() === "") { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "EAB HMAC Key is required for this directory URL", + path: ["eabHmacKey"] + }); + } + } + }); const azureAdCsConfigurationSchema = z.object({ azureAdcsConnection: z.object({ @@ -122,6 +154,10 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { caType === CaType.ACME && configuration && "dnsProviderConfig" in configuration ? configuration.dnsProviderConfig.provider : undefined; + const directoryUrl = + caType === CaType.ACME && configuration && "directoryUrl" in configuration + ? configuration.directoryUrl + : undefined; useEffect(() => { const initialType = (popUp?.ca?.data as { type: CaType })?.type; @@ -155,7 +191,9 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { hostedZoneId: "" }, directoryUrl: "", - accountEmail: "" + accountEmail: "", + eabKid: "", + eabHmacKey: "" } }); } @@ -178,13 +216,10 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { }); const availableConnections: TAvailableAppConnection[] = useMemo(() => { - if (caType === CaType.ACME) { - return [...(availableRoute53Connections || []), ...(availableCloudflareConnections || [])]; - } if (caType === CaType.AZURE_AD_CS) { return availableAzureConnections || []; } - return []; + return [...(availableRoute53Connections || []), ...(availableCloudflareConnections || [])]; }, [ caType, availableRoute53Connections, @@ -192,7 +227,8 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { availableAzureConnections ]); - const isPending = isRoute53Pending || isCloudflarePending || isAzurePending; + const isPending = + isRoute53Pending || isCloudflarePending || (isAzurePending && caType === CaType.AZURE_AD_CS); const dnsAppConnection = caType === CaType.ACME && configuration && "dnsAppConnection" in configuration @@ -227,7 +263,9 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { hostedZoneId: ca.configuration.dnsProviderConfig.hostedZoneId }, directoryUrl: ca.configuration.directoryUrl, - accountEmail: ca.configuration.accountEmail + accountEmail: ca.configuration.accountEmail, + eabKid: ca.configuration.eabKid, + eabHmacKey: ca.configuration.eabHmacKey } }); } else if (ca.type === CaType.AZURE_AD_CS && availableConnections?.length) { @@ -268,7 +306,9 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { dnsProviderConfig: formConfiguration.dnsProviderConfig, directoryUrl: formConfiguration.directoryUrl, accountEmail: formConfiguration.accountEmail, - dnsAppConnectionId: formConfiguration.dnsAppConnection.id + dnsAppConnectionId: formConfiguration.dnsAppConnection.id, + eabKid: formConfiguration.eabKid, + eabHmacKey: formConfiguration.eabHmacKey }; } else if (type === CaType.AZURE_AD_CS && "azureAdcsConnection" in formConfiguration) { configPayload = { @@ -499,6 +539,44 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { )} /> + ( + + + + )} + /> + ( + + + + )} + /> )} {caType === CaType.AZURE_AD_CS && ( diff --git a/frontend/src/pages/middlewares/restrict-login-signup.tsx b/frontend/src/pages/middlewares/restrict-login-signup.tsx index c3d58f248..294bece26 100644 --- a/frontend/src/pages/middlewares/restrict-login-signup.tsx +++ b/frontend/src/pages/middlewares/restrict-login-signup.tsx @@ -15,7 +15,8 @@ import { setAuthToken } from "@app/hooks/api/reactQuery"; const QueryParamsSchema = z.object({ callback_port: z.coerce.number().optional().catch(undefined), - force: z.boolean().optional() + force: z.boolean().optional(), + org_id: z.string().optional().catch(undefined) }); export const AuthConsentWrapper = () => { @@ -102,6 +103,12 @@ export const Route = createFileRoute("/_restrict-login-signup")({ return; } + if (search.org_id) { + if (location.pathname.endsWith("select-organization")) return; + + throw redirect({ to: "/login/select-organization", search: { org_id: search.org_id } }); + } + if (!data.organizationId) { if ( location.pathname.endsWith("select-organization") || diff --git a/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HCVaultConnectionForm.tsx b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HCVaultConnectionForm.tsx index af3954b45..78d937fc6 100644 --- a/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HCVaultConnectionForm.tsx +++ b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HCVaultConnectionForm.tsx @@ -1,7 +1,9 @@ import { Controller, FormProvider, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useQuery } from "@tanstack/react-query"; import { z } from "zod"; +import { OrgPermissionCan } from "@app/components/permissions"; import { Button, FormControl, @@ -9,9 +11,16 @@ import { ModalClose, SecretInput, Select, - SelectItem + SelectItem, + Tooltip } from "@app/components/v2"; +import { useSubscription } from "@app/context"; +import { + OrgGatewayPermissionActions, + OrgPermissionSubjects +} from "@app/context/OrgPermissionContext/types"; import { APP_CONNECTION_MAP, getAppConnectionMethodDetails } from "@app/helpers/appConnections"; +import { gatewaysQueryKeys } from "@app/hooks/api"; import { HCVaultConnectionMethod, THCVaultConnection } from "@app/hooks/api/appConnections"; import { AppConnection } from "@app/hooks/api/appConnections/enums"; @@ -66,7 +75,8 @@ export const HCVaultConnectionForm = ({ appConnection, onSubmit }: Props) => { resolver: zodResolver(formSchema), defaultValues: appConnection ?? { app: AppConnection.HCVault, - method: HCVaultConnectionMethod.AppRole + method: HCVaultConnectionMethod.AppRole, + gatewayId: null } }); @@ -79,6 +89,9 @@ export const HCVaultConnectionForm = ({ appConnection, onSubmit }: Props) => { const selectedMethod = watch("method"); + const { subscription } = useSubscription(); + const { data: gateways, isPending: isGatewaysLoading } = useQuery(gatewaysQueryKeys.list()); + return (
@@ -115,6 +128,54 @@ export const HCVaultConnectionForm = ({ appConnection, onSubmit }: Props) => { )} /> + {subscription.gateway && ( + + {(isAllowed) => ( + ( + + + + + + )} + /> + )} + + )} { - const { subscription } = useSubscription(); +const LogsSectionComponent = ({ + presets, + refetchInterval, + showFilters = true, + pageView = false, + project +}: Props) => { + const { subscription } = useSubscription(); + const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp(["upgradePlan"] as const); + const [logFilter, setLogFilter] = useState({ + eventType: presets?.eventType || [], + actor: presets?.actorId, + eventMetadata: presets?.eventMetadata + }); + const [timezone, setTimezone] = useState(Timezone.Local); - const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp(["upgradePlan"] as const); - const [logFilter, setLogFilter] = useState({ - eventType: presets?.eventType || [], - actor: presets?.actorId, - eventMetadata: presets?.eventMetadata - }); - const [timezone, setTimezone] = useState(Timezone.Local); + const [dateFilter, setDateFilter] = useState( + presets?.endDate || presets?.startDate + ? { + type: AuditLogDateFilterType.Absolute, + startDate: presets?.startDate || new Date(Number(new Date()) - ms("1h")), + endDate: presets?.endDate || new Date() + } + : { + startDate: new Date(Number(new Date()) - ms("1h")), + endDate: new Date(), + type: AuditLogDateFilterType.Relative, + relativeModeValue: "1h" + } + ); - const [dateFilter, setDateFilter] = useState( - presets?.endDate || presets?.startDate - ? { - type: AuditLogDateFilterType.Absolute, - startDate: presets?.startDate || new Date(Number(new Date()) - ms("1h")), - endDate: presets?.endDate || new Date() - } - : { - startDate: new Date(Number(new Date()) - ms("1h")), - endDate: new Date(), - type: AuditLogDateFilterType.Relative, - relativeModeValue: "1h" - } - ); - - useEffect(() => { - if (subscription && !subscription.auditLogs) { - handlePopUpOpen("upgradePlan"); - } - }, [subscription]); - - if (pageView) - return ( -
-
-
-
-

Audit History

- -
- - Docs - -
-
-
-
-
- {showFilters && ( - - )} - {showFilters && ( - - )} -
-
-
- - { - handlePopUpToggle("upgradePlan", isOpen); - }} - text="You can use audit logs if you switch to a paid Infisical plan." - /> -
-
- ); + useEffect(() => { + if (subscription && !subscription.auditLogs) { + handlePopUpOpen("upgradePlan"); + } + }, [subscription]); + if (pageView) return ( -
-
- {showFilters && ( - - )} - {showFilters && ( - - )} +
+
+
+
+

Audit History

+ +
+ + Docs + +
+
+
+
+
+ {showFilters && ( + + )} + {showFilters && ( + + )} +
+
+
+ + { + handlePopUpToggle("upgradePlan", isOpen); + }} + text="You can use audit logs if you switch to a paid Infisical plan." + />
- - { - handlePopUpToggle("upgradePlan", isOpen); - }} - text="You can use audit logs if you switch to a paid Infisical plan." - />
); - }, - { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.AuditLogs } -); + + return ( +
+
+ {showFilters && ( + + )} + {showFilters && ( + + )} +
+ + { + handlePopUpToggle("upgradePlan", isOpen); + }} + text="You can use audit logs if you switch to a paid Infisical plan." + /> +
+ ); +}; + +export const LogsSection = (props: Props) => { + const { project } = props; + + if (project) { + const ProjectLogsSectionWithPermission = withProjectPermission(LogsSectionComponent, { + action: ProjectPermissionAuditLogsActions.Read, + subject: ProjectPermissionSub.AuditLogs + }); + return ; + } + + const OrgLogsSectionWithPermission = withPermission(LogsSectionComponent, { + action: OrgPermissionAuditLogsActions.Read, + subject: OrgPermissionSubjects.AuditLogs + }); + return ; +}; diff --git a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx index a9f613584..7b066a099 100644 --- a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx +++ b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx @@ -48,7 +48,7 @@ import { useRequestProjectAccess, useSearchProjects } from "@app/hooks/api"; -import { ProjectType, Workspace } from "@app/hooks/api/workspace/types"; +import { ProjectType, Workspace, WorkspaceEnv } from "@app/hooks/api/workspace/types"; import { ProjectListToggle, ProjectListView @@ -152,13 +152,17 @@ export const AllProjectView = ({ type: projectTypeFilter }); - const handleAccessProject = async (type: ProjectType, projectId: string) => { + const handleAccessProject = async ( + type: ProjectType, + projectId: string, + environments: WorkspaceEnv[] + ) => { try { await orgAdminAccessProject.mutateAsync({ projectId }); await navigate({ - to: getProjectHomePage(type), + to: getProjectHomePage(type, environments), params: { projectId } @@ -315,7 +319,7 @@ export const AllProjectView = ({ onKeyDown={(evt) => { if (evt.key === "Enter" && workspace.isMember) { navigate({ - to: getProjectHomePage(workspace.type), + to: getProjectHomePage(workspace.type, workspace.environments), params: { projectId: workspace.id } @@ -325,7 +329,7 @@ export const AllProjectView = ({ onClick={() => { if (workspace.isMember) { navigate({ - to: getProjectHomePage(workspace.type), + to: getProjectHomePage(workspace.type, workspace.environments), params: { projectId: workspace.id } @@ -371,7 +375,7 @@ export const AllProjectView = ({ onClick={(e) => { e.stopPropagation(); e.preventDefault(); - handleAccessProject(workspace.type, workspace.id); + handleAccessProject(workspace.type, workspace.id, workspace.environments); }} disabled={ orgAdminAccessProject.variables?.projectId === workspace.id && diff --git a/frontend/src/pages/organization/ProjectsPage/components/MyProjectView.tsx b/frontend/src/pages/organization/ProjectsPage/components/MyProjectView.tsx index 8606aeb89..d63099273 100644 --- a/frontend/src/pages/organization/ProjectsPage/components/MyProjectView.tsx +++ b/frontend/src/pages/organization/ProjectsPage/components/MyProjectView.tsx @@ -193,7 +193,7 @@ export const MyProjectView = ({
{ navigate({ - to: getProjectHomePage(workspace.type), + to: getProjectHomePage(workspace.type, workspace.environments), params: { projectId: workspace.id } @@ -247,7 +247,7 @@ export const MyProjectView = ({
{ navigate({ - to: getProjectHomePage(workspace.type), + to: getProjectHomePage(workspace.type, workspace.environments), params: { projectId: workspace.id } diff --git a/frontend/src/pages/organization/RoleByIDPage/components/OrgRoleModifySection.utils.ts b/frontend/src/pages/organization/RoleByIDPage/components/OrgRoleModifySection.utils.ts index 275b73fd0..03b86f2ab 100644 --- a/frontend/src/pages/organization/RoleByIDPage/components/OrgRoleModifySection.utils.ts +++ b/frontend/src/pages/organization/RoleByIDPage/components/OrgRoleModifySection.utils.ts @@ -5,6 +5,7 @@ import { OrgPermissionSubjects } from "@app/context"; import { OrgGatewayPermissionActions, OrgPermissionAppConnectionActions, + OrgPermissionAuditLogsActions, OrgPermissionBillingActions, OrgPermissionGroupActions, OrgPermissionIdentityActions, @@ -23,6 +24,12 @@ const generalPermissionSchema = z }) .optional(); +const auditLogsPermissionSchema = z + .object({ + [OrgPermissionAuditLogsActions.Read]: z.boolean().optional() + }) + .optional(); + const billingPermissionSchema = z .object({ [OrgPermissionBillingActions.Read]: z.boolean().optional(), @@ -121,7 +128,7 @@ export const formSchema = z.object({ }) .optional(), - "audit-logs": generalPermissionSchema, + "audit-logs": auditLogsPermissionSchema, member: generalPermissionSchema, groups: groupPermissionSchema, role: generalPermissionSchema, diff --git a/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/OrgPermissionAuditLogsRow.tsx b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/OrgPermissionAuditLogsRow.tsx new file mode 100644 index 000000000..b86ae91d4 --- /dev/null +++ b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/OrgPermissionAuditLogsRow.tsx @@ -0,0 +1,145 @@ +import { useEffect, useMemo } from "react"; +import { Control, Controller, UseFormSetValue, useWatch } from "react-hook-form"; +import { faChevronDown, faChevronRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { createNotification } from "@app/components/notifications"; +import { Checkbox, Select, SelectItem, Td, Tr } from "@app/components/v2"; +import { OrgPermissionAuditLogsActions } from "@app/context/OrgPermissionContext/types"; +import { useToggle } from "@app/hooks"; + +import { TFormSchema } from "../OrgRoleModifySection.utils"; + +type Props = { + isEditable: boolean; + setValue: UseFormSetValue; + control: Control; +}; + +enum Permission { + NoAccess = "no-access", + Custom = "custom" +} + +const PERMISSION_ACTIONS = [ + { + action: OrgPermissionAuditLogsActions.Read, + label: "Read" + } +] as const; + +export const OrgPermissionAuditLogsRow = ({ isEditable, control, setValue }: Props) => { + const [isRowExpanded, setIsRowExpanded] = useToggle(); + const [isCustom, setIsCustom] = useToggle(); + + const rule = useWatch({ + control, + name: "permissions.audit-logs" + }); + + const selectedPermissionCategory = useMemo(() => { + const actions = Object.keys(rule || {}) as Array; + const score = actions.map((key) => (rule?.[key] ? 1 : 0)).reduce((a, b) => a + b, 0 as number); + + if (isCustom) return Permission.Custom; + if (score === 0) return Permission.NoAccess; + + return Permission.Custom; + }, [rule, isCustom]); + + useEffect(() => { + if (selectedPermissionCategory === Permission.Custom) setIsCustom.on(); + else setIsCustom.off(); + }, [selectedPermissionCategory]); + + useEffect(() => { + const isRowCustom = selectedPermissionCategory === Permission.Custom; + if (isRowCustom) { + setIsRowExpanded.on(); + } + }, []); + + const handlePermissionChange = (val: Permission) => { + if (!val) return; + if (val === Permission.Custom) { + setIsRowExpanded.on(); + setIsCustom.on(); + return; + } + setIsCustom.off(); + + switch (val) { + case Permission.NoAccess: + default: + setValue( + "permissions.audit-logs", + { + [OrgPermissionAuditLogsActions.Read]: false + }, + { shouldDirty: true } + ); + } + }; + + return ( + <> + setIsRowExpanded.toggle()} + > + + + + Audit Logs + + + + + {isRowExpanded && ( + + +
+ {PERMISSION_ACTIONS.map(({ action, label }) => { + return ( + ( + { + if (!isEditable) { + createNotification({ + type: "error", + text: "Failed to update default role" + }); + return; + } + field.onChange(e); + }} + id={`permissions.audit-logs.${action}`} + > + {label} + + )} + /> + ); + })} +
+ + + )} + + ); +}; diff --git a/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionRow.tsx b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionRow.tsx index e0702b201..0254e8240 100644 --- a/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionRow.tsx +++ b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionRow.tsx @@ -71,6 +71,7 @@ type Props = { | "gateway" | "secret-share" | "billing" + | "audit-logs" | "machine-identity-auth-template" >; setValue: UseFormSetValue; diff --git a/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx index 6fd848f56..3b606cbb1 100644 --- a/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx +++ b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx @@ -16,6 +16,7 @@ import { TFormSchema } from "../OrgRoleModifySection.utils"; import { OrgPermissionAdminConsoleRow } from "./OrgPermissionAdminConsoleRow"; +import { OrgPermissionAuditLogsRow } from "./OrgPermissionAuditLogsRow"; import { OrgPermissionBillingRow } from "./OrgPermissionBillingRow"; import { OrgGatewayPermissionRow } from "./OrgPermissionGatewayRow"; import { OrgPermissionGroupRow } from "./OrgPermissionGroupRow"; @@ -39,10 +40,6 @@ const SIMPLE_PERMISSION_OPTIONS = [ title: "Incident Contacts", formName: "incident-contact" }, - { - title: "Audit Logs", - formName: "audit-logs" - }, { title: "Organization Profile", formName: "settings" @@ -166,6 +163,11 @@ export const RolePermissionsSection = ({ roleId }: Props) => { /> ); })} + void; -}; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const formSchema = z.object({ - url: z.string().url().min(1), - headers: z - .object({ - key: z.string(), - value: z.string() - }) - .array() - .optional() -}); -type TForm = z.infer; - -export const AuditLogStreamForm = ({ id = "", onClose }: Props) => { - const isEdit = Boolean(id); - const { currentOrg } = useOrganization(); - const orgId = currentOrg?.id || ""; - - const auditLogStream = useGetAuditLogStreamDetails(id); - const createAuditLogStream = useCreateAuditLogStream(); - const updateAuditLogStream = useUpdateAuditLogStream(); - - const { - handleSubmit, - control, - setValue, - getValues, - formState: { isSubmitting } - } = useForm({ - values: auditLogStream?.data, - defaultValues: { - headers: [{ key: "", value: "" }] - } - }); - - const headerFields = useFieldArray({ - control, - name: "headers" - }); - - const handleAuditLogStreamEdit = async ({ headers, url }: TForm) => { - if (!id) return; - try { - await updateAuditLogStream.mutateAsync({ - id, - orgId, - headers, - url - }); - createNotification({ - type: "success", - text: "Successfully updated stream" - }); - onClose(); - } catch (err) { - console.log(err); - createNotification({ - type: "error", - text: "Failed to update stream" - }); - } - }; - - const handleFormSubmit = async ({ headers = [], url }: TForm) => { - if (isSubmitting) return; - const sanitizedHeaders = headers.filter(({ key, value }) => Boolean(key) && Boolean(value)); - const streamHeaders = sanitizedHeaders.length ? sanitizedHeaders : undefined; - if (isEdit) { - await handleAuditLogStreamEdit({ headers: streamHeaders, url }); - return; - } - try { - await createAuditLogStream.mutateAsync({ - orgId, - headers: streamHeaders, - url - }); - createNotification({ - type: "success", - text: "Successfully created stream" - }); - onClose(); - } catch (err) { - console.log(err); - createNotification({ - type: "error", - text: (err as Error)?.message ?? "Failed to create stream" - }); - } - }; - - if (isEdit && auditLogStream.isPending) { - return ( -
- -
- ); - } - - return ( - -
- ( - - - - )} - /> - - {headerFields.fields.map(({ id: headerFieldId }, i) => ( -
- ( - - - - )} - /> - ( - - - - )} - /> - { - const header = getValues("headers"); - if (header && header?.length > 1) { - headerFields.remove(i); - } else { - setValue("headers", [{ key: "", value: "" }]); - } - }} - > - - -
- ))} -
- -
-
-
- - -
- - ); -}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/AuditLogStreamForm.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/AuditLogStreamForm.tsx new file mode 100644 index 000000000..1af5e8d1a --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/AuditLogStreamForm.tsx @@ -0,0 +1,125 @@ +import { createNotification } from "@app/components/notifications"; +import { AUDIT_LOG_STREAM_PROVIDER_MAP } from "@app/helpers/auditLogStreams"; +import { useCreateAuditLogStream, useUpdateAuditLogStream } from "@app/hooks/api"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; +import { TAuditLogStream } from "@app/hooks/api/types"; +import { DiscriminativePick } from "@app/types"; + +import { AuditLogStreamHeader } from "../components/AuditLogStreamHeader"; +import { CustomProviderAuditLogStreamForm } from "./CustomProviderAuditLogStreamForm"; +import { DatadogProviderAuditLogStreamForm } from "./DatadogProviderAuditLogStreamForm"; +import { SplunkProviderAuditLogStreamForm } from "./SplunkProviderAuditLogStreamForm"; + +type FormProps = { + onComplete: (auditLogStream: TAuditLogStream) => void; +}; + +type CreateFormProps = FormProps & { provider: LogProvider }; +type UpdateFormProps = FormProps & { + auditLogStream: TAuditLogStream; +}; + +const CreateForm = ({ provider, onComplete }: CreateFormProps) => { + const createAuditLogStream = useCreateAuditLogStream(); + const { name: providerName } = AUDIT_LOG_STREAM_PROVIDER_MAP[provider]; + + const onSubmit = async ( + formData: DiscriminativePick + ) => { + try { + const logStream = await createAuditLogStream.mutateAsync(formData); + createNotification({ + text: `Successfully created ${providerName} Log Stream`, + type: "success" + }); + onComplete(logStream); + } catch (err: any) { + console.error(err); + createNotification({ + title: `Failed to create ${providerName} Log Stream`, + text: err.message, + type: "error" + }); + } + }; + + switch (provider) { + case LogProvider.Custom: + return ; + case LogProvider.Datadog: + return ; + case LogProvider.Splunk: + return ; + default: + throw new Error(`Unhandled Provider: ${provider}`); + } +}; + +const UpdateForm = ({ auditLogStream, onComplete }: UpdateFormProps) => { + const updateAuditLogStream = useUpdateAuditLogStream(); + const { name: providerName } = AUDIT_LOG_STREAM_PROVIDER_MAP[auditLogStream.provider]; + + const onSubmit = async ( + formData: DiscriminativePick + ) => { + try { + const connection = await updateAuditLogStream.mutateAsync({ + auditLogStreamId: auditLogStream.id, + ...formData + }); + createNotification({ + text: `Successfully updated ${providerName} Log Stream`, + type: "success" + }); + onComplete(connection); + } catch (err: any) { + console.error(err); + createNotification({ + title: `Failed to update ${providerName} Log Stream`, + text: err.message, + type: "error" + }); + } + }; + + switch (auditLogStream.provider) { + case LogProvider.Custom: + return ( + + ); + case LogProvider.Datadog: + return ( + + ); + case LogProvider.Splunk: + return ( + + ); + default: + throw new Error(`Unhandled Provider: ${(auditLogStream as TAuditLogStream).provider}`); + } +}; + +type Props = { onBack?: () => void } & Pick & + ( + | { provider: LogProvider; auditLogStream?: undefined } + | { provider?: undefined; auditLogStream: TAuditLogStream } + ); +export const AuditLogStreamForm = ({ onBack, ...props }: Props) => { + const { provider, auditLogStream } = props; + + return ( +
+ + {auditLogStream ? ( + + ) : ( + + )} +
+ ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/CustomProviderAuditLogStreamForm.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/CustomProviderAuditLogStreamForm.tsx new file mode 100644 index 000000000..258af14b9 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/CustomProviderAuditLogStreamForm.tsx @@ -0,0 +1,176 @@ +import { Controller, FormProvider, useFieldArray, useForm } from "react-hook-form"; +import { faPlus, faTrash } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; + +import { Button, FormControl, FormLabel, IconButton, Input, ModalClose } from "@app/components/v2"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; +import { TCustomProviderLogStream } from "@app/hooks/api/auditLogStreams/types/providers/custom-provider"; + +type Props = { + auditLogStream?: TCustomProviderLogStream; + onSubmit: (formData: FormData) => void; +}; + +const formSchema = z.object({ + provider: z.literal(LogProvider.Custom), + credentials: z.object({ + url: z.string().url().trim().min(1).max(255), + headers: z + .object({ + key: z.string().min(1), + value: z.string().min(1) + }) + .array() + }) +}); + +type FormData = z.infer; + +export const CustomProviderAuditLogStreamForm = ({ auditLogStream, onSubmit }: Props) => { + const isUpdate = Boolean(auditLogStream); + + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: auditLogStream ?? { + provider: LogProvider.Custom + } + }); + + const { + handleSubmit, + control, + formState: { isSubmitting, isDirty }, + getValues, + setValue + } = form; + + const headerFields = useFieldArray({ + control, + name: "credentials.headers" + }); + + return ( + +
+ ( + + + + )} + /> + + + {headerFields.fields.map(({ id: headerFieldId }, i) => ( +
+ ( + + + + )} + /> + ( + + { + if ( + auditLogStream && + auditLogStream.credentials.headers[i] && + auditLogStream.credentials.headers[i].value === "******" && + field.value === "******" + ) { + field.onChange(""); + } + e.target.type = "text"; + }} + onBlur={(e) => { + if ( + auditLogStream && + auditLogStream.credentials.headers[i] && + auditLogStream.credentials.headers[i].value === "******" && + field.value === "" + ) { + field.onChange("******"); + } + e.target.type = "password"; + }} + /> + + )} + /> + { + const header = getValues("credentials.headers"); + if (header && header?.length > 1) { + headerFields.remove(i); + } else { + setValue("credentials.headers", [{ key: "", value: "" }]); + } + }} + > + + +
+ ))} +
+ +
+ +
+ + + + +
+ +
+ ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/DatadogProviderAuditLogStreamForm.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/DatadogProviderAuditLogStreamForm.tsx new file mode 100644 index 000000000..2db315416 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/DatadogProviderAuditLogStreamForm.tsx @@ -0,0 +1,132 @@ +import { Controller, FormProvider, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; + +import { + Button, + FormControl, + ModalClose, + SecretInput, + Select, + SelectItem +} from "@app/components/v2"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; +import { TDatadogProviderLogStream } from "@app/hooks/api/auditLogStreams/types/providers/datadog-provider"; + +type Props = { + auditLogStream?: TDatadogProviderLogStream; + onSubmit: (formData: FormData) => void; +}; + +const formSchema = z.object({ + provider: z.literal(LogProvider.Datadog), + credentials: z.object({ + url: z.string().url().trim().min(1).max(255), + token: z + .string() + .trim() + .regex(/^[a-fA-F0-9]{32}$/, "Invalid Datadog API key format") + }) +}); + +type FormData = z.infer; + +const DATADOG_ENDPOINTS = { + "Datadog US1": "https://http-intake.logs.datadoghq.com/api/v2/logs", + "Datadog US3": "https://http-intake.logs.us3.datadoghq.com/api/v2/logs", + "Datadog US5": "https://http-intake.logs.us5.datadoghq.com/api/v2/logs", + "Datadog EU": "https://http-intake.logs.datadoghq.eu/api/v2/logs", + "Datadog AP1": "https://http-intake.logs.ap1.datadoghq.com/api/v2/logs", + "Datadog AP2": "https://http-intake.logs.ap2.datadoghq.com/api/v2/logs", + "Datadog GovCloud (US1-FED)": "https://http-intake.logs.ddog-gov.com/api/v2/logs" +}; + +export const DatadogProviderAuditLogStreamForm = ({ auditLogStream, onSubmit }: Props) => { + const isUpdate = Boolean(auditLogStream); + + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: auditLogStream ?? { + provider: LogProvider.Datadog, + credentials: { + url: DATADOG_ENDPOINTS["Datadog US1"] + } + } + }); + + const { + handleSubmit, + control, + formState: { isSubmitting, isDirty } + } = form; + + return ( + +
+ ( + + + + )} + /> + ( + + onChange(e.target.value)} + /> + + )} + /> +
+ + + + +
+ +
+ ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/SplunkProviderAuditLogStreamForm.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/SplunkProviderAuditLogStreamForm.tsx new file mode 100644 index 000000000..c9d248d61 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamForm/SplunkProviderAuditLogStreamForm.tsx @@ -0,0 +1,120 @@ +import { Controller, FormProvider, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; + +import { Button, FormControl, Input, ModalClose, SecretInput } from "@app/components/v2"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; +import { TSplunkProviderLogStream } from "@app/hooks/api/auditLogStreams/types/providers/splunk-provider"; + +type Props = { + auditLogStream?: TSplunkProviderLogStream; + onSubmit: (formData: FormData) => void; +}; + +const formSchema = z.object({ + provider: z.literal(LogProvider.Splunk), + credentials: z.object({ + hostname: z + .string() + .trim() + .min(1) + .max(255) + .superRefine((val, ctx) => { + if (val.includes("://")) { + ctx.addIssue({ + code: "custom", + message: "Hostname should not include protocol" + }); + return; + } + + try { + const url = new URL(`https://${val}`); + if (url.hostname !== val) { + ctx.addIssue({ + code: "custom", + message: "Must be a valid hostname without port or path" + }); + } + } catch { + ctx.addIssue({ code: "custom", message: "Invalid hostname" }); + } + }), + token: z.string().uuid().trim().min(1) + }) +}); + +type FormData = z.infer; + +export const SplunkProviderAuditLogStreamForm = ({ auditLogStream, onSubmit }: Props) => { + const isUpdate = Boolean(auditLogStream); + + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: auditLogStream ?? { + provider: LogProvider.Splunk + } + }); + + const { + handleSubmit, + control, + formState: { isSubmitting, isDirty } + } = form; + + return ( + +
+ ( + + + + )} + /> + ( + + onChange(e.target.value)} + /> + + )} + /> +
+ + + + +
+ +
+ ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx index beb0f63db..b58d1a6eb 100644 --- a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx @@ -1,72 +1,24 @@ -import { faPlug, faPlus } from "@fortawesome/free-solid-svg-icons"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal"; -import { createNotification } from "@app/components/notifications"; import { OrgPermissionCan } from "@app/components/permissions"; -import { - Button, - DeleteActionModal, - EmptyState, - Modal, - ModalContent, - Table, - TableContainer, - TableSkeleton, - TBody, - Td, - THead, - Tr -} from "@app/components/v2"; -import { - OrgPermissionActions, - OrgPermissionSubjects, - useOrganization, - useSubscription -} from "@app/context"; +import { Button } from "@app/components/v2"; +import { OrgPermissionActions, OrgPermissionSubjects, useSubscription } from "@app/context"; import { withPermission } from "@app/hoc"; import { usePopUp } from "@app/hooks"; -import { useDeleteAuditLogStream, useGetAuditLogStreams } from "@app/hooks/api"; -import { AuditLogStreamForm } from "./AuditLogStreamForm"; +import { AuditLogStreamTable } from "./components/AuditLogStreamTable"; +import { AddAuditLogStreamModal } from "./components"; export const AuditLogStreamsTab = withPermission( () => { - const { currentOrg } = useOrganization(); - const orgId = currentOrg?.id || ""; - const { popUp, handlePopUpOpen, handlePopUpToggle, handlePopUpClose } = usePopUp([ - "auditLogStreamForm", - "deleteAuditLogStream", - "upgradePlan" - ] as const); const { subscription } = useSubscription(); - const { data: auditLogStreams, isPending: isAuditLogStreamsLoading } = - useGetAuditLogStreams(orgId); - - // mutation - const { mutateAsync: deleteAuditLogStream } = useDeleteAuditLogStream(); - - const handleAuditLogStreamDelete = async () => { - try { - const auditLogStreamId = popUp?.deleteAuditLogStream?.data as string; - await deleteAuditLogStream({ - id: auditLogStreamId, - orgId - }); - handlePopUpClose("deleteAuditLogStream"); - createNotification({ - type: "success", - text: "Successfully deleted stream" - }); - } catch (err) { - console.log(err); - createNotification({ - type: "error", - text: "Failed to delete stream" - }); - } - }; + const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([ + "auditLogStreamForm", + "upgradePlan" + ] as const); return (
@@ -84,8 +36,10 @@ export const AuditLogStreamsTab = withPermission( }} leftIcon={} isDisabled={!isAllowed} + variant="outline_bg" + colorSchema="secondary" > - Create + Add Log Stream )} @@ -93,102 +47,15 @@ export const AuditLogStreamsTab = withPermission(

Send audit logs from Infisical to external logging providers via HTTP

-
- - - - - - - - - - {isAuditLogStreamsLoading && ( - - )} - {!isAuditLogStreamsLoading && auditLogStreams && auditLogStreams?.length === 0 && ( - - - - )} - {!isAuditLogStreamsLoading && - auditLogStreams?.map(({ id, url }) => ( - - - - - ))} - -
URLAction
- -
- {url} - -
- - {(isAllowed) => ( - - )} - - - {(isAllowed) => ( - - )} - -
-
-
-
- + { - handlePopUpToggle("auditLogStreamForm", isModalOpen); - }} - > - - handlePopUpToggle("auditLogStreamForm")} - /> - - + onOpenChange={(isOpen) => handlePopUpToggle("auditLogStreamForm", isOpen)} + /> handlePopUpToggle("upgradePlan", isOpen)} - text="You can add audit log streams if you switch to Infisical's Enterprise plan." - /> - handlePopUpToggle("deleteAuditLogStream", isOpen)} - onClose={() => handlePopUpClose("deleteAuditLogStream")} - onDeleteApproved={handleAuditLogStreamDelete} + text="You can add audit log streams if you switch to Infisical's Enterprise plan." />
); diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AddAuditLogStreamModal.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AddAuditLogStreamModal.tsx new file mode 100644 index 000000000..5a6892a49 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AddAuditLogStreamModal.tsx @@ -0,0 +1,69 @@ +import { Dispatch, SetStateAction, useState } from "react"; + +import { Modal, ModalContent } from "@app/components/v2"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; +import { TAuditLogStream } from "@app/hooks/api/types"; + +import { AuditLogStreamForm } from "../AuditLogStreamForm/AuditLogStreamForm"; +import { LogStreamProviderSelect } from "./LogStreamProviderSelect"; + +type Props = { + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; +}; + +type ContentProps = { + onComplete: (auditLogStream: TAuditLogStream) => void; + selectedProvider: LogProvider | null; + setSelectedProvider: Dispatch>; +}; + +const Content = ({ onComplete, selectedProvider, setSelectedProvider }: ContentProps) => { + if (selectedProvider) { + return ( + setSelectedProvider(null)} + provider={selectedProvider} + /> + ); + } + + return ; +}; + +export const AddAuditLogStreamModal = ({ isOpen, onOpenChange }: Props) => { + const [selectedProvider, setSelectedProvider] = useState(null); + + return ( + { + onOpenChange(e); + if (!e) setSelectedProvider(null); + }} + > + + Select a log provider or{" "} + {" "} + to stream logs to. + + > + onOpenChange(false)} + selectedProvider={selectedProvider} + setSelectedProvider={setSelectedProvider} + /> + + + ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamHeader.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamHeader.tsx new file mode 100644 index 000000000..3175ffa46 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamHeader.tsx @@ -0,0 +1,69 @@ +import { faArrowUpRightFromSquare, faBookOpen } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { AUDIT_LOG_STREAM_PROVIDER_MAP } from "@app/helpers/auditLogStreams"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; + +type Props = { + provider: LogProvider; + logStreamExists: boolean; + onBack?: () => void; +}; + +export const AuditLogStreamHeader = ({ provider, logStreamExists, onBack }: Props) => { + const providerDetails = AUDIT_LOG_STREAM_PROVIDER_MAP[provider]; + + return ( +
+
+ {providerDetails.image ? ( + {providerDetails.name} + ) : ( + providerDetails.icon && ( +
+ +
+ ) + )} +
+
+
+ {providerDetails.name} + +
+ + Docs + +
+
+
+

+ {logStreamExists + ? `${providerDetails.name} Log Stream` + : `Create a ${providerDetails.name} Log Stream`} +

+
+ {onBack && ( + + )} +
+ ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamRow.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamRow.tsx new file mode 100644 index 000000000..037ba6f2a --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamRow.tsx @@ -0,0 +1,111 @@ +import { faAsterisk, faEllipsisV, faTrash } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; + +import { OrgPermissionCan } from "@app/components/permissions"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + IconButton, + Td, + Tooltip, + Tr +} from "@app/components/v2"; +import { OrgPermissionSubjects } from "@app/context"; +import { OrgPermissionActions } from "@app/context/OrgPermissionContext/types"; +import { AUDIT_LOG_STREAM_PROVIDER_MAP, getProviderUrl } from "@app/helpers/auditLogStreams"; +import { TAuditLogStream } from "@app/hooks/api/types"; + +type Props = { + logStream: TAuditLogStream; + onDelete: (logStream: TAuditLogStream) => void; + onEditCredentials: (logStream: TAuditLogStream) => void; +}; + +export const AuditLogStreamRow = ({ logStream, onDelete, onEditCredentials }: Props) => { + const { id, provider } = logStream; + + const providerDetails = AUDIT_LOG_STREAM_PROVIDER_MAP[provider]; + const url = getProviderUrl(logStream); + + return ( + + +
+
+ {providerDetails.image ? ( + {providerDetails.name} + ) : ( + providerDetails.icon && ( + + ) + )} +
+ {providerDetails.name} +
+ + +
+

{url}

+
+ + +
+ + + + + + + + + + {(isAllowed: boolean) => ( + } + onClick={() => onEditCredentials(logStream)} + > + Edit Credentials + + )} + + + {(isAllowed: boolean) => ( + } + onClick={() => onDelete(logStream)} + > + Delete Stream + + )} + + + + +
+ + + ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamTable.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamTable.tsx new file mode 100644 index 000000000..152f1d1c7 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamTable.tsx @@ -0,0 +1,304 @@ +import { useMemo, useState } from "react"; +import { + faArrowDown, + faArrowUp, + faFilter, + faMagnifyingGlass, + faPlug, + faSearch +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuTrigger, + EmptyState, + IconButton, + Input, + Pagination, + Table, + TableContainer, + TableSkeleton, + TBody, + Th, + THead, + Tr +} from "@app/components/v2"; +import { AUDIT_LOG_STREAM_PROVIDER_MAP, getProviderUrl } from "@app/helpers/auditLogStreams"; +import { + getUserTablePreference, + PreferenceKey, + setUserTablePreference +} from "@app/helpers/userTablePreferences"; +import { usePagination, usePopUp, useResetPageHelper } from "@app/hooks"; +import { useListAuditLogStreams } from "@app/hooks/api"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; +import { OrderByDirection } from "@app/hooks/api/generic/types"; +import { TAuditLogStream } from "@app/hooks/api/types"; + +import { AuditLogStreamRow } from "./AuditLogStreamRow"; +import { DeleteAuditLogStreamModal } from "./DeleteAuditLogStreamModal"; +import { EditAuditLogStreamCredentialsModal } from "./EditAuditLogStreamCredentialsModal"; + +enum LogStreamsOrderBy { + Provider = "provider", + Url = "url" +} + +type LogStreamFilters = { + providers: LogProvider[]; +}; + +export const AuditLogStreamTable = () => { + const { isPending, data: logStreams = [] } = useListAuditLogStreams(); + + const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([ + "delete", + "editCredentials" + ] as const); + + const [filters, setFilters] = useState({ + providers: [] + }); + + const { + search, + setSearch, + setPage, + page, + perPage, + setPerPage, + offset, + orderDirection, + toggleOrderDirection, + orderBy, + setOrderDirection, + setOrderBy + } = usePagination(LogStreamsOrderBy.Provider, { + initPerPage: getUserTablePreference("logStreamsTable", PreferenceKey.PerPage, 20) + }); + + const handlePerPageChange = (newPerPage: number) => { + setPerPage(newPerPage); + setUserTablePreference("logStreamsTable", PreferenceKey.PerPage, newPerPage); + }; + + const filteredLogStreams = useMemo( + () => + logStreams + .filter((stream) => { + const { provider } = stream; + + if (filters.providers.length && !filters.providers.includes(provider)) return false; + + const searchValue = search.trim().toLowerCase(); + + return AUDIT_LOG_STREAM_PROVIDER_MAP[provider].name.toLowerCase().includes(searchValue); + }) + .sort((a, b) => { + const [one, two] = orderDirection === OrderByDirection.ASC ? [a, b] : [b, a]; + + switch (orderBy) { + case LogStreamsOrderBy.Url: + return getProviderUrl(one) + .toLowerCase() + .localeCompare(getProviderUrl(two).toLowerCase()); + case LogStreamsOrderBy.Provider: + default: + return AUDIT_LOG_STREAM_PROVIDER_MAP[one.provider].name + .toLowerCase() + .localeCompare(AUDIT_LOG_STREAM_PROVIDER_MAP[two.provider].name.toLowerCase()); + } + }), + [logStreams, orderDirection, search, orderBy, filters] + ); + + useResetPageHelper({ + totalCount: filteredLogStreams.length, + offset, + setPage + }); + + const handleSort = (column: LogStreamsOrderBy) => { + if (column === orderBy) { + toggleOrderDirection(); + return; + } + + setOrderBy(column); + setOrderDirection(OrderByDirection.ASC); + }; + + const getClassName = (col: LogStreamsOrderBy) => + twMerge("ml-2", orderBy === col ? "" : "opacity-30"); + + const getColSortIcon = (col: LogStreamsOrderBy) => + orderDirection === OrderByDirection.DESC && orderBy === col ? faArrowUp : faArrowDown; + + const isTableFiltered = Boolean(filters.providers.length); + + const handleDelete = (logStream: TAuditLogStream) => handlePopUpOpen("delete", logStream); + + const handleEditCredentials = (logStream: TAuditLogStream) => { + handlePopUpOpen("editCredentials", logStream); + }; + + return ( +
+
+ setSearch(e.target.value)} + leftIcon={} + placeholder="Search audit log streams..." + className="flex-1" + /> + + + + + + + + Filter by Provider + {logStreams.length ? ( + [...new Set(logStreams.map(({ provider }) => provider))].map((provider) => { + const providerDetails = AUDIT_LOG_STREAM_PROVIDER_MAP[provider]; + + return ( + { + e.preventDefault(); + setFilters((prev) => ({ + ...prev, + providers: prev.providers.includes(provider) + ? prev.providers.filter((a) => a !== provider) + : [...prev.providers, provider] + })); + }} + key={provider} + iconPos="right" + > +
+ {providerDetails.image ? ( + {providerDetails.name} + ) : ( + providerDetails.icon && ( + + ) + )} + {providerDetails.name} +
+
+ ); + }) + ) : ( + No Providers Configured + )} +
+
+
+ + + + + + + + + + + {isPending && ( + + )} + {filteredLogStreams.slice(offset, perPage * page).map((stream) => ( + + ))} + +
+
+ Provider + handleSort(LogStreamsOrderBy.Provider)} + > + + +
+
+
+ Endpoint URL + handleSort(LogStreamsOrderBy.Url)} + > + + +
+
+
+ {Boolean(filteredLogStreams.length) && ( + + )} + {!isPending && !filteredLogStreams?.length && ( + + )} +
+ handlePopUpToggle("delete", isOpen)} + auditLogStream={popUp.delete.data} + /> + handlePopUpToggle("editCredentials", isOpen)} + auditLogStream={popUp.editCredentials.data} + /> +
+ ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/DeleteAuditLogStreamModal.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/DeleteAuditLogStreamModal.tsx new file mode 100644 index 000000000..1a65e6c67 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/DeleteAuditLogStreamModal.tsx @@ -0,0 +1,54 @@ +import { createNotification } from "@app/components/notifications"; +import { DeleteActionModal } from "@app/components/v2"; +import { AUDIT_LOG_STREAM_PROVIDER_MAP } from "@app/helpers/auditLogStreams"; +import { useDeleteAuditLogStream } from "@app/hooks/api"; +import { TAuditLogStream } from "@app/hooks/api/types"; + +type Props = { + auditLogStream?: TAuditLogStream; + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; +}; + +export const DeleteAuditLogStreamModal = ({ isOpen, onOpenChange, auditLogStream }: Props) => { + const deleteAuditLogStream = useDeleteAuditLogStream(); + + if (!auditLogStream) return null; + + const { id: auditLogStreamId, provider } = auditLogStream; + + const providerDetails = AUDIT_LOG_STREAM_PROVIDER_MAP[provider]; + + const handleDelete = async () => { + try { + await deleteAuditLogStream.mutateAsync({ + auditLogStreamId, + provider + }); + + createNotification({ + text: `Successfully deleted ${providerDetails.name} stream`, + type: "success" + }); + + onOpenChange(false); + } catch (err) { + console.error(err); + + createNotification({ + text: `Failed to delete ${providerDetails.name} stream`, + type: "error" + }); + } + }; + + return ( + + ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/EditAuditLogStreamCredentialsModal.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/EditAuditLogStreamCredentialsModal.tsx new file mode 100644 index 000000000..6e21b10fe --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/EditAuditLogStreamCredentialsModal.tsx @@ -0,0 +1,34 @@ +import { Modal, ModalContent } from "@app/components/v2"; +import { AUDIT_LOG_STREAM_PROVIDER_MAP } from "@app/helpers/auditLogStreams"; +import { TAuditLogStream } from "@app/hooks/api/types"; + +import { AuditLogStreamForm } from "../AuditLogStreamForm/AuditLogStreamForm"; + +type Props = { + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; + auditLogStream?: TAuditLogStream; +}; + +export const EditAuditLogStreamCredentialsModal = ({ + isOpen, + onOpenChange, + auditLogStream +}: Props) => { + if (!auditLogStream) return null; + + return ( + + + onOpenChange(false)} + auditLogStream={auditLogStream} + /> + + + ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/LogStreamProviderSelect.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/LogStreamProviderSelect.tsx new file mode 100644 index 000000000..26708e17b --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/LogStreamProviderSelect.tsx @@ -0,0 +1,155 @@ +import { useMemo } from "react"; +import { faSearch } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { EmptyState, Spinner } from "@app/components/v2"; +import { AUDIT_LOG_STREAM_PROVIDER_MAP } from "@app/helpers/auditLogStreams"; +import { usePagination, useResetPageHelper } from "@app/hooks"; +import { useGetAuditLogStreamOptions } from "@app/hooks/api"; +import { LogProvider } from "@app/hooks/api/auditLogStreams/enums"; + +type Props = { + onSelect: (provider: LogProvider) => void; +}; + +// TODO: When we have more than 1 page of providers, uncomment the search components + +export const LogStreamProviderSelect = ({ onSelect }: Props) => { + const { isPending, data: logStreamOptions } = useGetAuditLogStreamOptions(); + + const { search, setPage, page, perPage, offset } = usePagination("", { + initPerPage: 16 + }); + + const filteredOptions = useMemo( + () => + (logStreamOptions || []) + .filter( + ({ name, provider }) => + name.toLowerCase().includes(search.trim().toLowerCase()) || + provider.toLowerCase().includes(search.trim().toLowerCase()) + ) + .sort((a, b) => { + if (a.provider === LogProvider.Custom) return 1; + if (b.provider === LogProvider.Custom) return -1; + return 0; + }), + [logStreamOptions, search] + ); + + useResetPageHelper({ + totalCount: filteredOptions.length, + offset, + setPage + }); + + if (isPending) { + return ( +
+ +

Loading options...

+
+ ); + } + + return ( +
+ {/* setSearch(e.target.value)} + leftIcon={} + placeholder="Search options..." + className="bg-mineshaft-800 placeholder:text-mineshaft-400" + /> */} +
+ {filteredOptions.slice(offset, perPage * page)?.map((option) => { + const { image, icon, name, size = 50 } = AUDIT_LOG_STREAM_PROVIDER_MAP[option.provider]; + + return ( + + ); + })} + {!filteredOptions.length && ( + + )} +
+ {/* {Boolean(filteredOptions.length) && ( + +

Infisical is constantly adding support for more providers.

+

+ {`If you don't see the third-party + provider you're looking for,`}{" "} + + let us know on Slack + {" "} + or{" "} + + make a request on GitHub + + . +

+ + } + > +
+ + Don't see the third-party provider you're looking for? + + +
+ + } + count={filteredOptions.length} + page={page} + perPage={perPage} + onChangePage={setPage} + onChangePerPage={setPerPage} + perPageList={[16]} + /> + )} */} +
+ ); +}; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/index.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/index.tsx new file mode 100644 index 000000000..69febb4a9 --- /dev/null +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/index.tsx @@ -0,0 +1 @@ +export * from "./AddAuditLogStreamModal"; diff --git a/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/SelectImportFromPlatformModal.tsx b/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/SelectImportFromPlatformModal.tsx index 6da5a44c9..cd39d8678 100644 --- a/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/SelectImportFromPlatformModal.tsx +++ b/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/SelectImportFromPlatformModal.tsx @@ -1,6 +1,4 @@ import { useState } from "react"; -import { faKey, faVault } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { AnimatePresence, motion } from "framer-motion"; import { Modal, ModalContent } from "@app/components/v2"; @@ -20,14 +18,16 @@ enum WizardSteps { const PLATFORM_LIST = [ { - icon: faKey, + image: "/images/integrations/EnvKey.png", platform: "env-key", - title: "Env Key" + title: "EnvKey", + size: 34 }, { - icon: faVault, + image: "/images/integrations/Vault.png", platform: "vault", - title: "Vault" + title: "HCP Vault", + size: 40 } ] as const; @@ -67,7 +67,7 @@ export const SelectImportFromPlatformModal = ({ isOpen, onToggle }: Props) => { {PLATFORM_LIST.map((platform, idx) => (
{ @@ -81,7 +81,11 @@ export const SelectImportFromPlatformModal = ({ isOpen, onToggle }: Props) => { } }} > - + {`${platform.title}
{platform.title}
))} diff --git a/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/VaultPlatformModal.tsx b/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/VaultPlatformModal.tsx index 02ab5df1b..95ed993e8 100644 --- a/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/VaultPlatformModal.tsx +++ b/frontend/src/pages/organization/SettingsPage/components/ExternalMigrationsTab/components/VaultPlatformModal.tsx @@ -2,13 +2,22 @@ import { Controller, useForm } from "react-hook-form"; import { faQuestionCircle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useQuery } from "@tanstack/react-query"; import { twMerge } from "tailwind-merge"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; -import { Button, FormControl, Input, Tooltip } from "@app/components/v2"; +import { OrgPermissionCan } from "@app/components/permissions"; +import { Button, FormControl, Input, Select, SelectItem, Tooltip } from "@app/components/v2"; import { NoticeBannerV2 } from "@app/components/v2/NoticeBannerV2/NoticeBannerV2"; +import { + OrgGatewayPermissionActions, + OrgPermissionSubjects +} from "@app/context/OrgPermissionContext/types"; +import { gatewaysQueryKeys } from "@app/hooks/api"; import { useImportVault } from "@app/hooks/api/migration/mutations"; +import { useHasCustomMigrationAvailable } from "@app/hooks/api/migration"; +import { ExternalMigrationProviders } from "@app/hooks/api/migration/types"; type Props = { id?: string; @@ -17,11 +26,13 @@ type Props = { enum VaultMappingType { KeyVault = "key-vault", - Namespace = "namespace" + Namespace = "namespace", + Custom = "custom" } const MAPPING_TYPE_MENU_ITEMS = [ { + isCustom: false, value: VaultMappingType.KeyVault, label: "Key Vaults", tooltip: ( @@ -41,6 +52,7 @@ const MAPPING_TYPE_MENU_ITEMS = [ ) }, { + isCustom: false, value: VaultMappingType.Namespace, label: "Namespaces", tooltip: ( @@ -56,42 +68,53 @@ const MAPPING_TYPE_MENU_ITEMS = [
) + }, + { + isCustom: true, + value: VaultMappingType.Custom, + label: "Custom Migration", + tooltip: ( +
+ Custom migrations allow you to shape your Vault migration to your specific needs. Please + contact our sales team to get started with custom migrations. +
+ ) } ]; export const VaultPlatformModal = ({ onClose }: Props) => { + const { data: isCustomMigrationAvailable } = useHasCustomMigrationAvailable( + ExternalMigrationProviders.Vault + ); + const formSchema = z.object({ vaultUrl: z.string().min(1), + gatewayId: z.string().optional(), vaultNamespace: z.string().trim().optional(), vaultAccessToken: z.string().min(1), mappingType: z.nativeEnum(VaultMappingType).default(VaultMappingType.KeyVault) }); type TFormData = z.infer; + const { data: gateways, isPending: isGatewayLoading } = useQuery(gatewaysQueryKeys.list()); const { mutateAsync: importVault } = useImportVault(); const { control, handleSubmit, reset, - formState: { isLoading, isDirty, isSubmitting, isValid, errors } + formState: { isLoading, isDirty, isSubmitting, isValid } } = useForm({ resolver: zodResolver(formSchema) }); - console.log({ - isSubmitting, - isLoading, - isValid, - errors - }); - const onSubmit = async (data: TFormData) => { await importVault({ vaultAccessToken: data.vaultAccessToken, vaultNamespace: data.vaultNamespace, vaultUrl: data.vaultUrl, - mappingType: data.mappingType + mappingType: data.mappingType, + ...(data.gatewayId && { gatewayId: data.gatewayId }) }); createNotification({ title: "Import started", @@ -110,11 +133,70 @@ export const VaultPlatformModal = ({ onClose }: Props) => { The Vault migration currently supports importing static secrets from Vault Dedicated/Self-Hosted.
- Currently only KV Secret Engine V2 is supported for Vault migrations. + Currently only KV Secret Engine is supported for Vault migrations.

+
+ + {(isAllowed) => ( + ( + + +
+ +
+
+
+ )} + /> + )} +
+
+ { errorText={error?.message} className="flex-1" > -
+
{MAPPING_TYPE_MENU_ITEMS.map((el) => (
field.onChange(el.value)} + onClick={() => { + if (el.isCustom && !isCustomMigrationAvailable?.data?.enabled) return; + + field.onChange(el.value); + }} + onKeyDown={(e) => { + if (e.key !== "Enter") return; + if (el.isCustom && !isCustomMigrationAvailable?.data?.enabled) return; + + field.onChange(el.value); + }} role="button" tabIndex={0} - onKeyDown={(e) => { - if (e.key === "Enter") { - field.onChange(el.value); - } - }} >
{el.label}
{el.tooltip && (
- +
)} @@ -210,7 +305,7 @@ export const VaultPlatformModal = ({ onClose }: Props) => { isLoading={isLoading} isDisabled={!isDirty || isSubmitting || isLoading || !isValid} > - Import data + Import Data + )} + +
+

+ Manually sync GitHub teams for all organization members. This will update team + memberships for users who have previously logged in with GitHub. +

+
+ )} { diff --git a/frontend/src/pages/organization/SettingsPage/components/OrgSsoTab/OrgGeneralAuthSection.tsx b/frontend/src/pages/organization/SettingsPage/components/OrgSsoTab/OrgGeneralAuthSection.tsx index 53df91974..b9ca11748 100644 --- a/frontend/src/pages/organization/SettingsPage/components/OrgSsoTab/OrgGeneralAuthSection.tsx +++ b/frontend/src/pages/organization/SettingsPage/components/OrgSsoTab/OrgGeneralAuthSection.tsx @@ -204,9 +204,10 @@ export const OrgGeneralAuthSection = ({

- Enforce users to authenticate via Google to access this organization. + Enforce users to authenticate via Google OAuth SSO to access this organization.
- When this is enabled your organization members will only be able to login with Google. + When this is enabled your organization members will only be able to login with Google + SSO (not Google SAML).

diff --git a/frontend/src/pages/project/GroupDetailsByIDPage/components/GroupMembersSection/GroupMembersTable.tsx b/frontend/src/pages/project/GroupDetailsByIDPage/components/GroupMembersSection/GroupMembersTable.tsx index bcffb428f..7d155ba43 100644 --- a/frontend/src/pages/project/GroupDetailsByIDPage/components/GroupMembersSection/GroupMembersTable.tsx +++ b/frontend/src/pages/project/GroupDetailsByIDPage/components/GroupMembersSection/GroupMembersTable.tsx @@ -136,7 +136,7 @@ export const GroupMembersTable = ({ groupMembership }: Props) => { text: "User privilege assumption has started" }); - const url = getProjectHomePage(currentWorkspace.type); + const url = getProjectHomePage(currentWorkspace.type, currentWorkspace.environments); window.location.href = url.replace("$projectId", currentWorkspace.id); } } diff --git a/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx b/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx index 19d6c4acc..e1da4edab 100644 --- a/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx +++ b/frontend/src/pages/project/IdentityDetailsByIDPage/IdentityDetailsByIDPage.tsx @@ -67,7 +67,7 @@ const Page = () => { type: "success", text: "Identity privilege assumption has started" }); - const url = getProjectHomePage(currentWorkspace.type); + const url = getProjectHomePage(currentWorkspace.type, currentWorkspace.environments); window.location.href = url.replace("$projectId", currentWorkspace.id); } } diff --git a/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx b/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx index 7bac32f75..7fadf2cb9 100644 --- a/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx +++ b/frontend/src/pages/project/MemberDetailsByIDPage/MemberDetailsByIDPage.tsx @@ -72,7 +72,7 @@ export const Page = () => { text: "User privilege assumption has started" }); - const url = getProjectHomePage(currentWorkspace.type); + const url = getProjectHomePage(currentWorkspace.type, currentWorkspace.environments); window.location.href = url.replace("$projectId", currentWorkspace.id); } } diff --git a/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx b/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx index 9ebc903a5..856275374 100644 --- a/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx +++ b/frontend/src/pages/project/RoleDetailsBySlugPage/components/ProjectRoleModifySection.utils.tsx @@ -12,6 +12,7 @@ import { } from "@app/context"; import { PermissionConditionOperators, + ProjectPermissionAuditLogsActions, ProjectPermissionCommitsActions, ProjectPermissionDynamicSecretActions, ProjectPermissionGroupActions, @@ -41,6 +42,10 @@ const GeneralPolicyActionSchema = z.object({ create: z.boolean().optional() }); +const AuditLogsPolicyActionSchema = z.object({ + [ProjectPermissionAuditLogsActions.Read]: z.boolean().optional() +}); + const CertificatePolicyActionSchema = z.object({ [ProjectPermissionCertificateActions.Create]: z.boolean().optional(), [ProjectPermissionCertificateActions.Delete]: z.boolean().optional(), @@ -316,7 +321,7 @@ export const projectRoleFormSchema = z.object({ [ProjectPermissionSub.ServiceTokens]: GeneralPolicyActionSchema.array().default([]), [ProjectPermissionSub.Settings]: GeneralPolicyActionSchema.array().default([]), [ProjectPermissionSub.Environments]: GeneralPolicyActionSchema.array().default([]), - [ProjectPermissionSub.AuditLogs]: GeneralPolicyActionSchema.array().default([]), + [ProjectPermissionSub.AuditLogs]: AuditLogsPolicyActionSchema.array().default([]), [ProjectPermissionSub.IpAllowList]: GeneralPolicyActionSchema.array().default([]), [ProjectPermissionSub.CertificateAuthorities]: GeneralPolicyActionSchema.array().default([]), [ProjectPermissionSub.Certificates]: CertificatePolicyActionSchema.array().default([]), @@ -1324,12 +1329,7 @@ export const PROJECT_PERMISSION_OBJECT: TProjectPermissionObject = { }, [ProjectPermissionSub.AuditLogs]: { title: "Audit Logs", - actions: [ - { label: "Read", value: "read" }, - { label: "Create", value: "create" }, - { label: "Modify", value: "edit" }, - { label: "Remove", value: "delete" } - ] + actions: [{ label: "Read", value: ProjectPermissionAuditLogsActions.Read }] }, [ProjectPermissionSub.IpAllowList]: { title: "IP Allowlist", @@ -1721,7 +1721,7 @@ const projectManagerTemplate = ( permissions: [ { subject: ProjectPermissionSub.AuditLogs, - actions: Object.values(ProjectPermissionActions) + actions: Object.values(ProjectPermissionAuditLogsActions) }, { subject: ProjectPermissionSub.Groups, diff --git a/frontend/src/pages/secret-manager/IntegrationsDetailsByIDPage/components/IntegrationAuditLogsSection.tsx b/frontend/src/pages/secret-manager/IntegrationsDetailsByIDPage/components/IntegrationAuditLogsSection.tsx index b4ecd1e0e..c27b1bb08 100644 --- a/frontend/src/pages/secret-manager/IntegrationsDetailsByIDPage/components/IntegrationAuditLogsSection.tsx +++ b/frontend/src/pages/secret-manager/IntegrationsDetailsByIDPage/components/IntegrationAuditLogsSection.tsx @@ -1,7 +1,7 @@ import { Link } from "@tanstack/react-router"; import { EmptyState } from "@app/components/v2"; -import { useSubscription } from "@app/context"; +import { useSubscription, useWorkspace } from "@app/context"; import { EventType } from "@app/hooks/api/auditLogs/enums"; import { TIntegrationWithEnv } from "@app/hooks/api/integrations/types"; import { LogsSection } from "@app/pages/organization/AuditLogsPage/components/LogsSection"; @@ -15,6 +15,7 @@ type Props = { export const IntegrationAuditLogsSection = ({ integration }: Props) => { const { subscription } = useSubscription(); + const { currentWorkspace } = useWorkspace(); const auditLogsRetentionDays = subscription?.auditLogsRetentionDays ?? 30; @@ -30,6 +31,7 @@ export const IntegrationAuditLogsSection = ({ integration }: Props) => { { const [selectedRequest, setSelectedRequest] = useState< | (TAccessApprovalRequest & { - user: { firstName?: string; lastName?: string; email?: string } | null; + user: { firstName?: string | null; lastName?: string | null; email?: string | null } | null; isRequestedByCurrentUser: boolean; isSelfApproveAllowed: boolean; isApprover: boolean; diff --git a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/AccessApprovalRequest/components/ReviewAccessModal.tsx b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/AccessApprovalRequest/components/ReviewAccessModal.tsx index b1cd906bb..e7269298a 100644 --- a/frontend/src/pages/secret-manager/SecretApprovalsPage/components/AccessApprovalRequest/components/ReviewAccessModal.tsx +++ b/frontend/src/pages/secret-manager/SecretApprovalsPage/components/AccessApprovalRequest/components/ReviewAccessModal.tsx @@ -85,7 +85,7 @@ export const ReviewAccessRequestModal = ({ isOpen: boolean; onOpenChange: (isOpen: boolean) => void; request: TAccessApprovalRequest & { - user: { firstName?: string; lastName?: string; email?: string } | null; + user: { firstName?: string | null; lastName?: string | null; email?: string | null } | null; isRequestedByCurrentUser: boolean; isSelfApproveAllowed: boolean; isApprover: boolean; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx index 9241c2c6f..d79a107db 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx @@ -52,6 +52,7 @@ import { OrderByDirection } from "@app/hooks/api/generic/types"; import { PendingAction } from "@app/hooks/api/secretFolders/types"; import { useCreateCommit } from "@app/hooks/api/secrets/mutations"; import { SecretV3RawSanitized } from "@app/hooks/api/types"; +import { ProjectVersion } from "@app/hooks/api/workspace/types"; import { usePathAccessPolicies } from "@app/hooks/usePathAccessPolicies"; import { useResizableColWidth } from "@app/hooks/useResizableColWidth"; import { hasSecretReadValueOrDescribePermission } from "@app/lib/fn/permission"; @@ -64,6 +65,8 @@ import { ActionBar } from "./components/ActionBar"; import { CommitForm } from "./components/CommitForm"; import { CreateSecretForm } from "./components/CreateSecretForm"; import { DynamicSecretListView } from "./components/DynamicSecretListView"; +import { EnvironmentTabs } from "./components/EnvironmentTabs"; +import { FolderBreadCrumbs } from "./components/FolderBreadCrumbs"; import { FolderListView } from "./components/FolderListView"; import { PitDrawer } from "./components/PitDrawer"; import { SecretDropzone } from "./components/SecretDropzone"; @@ -105,7 +108,7 @@ const Page = () => { const { permission } = useProjectPermission(); const { mutateAsync: createCommit } = useCreateCommit(); - const tableRef = useRef(null); + const tableRef = useRef(null); const [isVisible, setIsVisible] = useState(false); const { isBatchMode, pendingChanges } = useBatchMode(); @@ -249,7 +252,8 @@ const Page = () => { const { data, isPending: isDetailsLoading, - isFetching: isDetailsFetching + isFetching: isDetailsFetching, + isFetched } = useGetProjectSecretsDetails({ environment, projectId: workspaceId, @@ -270,6 +274,18 @@ const Page = () => { tags: filter.tags }); + useEffect(() => { + // if switching tabs in a folder path that doesn't exist in a separate env we navigate to the root + if (!data && isFetched) { + navigate({ + search: (prev) => ({ + ...prev, + secretPath: "/" + }) + }); + } + }, [data, isFetched]); + const { imports, folders, @@ -491,7 +507,8 @@ const Page = () => { minWidth: 100, maxWidth: tableRef.current ? tableRef.current.clientWidth - 148 // ensure value column can't collapse completely - : 800 + : 800, + ref: tableRef }); useEffect(() => { @@ -710,12 +727,18 @@ const Page = () => { const mergedSecrets = getMergedSecretsWithPending(); const mergedFolders = getMergedFoldersWithPending(); + + if (!(currentWorkspace?.version === ProjectVersion.V3)) + return ( +
+ +
+ ); + return (
env.slug === environment)?.name ?? environment - } + title="Secrets Management" description={

Inject your secrets using @@ -759,6 +782,8 @@ const Page = () => { } /> + + {!isRollbackMode ? ( <> { workspaceId={workspaceId} secretPath={secretPath} onNavigateToFolder={handleResetFilter} + canNavigate={isFetched} /> )} {canReadDynamicSecret && Boolean(dynamicSecrets?.length) && ( diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/CompareEnvironments.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/CompareEnvironments.tsx new file mode 100644 index 000000000..c3570bf5a --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/CompareEnvironments.tsx @@ -0,0 +1,595 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { MultiValue } from "react-select"; +import { + faArrowDown, + faArrowUp, + faCheckCircle, + faFilter, + faFingerprint, + faFolder, + faKey, + faRotate, + faSearch, + faWarning +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; + +import { + Badge, + Button, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuTrigger, + EmptyState, + FilterableSelect, + FormLabel, + IconButton, + Input, + Lottie, + Pagination, + Table, + TableContainer, + TBody, + Th, + THead, + Tooltip, + Tr +} from "@app/components/v2"; +import { useWorkspace } from "@app/context"; +import { + getUserTablePreference, + PreferenceKey, + setUserTablePreference +} from "@app/helpers/userTablePreferences"; +import { useDebounce, usePagination, useResetPageHelper } from "@app/hooks"; +import { useGetImportedSecretsAllEnvs } from "@app/hooks/api"; +import { useGetProjectSecretsOverview } from "@app/hooks/api/dashboard"; +import { DashboardSecretsOrderBy } from "@app/hooks/api/dashboard/types"; +import { OrderByDirection } from "@app/hooks/api/generic/types"; +import { WorkspaceEnv } from "@app/hooks/api/workspace/types"; +import { useResizableColWidth } from "@app/hooks/useResizableColWidth"; +import { + useDynamicSecretOverview, + useFolderOverview, + useSecretOverview, + useSecretRotationOverview +} from "@app/hooks/utils"; +import { SecretTableResourceCount } from "@app/pages/secret-manager/OverviewPage/components/SecretTableResourceCount"; + +import { DynamicSecretRow } from "./components/DynamicSecretRow"; +import { FolderRow } from "./components/FolderRow"; +import { SecretRotationRow } from "./components/SecretRotationRow"; +import { SecretNoAccessRow, SecretRow } from "./components/SecretRow"; + +type Props = { + secretPath: string; +}; + +enum RowType { + Folder = "folder", + DynamicSecret = "dynamic", + Secret = "secret", + SecretRotation = "rotation" +} + +type Filter = { + [key in RowType]: boolean; +}; + +const DEFAULT_FILTER_STATE = { + [RowType.Folder]: false, + [RowType.DynamicSecret]: false, + [RowType.Secret]: false, + [RowType.SecretRotation]: false +}; + +const COL_WIDTH_OFFSET = 220; + +export const CompareEnvironments = ({ secretPath }: Props) => { + const { currentWorkspace } = useWorkspace(); + const compareEnvironmentsKey = `compare-environments-${currentWorkspace.id}`; + + const [selectedEnvironments, setSelectedEnvironments] = useState(() => { + try { + const storedEnvironments = JSON.parse(localStorage.getItem(compareEnvironmentsKey) ?? "[]"); + + if (Array.isArray(storedEnvironments) && storedEnvironments.length > 0) { + const potentialEnvs: string[] = []; + storedEnvironments.forEach((env) => { + if (typeof env === "string") { + potentialEnvs.push(env); + } + }); + + return currentWorkspace.environments.filter((env) => potentialEnvs.includes(env.id)); + } + } catch { + // do nothing and proceed + } + return currentWorkspace.environments.slice(0, 2); + }); + + const [filter, setFilter] = useState(DEFAULT_FILTER_STATE); + + const { + offset, + limit, + orderDirection, + setOrderDirection, + setPage, + perPage, + page, + setPerPage, + orderBy + } = usePagination(DashboardSecretsOrderBy.Name, { + initPerPage: getUserTablePreference("secretCompareTable", PreferenceKey.PerPage, 50) + }); + + const handlePerPageChange = (newPerPage: number) => { + setPerPage(newPerPage); + setUserTablePreference("secretCompareTable", PreferenceKey.PerPage, newPerPage); + }; + + const workspaceId = currentWorkspace.id; + const [searchFilter, setSearchFilter] = useState(""); + const [debouncedSearchFilter] = useDebounce(searchFilter); + const [debouncedSelectedEnvironments] = useDebounce(selectedEnvironments); + + useEffect(() => { + localStorage.setItem( + compareEnvironmentsKey, + JSON.stringify(selectedEnvironments.map((env) => env.id)) + ); + }, [debouncedSelectedEnvironments]); + + const { + secretImports, + isImportedSecretPresentInEnv, + getImportedSecretByKey, + getEnvImportedSecretKeyCount + } = useGetImportedSecretsAllEnvs({ + projectId: workspaceId, + path: secretPath, + environments: (currentWorkspace.environments || []).map(({ slug }) => slug) + }); + + const compareEnvironments = selectedEnvironments.length + ? selectedEnvironments + : currentWorkspace.environments; + + const isFilteredByResources = Object.values(filter).some(Boolean); + const { isPending: isOverviewLoading, data: overview } = useGetProjectSecretsOverview( + { + projectId: workspaceId, + environments: compareEnvironments.map((env) => env.slug), + secretPath, + orderDirection, + orderBy, + includeFolders: isFilteredByResources ? filter.folder : true, + includeDynamicSecrets: isFilteredByResources ? filter.dynamic : true, + includeSecrets: isFilteredByResources ? filter.secret : true, + includeImports: true, + includeSecretRotations: isFilteredByResources ? filter.rotation : true, + search: debouncedSearchFilter, + limit, + offset + }, + { enabled: Boolean(compareEnvironments.length) } + ); + + const { + secrets, + folders, + dynamicSecrets, + secretRotations, + totalFolderCount, + totalSecretCount, + totalDynamicSecretCount, + totalSecretRotationCount, + totalCount = 0, + totalUniqueFoldersInPage, + totalUniqueSecretsInPage, + totalUniqueSecretImportsInPage, + totalUniqueDynamicSecretsInPage, + totalUniqueSecretRotationsInPage + } = overview ?? {}; + + const secretImportsShaped = secretImports + ?.flatMap(({ data }) => data) + .filter(Boolean) + .flatMap((item) => item?.secrets || []); + + const handleIsImportedSecretPresentInEnv = (envSlug: string, secretName: string) => { + if (secrets?.some((s) => s.key === secretName && s.env === envSlug)) { + return false; + } + if (secretImportsShaped.some((s) => s.key === secretName && s.sourceEnv === envSlug)) { + return true; + } + return isImportedSecretPresentInEnv(envSlug, secretName); + }; + + useResetPageHelper({ + totalCount, + offset, + setPage + }); + + const { folderNamesAndDescriptions, isFolderPresentInEnv } = useFolderOverview(folders); + + const { dynamicSecretNames, isDynamicSecretPresentInEnv } = + useDynamicSecretOverview(dynamicSecrets); + + const { secretRotationNames, isSecretRotationPresentInEnv, getSecretRotationByName } = + useSecretRotationOverview(secretRotations); + + const { secKeys, getEnvSecretKeyCount } = useSecretOverview( + secrets?.concat(secretImportsShaped) || [] + ); + + const getSecretByKey = useCallback( + (env: string, key: string) => { + const sec = secrets?.find((s) => s.env === env && s.key === key); + return sec; + }, + [secrets] + ); + + const [tableWidth, setTableWidth] = useState(0); + const tableRef = useRef(null); + + const { handleMouseDown, isResizing, colWidth } = useResizableColWidth({ + initialWidth: 320, + minWidth: 160, + maxWidth: tableRef.current + ? tableRef.current.clientWidth - COL_WIDTH_OFFSET // ensure value column can't collapse completely + : 800, + ref: tableRef + }); + + const handleToggleRowType = useCallback( + (rowType: RowType) => + setFilter((state) => { + return { + ...state, + [rowType]: !state[rowType] + }; + }), + [] + ); + + const isTableEmpty = totalCount === 0; + + const isTableFiltered = isFilteredByResources; + + useEffect(() => { + const element = tableRef.current; + if (!element) return; + + const handleResize = () => { + setTableWidth(element.clientWidth - 1); + }; + + const resizeObserver = new ResizeObserver(handleResize); + resizeObserver.observe(element); + + // eslint-disable-next-line consistent-return + return () => { + resizeObserver.disconnect(); + }; + }, [tableRef]); + + return ( + // scott: this is reverse to fix z-indexing bug of dropdown with sticky table cols; couldn't resolve with flex-col +

+ {!isOverviewLoading && totalCount > 0 && ( + + } + className="rounded-b-lg border border-solid border-mineshaft-500 bg-mineshaft-700" + count={totalCount} + page={page} + perPage={perPage} + onChangePage={(newPage) => setPage(newPage)} + onChangePerPage={handlePerPageChange} + /> + )} +
+ + {/* eslint-disable-next-line no-nested-ternary */} + {isOverviewLoading ? ( +
+ +
+ ) : isTableEmpty ? ( + + ) : ( + + + + + {compareEnvironments?.map(({ name, slug }, index) => { + const envSecKeyCount = getEnvSecretKeyCount(slug); + const importedSecKeyCount = getEnvImportedSecretKeyCount(slug); + const missingKeyCount = secKeys.length - envSecKeyCount - importedSecKeyCount; + + return ( + + ); + })} + + + + {folderNamesAndDescriptions.map(({ name: folderName }, index) => ( + + ))} + {dynamicSecretNames.map((dynamicSecretName, index) => ( + + ))} + {secretRotationNames.map((secretRotationName, index) => ( + + ))} + {secKeys.map((key, index) => ( + + ))} + totalCount ? totalCount % perPage : perPage) - + (totalUniqueFoldersInPage || 0) - + (totalUniqueDynamicSecretsInPage || 0) - + (totalUniqueSecretsInPage || 0) - + (totalUniqueSecretImportsInPage || 0) - + (totalUniqueSecretRotationsInPage || 0), + 0 + )} + /> + +
+
+
+
+
+
+
+ Name + + setOrderDirection((prev) => + prev === OrderByDirection.ASC + ? OrderByDirection.DESC + : OrderByDirection.ASC + ) + } + > + + +
+
+
+
+ {name} + {missingKeyCount > 0 && ( + + {missingKeyCount} secret{missingKeyCount > 1 ? "s" : ""} missing + compared to other environments on this page + + } + > + + + {missingKeyCount} + + + )} +
+
+ )} +
+
+
+ setSearchFilter(e.target.value)} + className="h-full flex-1" + placeholder="Search by resource name..." + leftIcon={} + containerClassName="h-10" + /> + {isTableFiltered && ( + + )} + {compareEnvironments.length > 0 && ( + + + + + + Filter by Resource + { + e.preventDefault(); + handleToggleRowType(RowType.Folder); + }} + icon={filter[RowType.Folder] && } + iconPos="right" + > +
+ + Folders +
+
+ { + e.preventDefault(); + handleToggleRowType(RowType.DynamicSecret); + }} + icon={filter[RowType.DynamicSecret] && } + iconPos="right" + > +
+ + Dynamic Secrets +
+
+ { + e.preventDefault(); + handleToggleRowType(RowType.SecretRotation); + }} + icon={filter[RowType.SecretRotation] && } + iconPos="right" + > +
+ + Secret Rotations +
+
+ { + e.preventDefault(); + handleToggleRowType(RowType.Secret); + }} + icon={filter[RowType.Secret] && } + iconPos="right" + > +
+ + Secrets +
+
+
+
+ )} +
+
+ + { + const selected = value as MultiValue; + + setSelectedEnvironments((selected as WorkspaceEnv[]) ?? []); + }} + placeholder="Leave blank to compare all environments" + options={currentWorkspace.environments} + getOptionValue={(option) => option.slug} + getOptionLabel={(option) => option.name} + isMulti + /> +
+
+ ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/DynamicSecretRow/DynamicSecretRow.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/DynamicSecretRow/DynamicSecretRow.tsx new file mode 100644 index 000000000..16de6533b --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/DynamicSecretRow/DynamicSecretRow.tsx @@ -0,0 +1,41 @@ +import { faFingerprint } from "@fortawesome/free-solid-svg-icons"; + +import { Tr } from "@app/components/v2"; + +import { EnvironmentStatusCell, ResourceNameCell } from "../shared"; + +type Props = { + dynamicSecretName: string; + environments: { name: string; slug: string }[]; + isDynamicSecretInEnv: (name: string, env: string) => boolean; + colWidth: number; +}; + +export const DynamicSecretRow = ({ + dynamicSecretName, + environments = [], + isDynamicSecretInEnv, + colWidth +}: Props) => { + return ( + + + {environments.map(({ slug }, i) => { + const isPresent = isDynamicSecretInEnv(dynamicSecretName, slug); + + return ( + + ); + })} + + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/DynamicSecretRow/index.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/DynamicSecretRow/index.tsx new file mode 100644 index 000000000..5c7bf445a --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/DynamicSecretRow/index.tsx @@ -0,0 +1 @@ +export { DynamicSecretRow } from "./DynamicSecretRow"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/FolderRow/FolderRow.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/FolderRow/FolderRow.tsx new file mode 100644 index 000000000..a3d672e13 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/FolderRow/FolderRow.tsx @@ -0,0 +1,41 @@ +import { faFolder } from "@fortawesome/free-solid-svg-icons"; + +import { Tr } from "@app/components/v2"; + +import { EnvironmentStatusCell, ResourceNameCell } from "../shared"; + +type Props = { + folderName: string; + environments: { name: string; slug: string }[]; + isFolderPresentInEnv: (name: string, env: string) => boolean; + colWidth: number; +}; + +export const FolderRow = ({ + folderName, + environments = [], + isFolderPresentInEnv, + colWidth +}: Props) => { + return ( + + + {environments.map(({ slug }, i) => { + const isPresent = isFolderPresentInEnv(folderName, slug); + + return ( + + ); + })} + + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/FolderRow/index.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/FolderRow/index.tsx new file mode 100644 index 000000000..171b2e596 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/FolderRow/index.tsx @@ -0,0 +1 @@ +export { FolderRow } from "./FolderRow"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRotationRow/SecretRotationRow.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRotationRow/SecretRotationRow.tsx new file mode 100644 index 000000000..d5c938e9b --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRotationRow/SecretRotationRow.tsx @@ -0,0 +1,179 @@ +import { faEye, faEyeSlash, faInfoCircle, faRotate } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; + +import { IconButton, TableContainer, Tag, Td, Tooltip, Tr } from "@app/components/v2"; +import { Blur } from "@app/components/v2/Blur"; +import { InfisicalSecretInput } from "@app/components/v2/InfisicalSecretInput"; +import { SECRET_ROTATION_MAP } from "@app/helpers/secretRotationsV2"; +import { useToggle } from "@app/hooks"; +import { TSecretRotationV2 } from "@app/hooks/api/secretRotationsV2"; + +import { EnvironmentStatusCell, ResourceNameCell } from "../shared"; + +type Props = { + secretRotationName: string; + environments: { name: string; slug: string }[]; + isSecretRotationInEnv: (name: string, env: string) => boolean; + getSecretRotationByName: (slug: string, name: string) => TSecretRotationV2 | undefined; + colWidth: number; + tableWidth: number; +}; + +export const SecretRotationRow = ({ + secretRotationName, + environments = [], + isSecretRotationInEnv, + colWidth, + getSecretRotationByName, + tableWidth +}: Props) => { + const [isExpanded, setIsExpanded] = useToggle(false); + const [isSecretVisible, setIsSecretVisible] = useToggle(); + + const totalCols = environments.length + 1; // secret key row + + return ( + <> + + + {environments.map(({ slug }, i) => { + const isPresent = isSecretRotationInEnv(secretRotationName, slug); + + return ( + + ); + })} + + {isExpanded && + environments.map(({ name: envName, slug }) => { + const secretRotation = getSecretRotationByName(slug, secretRotationName); + + if (!secretRotation) return null; + + const { type, secrets, description } = secretRotation; + + const { name: rotationType, image } = SECRET_ROTATION_MAP[type]; + + return ( + + +
+
+
+
+ {envName} + + {`${rotationType} + {rotationType} + + {description && ( + + + + )} +
+
+ + setIsSecretVisible.toggle()} + > + + + +
+ + + + {secrets.map((secret, index) => { + return ( + + + + + + + ); + })} + +
+
+ + {secret?.key ?? "********"} + +
+
+ {/* eslint-disable-next-line no-nested-ternary */} + {!secret ? ( +
********
+ ) : secret.secretValueHidden ? ( + + ) : ( + {}} + /> + )} +
+
+
+ + + ); + })} + + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRotationRow/index.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRotationRow/index.tsx new file mode 100644 index 000000000..a0b2fcfa7 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRotationRow/index.tsx @@ -0,0 +1 @@ +export { SecretRotationRow } from "./SecretRotationRow"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/EnvironmentSecretRow.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/EnvironmentSecretRow.tsx new file mode 100644 index 000000000..87db191f6 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/EnvironmentSecretRow.tsx @@ -0,0 +1,49 @@ +import { faEyeSlash } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { Tooltip } from "@app/components/v2"; +import { InfisicalSecretInput } from "@app/components/v2/InfisicalSecretInput"; + +type Props = { + defaultValue?: string | null; + isOverride?: boolean; + isVisible?: boolean; + isImportedSecret: boolean; + environment: string; + secretValueHidden: boolean; + secretPath: string; +}; + +export const EnvironmentSecretRow = ({ + defaultValue, + isOverride, + isImportedSecret, + secretValueHidden, + environment, + secretPath, + isVisible +}: Props) => { + return ( +
+ {secretValueHidden && !isOverride && ( + + + + )} +
+ {}} + isReadOnly + value={defaultValue as string} + key="secret-input" + isVisible={isVisible && !secretValueHidden} + secretPath={secretPath} + environment={environment} + isImport={isImportedSecret} + defaultValue={secretValueHidden ? "" : undefined} + canEditButNotView={secretValueHidden && !isOverride} + /> +
+
+ ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/SecretNoAccessRow.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/SecretNoAccessRow.tsx new file mode 100644 index 000000000..075726d1b --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/SecretNoAccessRow.tsx @@ -0,0 +1,44 @@ +import { faLock } from "@fortawesome/free-solid-svg-icons"; + +import { Tr } from "@app/components/v2"; +import { Blur } from "@app/components/v2/Blur"; + +import { EnvironmentStatusCell, ResourceNameCell } from "../shared"; + +type Props = { + environments: { name: string; slug: string }[]; + count: number; + colWidth: number; +}; + +export const SecretNoAccessRow = ({ environments = [], count, colWidth }: Props) => { + return ( + <> + {Array.from(Array(count)).map((_, j) => ( + + } + iconClassName="text-bunker-400" + icon={faLock} + colWidth={colWidth} + tooltipContent="You do not have permission to view this secret" + /> + {environments.map(({ slug }, i) => { + return ( + + ); + })} + + ))} + + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/SecretRow.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/SecretRow.tsx new file mode 100644 index 000000000..095b50356 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/SecretRow.tsx @@ -0,0 +1,231 @@ +import { subject } from "@casl/ability"; +import { + faCodeBranch, + faEye, + faEyeSlash, + faFileImport, + faKey, + faRotate +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { IconButton, TableContainer, Td, Tooltip, Tr } from "@app/components/v2"; +import { useProjectPermission } from "@app/context"; +import { + ProjectPermissionSecretActions, + ProjectPermissionSub +} from "@app/context/ProjectPermissionContext/types"; +import { useToggle } from "@app/hooks"; +import { SecretV3RawSanitized } from "@app/hooks/api/secrets/types"; +import { WorkspaceEnv } from "@app/hooks/api/types"; +import { HIDDEN_SECRET_VALUE } from "@app/pages/secret-manager/SecretDashboardPage/components/SecretListView/SecretItem"; + +import { EnvironmentStatus, EnvironmentStatusCell, ResourceNameCell } from "../shared"; +import { EnvironmentSecretRow } from "./EnvironmentSecretRow"; + +type Props = { + secretKey: string; + secretPath: string; + environments: { name: string; slug: string }[]; + getSecretByKey: (slug: string, key: string) => SecretV3RawSanitized | undefined; + isImportedSecretPresentInEnv: (env: string, secretName: string) => boolean; + getImportedSecretByKey: ( + env: string, + secretName: string + ) => { secret?: SecretV3RawSanitized; environmentInfo?: WorkspaceEnv } | undefined; + colWidth: number; + tableWidth: number; +}; + +export const SecretRow = ({ + secretKey, + environments = [], + secretPath, + getSecretByKey, + isImportedSecretPresentInEnv, + getImportedSecretByKey, + colWidth, + tableWidth +}: Props) => { + const [isFormExpanded, setIsFormExpanded] = useToggle(); + const totalCols = environments.length + 1; // secret key row + const [isSecretVisible, setIsSecretVisible] = useToggle(); + + const { permission } = useProjectPermission(); + + const getDefaultValue = ( + secret: SecretV3RawSanitized | undefined, + importedSecret: { secret?: SecretV3RawSanitized } | undefined + ) => { + const canEditSecretValue = permission.can( + ProjectPermissionSecretActions.Edit, + subject(ProjectPermissionSub.Secrets, { + environment: secret?.env || "", + secretPath: secret?.path || "", + secretName: secret?.key || "", + secretTags: ["*"] + }) + ); + + if (secret?.secretValueHidden && !secret?.valueOverride) { + return canEditSecretValue ? HIDDEN_SECRET_VALUE : ""; + } + return secret?.valueOverride || secret?.value || importedSecret?.secret?.value || ""; + }; + + return ( + <> + setIsFormExpanded.toggle()} + className="group border-mineshaft-500" + > + + {environments.map(({ slug }, i) => { + const secret = getSecretByKey(slug, secretKey); + + const isSecretImported = isImportedSecretPresentInEnv(slug, secretKey); + + const isSecretPresent = Boolean(secret); + const isSecretEmpty = secret?.value === ""; + + let status: EnvironmentStatus; + + if (isSecretEmpty) { + status = "empty"; + } else if (isSecretPresent) { + status = "present"; + } else if (isSecretImported) { + status = "imported"; + } else { + status = "missing"; + } + + return ( + + ); + })} + + {isFormExpanded && ( + + +
+ + + + + + +
+ + setIsSecretVisible.toggle()} + > + + + +
+ + + + {environments.map(({ name, slug }) => { + const secret = getSecretByKey(slug, secretKey); + + const isImportedSecret = isImportedSecretPresentInEnv(slug, secretKey); + const importedSecret = getImportedSecretByKey(slug, secretKey); + + return ( + + + + + ); + })} + +
+ Environment + + Value +
+
+ {name} + {isImportedSecret && ( + + + + )} + {secret?.isRotatedSecret && ( + + + + )} + {secret?.valueOverride && ( + + + + )} +
+
+ +
+
+
+ + + )} + + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/index.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/index.tsx new file mode 100644 index 000000000..a1e4a3d51 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/SecretRow/index.tsx @@ -0,0 +1,2 @@ +export { SecretNoAccessRow } from "./SecretNoAccessRow"; +export { SecretRow } from "./SecretRow"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/EnvironmentStatusCell.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/EnvironmentStatusCell.tsx new file mode 100644 index 000000000..fa5d2f8bb --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/EnvironmentStatusCell.tsx @@ -0,0 +1,75 @@ +import { IconDefinition } from "@fortawesome/free-brands-svg-icons"; +import { faCircle } from "@fortawesome/free-regular-svg-icons"; +import { faBan, faCheck, faFileImport, faXmark } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; + +import { Td, Tooltip } from "@app/components/v2"; + +export type EnvironmentStatus = "present" | "missing" | "empty" | "imported" | "no-access"; + +type Props = { + isLast: boolean; + status: EnvironmentStatus; +}; + +export const EnvironmentStatusCell = ({ isLast, status }: Props) => { + let tooltipContent: string; + let icon: IconDefinition; + let iconClassName: string; + + switch (status) { + case "present": + tooltipContent = "Present in environment"; + icon = faCheck; + iconClassName = "h-3 w-3"; + break; + case "missing": + tooltipContent = "Missing from environment"; + icon = faXmark; + iconClassName = "h-3.5 w-3.5"; + break; + case "empty": + tooltipContent = "Empty value in environment"; + icon = faCircle; + iconClassName = "h-3 w-3"; + break; + case "imported": + tooltipContent = "Imported into environment"; + icon = faFileImport; + iconClassName = "h-3 w-3"; + break; + case "no-access": + tooltipContent = "You do not have permission to view this secret"; + icon = faBan; + iconClassName = "h-3 w-3"; + break; + default: + throw new Error(`Unhandled environment status: ${status as string}`); + } + + return ( + +
+
+ + + +
+
+ + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/ResourceNameCell.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/ResourceNameCell.tsx new file mode 100644 index 000000000..079b563d5 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/ResourceNameCell.tsx @@ -0,0 +1,47 @@ +import { ReactElement } from "react"; +import { IconDefinition } from "@fortawesome/free-brands-svg-icons"; +import { faAngleDown } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { Td, Tooltip } from "@app/components/v2"; + +type Props = { + isRowExpanded?: boolean; + label: ReactElement | string; + icon: IconDefinition; + iconClassName?: string; + colWidth: number; + tooltipContent?: string; +}; + +export const ResourceNameCell = ({ + isRowExpanded, + label, + icon, + iconClassName, + colWidth, + tooltipContent +}: Props) => { + return ( + + +
+
+ +
+ {typeof label === "string" ? {label} : label} +
+
+ + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/index.ts b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/index.ts new file mode 100644 index 000000000..c8bd53cbe --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/components/shared/index.ts @@ -0,0 +1,2 @@ +export * from "./EnvironmentStatusCell"; +export * from "./ResourceNameCell"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/index.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/index.tsx new file mode 100644 index 000000000..f5c997972 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/CompareEnvironments/index.tsx @@ -0,0 +1 @@ +export * from "./CompareEnvironments"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/EnvironmentTabs/EnvironmentTabs.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/EnvironmentTabs/EnvironmentTabs.tsx new file mode 100644 index 000000000..66fd3a878 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/EnvironmentTabs/EnvironmentTabs.tsx @@ -0,0 +1,242 @@ +import { useState } from "react"; +import { faArrowRightArrowLeft, faEllipsisH, faPlus } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useQueryClient } from "@tanstack/react-query"; +import { useNavigate, useParams } from "@tanstack/react-router"; + +import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal"; +import { ProjectPermissionCan } from "@app/components/permissions"; +import { + Button, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuTrigger, + Modal, + ModalContent, + Tab, + TabList, + Tabs, + Tooltip +} from "@app/components/v2"; +import { ROUTE_PATHS } from "@app/const/routes"; +import { + ProjectPermissionActions, + ProjectPermissionSub, + useSubscription, + useWorkspace +} from "@app/context"; +import { usePopUp } from "@app/hooks"; +import { workspaceKeys } from "@app/hooks/api"; +import { WorkspaceEnv } from "@app/hooks/api/workspace/types"; +import { AddEnvironmentModal } from "@app/pages/secret-manager/SettingsPage/components/EnvironmentSection/AddEnvironmentModal"; + +import { CompareEnvironments } from "../CompareEnvironments"; + +const COMPARE_ENVIRONMENT_TAB = "__COMPARE_ENVIRONMENT_TAB__"; +const ADD_ENVIRONMENT_TAB = "__ADD_ENVIRONMENT_TAB__"; +const VIEW_MORE_ENVIRONMENT_TAB = "__VIEW_MORE_ENVIRONMENT_TAB__"; + +type Props = { + secretPath: string; +}; + +const TABS_TO_SHOW = 5; + +export const EnvironmentTabs = ({ secretPath }: Props) => { + const { currentWorkspace } = useWorkspace(); + const currentEnv = useParams({ + from: ROUTE_PATHS.SecretManager.SecretDashboardPage.id, + select: (el) => el.envSlug + }); + + const { subscription } = useSubscription(); + + const isMoreEnvironmentsAllowed = + subscription?.environmentLimit && currentWorkspace?.environments + ? currentWorkspace.environments.length < subscription.environmentLimit + : true; + + const [isNavigating, setIsNavigating] = useState(false); + + const navigate = useNavigate(); + + const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([ + "compareEnvironments", + "createEnvironment", + "upgradePlan" + ] as const); + + const selectedIndex = currentWorkspace.environments.findIndex((env) => env.slug === currentEnv); + + let tabEnvironments: WorkspaceEnv[]; + let dropdownEnvironments: WorkspaceEnv[]; + + if (selectedIndex < TABS_TO_SHOW) { + tabEnvironments = currentWorkspace.environments.slice(0, TABS_TO_SHOW); + dropdownEnvironments = currentWorkspace.environments.slice(TABS_TO_SHOW); + } else { + tabEnvironments = [ + ...currentWorkspace.environments.slice(0, TABS_TO_SHOW - 1), + currentWorkspace.environments[selectedIndex] + ]; + dropdownEnvironments = currentWorkspace.environments + .slice(TABS_TO_SHOW - 1) + .filter((env) => env.slug !== currentEnv); + } + + const queryClient = useQueryClient(); + + const handleSelect = async (envSlug: string) => { + if (isNavigating) return; + + setIsNavigating(true); + await navigate({ + to: ROUTE_PATHS.SecretManager.SecretDashboardPage.path, + params: { + envSlug, + projectId: currentWorkspace.id + }, + search: (prev) => prev + }); + setIsNavigating(false); + }; + + const handleAddEnvironment = () => { + if (isMoreEnvironmentsAllowed) { + handlePopUpOpen("createEnvironment"); + } else { + handlePopUpOpen("upgradePlan"); + } + }; + + return ( + <> + { + if (value === COMPARE_ENVIRONMENT_TAB) { + handlePopUpOpen("compareEnvironments"); + return; + } + + if (value === ADD_ENVIRONMENT_TAB) { + handleAddEnvironment(); + return; + } + + handleSelect(value); + }} + defaultValue="environment-tabs" + > + + {tabEnvironments.map((environment) => ( + +

{environment.name}

+
+ ))} + {dropdownEnvironments.length ? ( + + + + +
+ +
+
+
+
+ + Environments +
+ {dropdownEnvironments.map((environment) => ( + { + e.stopPropagation(); + handleSelect(environment.slug); + }} + > + {environment.name} + + ))} +
+
+ + {(isAllowed) => ( + + + + )} + + + + ) : ( + + +
+ +
+
+
+ )} + {currentWorkspace.environments.length > 1 && ( + +
+ + Compare Environments +
+
+ )} + + + handlePopUpToggle("compareEnvironments", isOpen)} + > + + + + + handlePopUpToggle("upgradePlan", isOpen)} + text="You can add custom environments if you switch to Infisical's Team plan." + /> + handlePopUpToggle("createEnvironment", isOpen)} + onComplete={async (env) => { + await queryClient.refetchQueries({ + queryKey: workspaceKeys.getWorkspaceById(currentWorkspace.id) + }); + handleSelect(env.slug); + }} + /> + + ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/EnvironmentTabs/index.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/EnvironmentTabs/index.tsx new file mode 100644 index 000000000..76be6609b --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/EnvironmentTabs/index.tsx @@ -0,0 +1 @@ +export * from "./EnvironmentTabs"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderBreadCrumbs/FolderBreadCrumbs.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderBreadCrumbs/FolderBreadCrumbs.tsx new file mode 100644 index 000000000..a2169fa5a --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderBreadCrumbs/FolderBreadCrumbs.tsx @@ -0,0 +1,52 @@ +import { faFolderOpen } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useNavigate } from "@tanstack/react-router"; + +type Props = { + secretPath: string; +}; + +export const FolderBreadCrumbs = ({ secretPath = "/" }: Props) => { + const navigate = useNavigate({ + from: "/projects/secret-management/$projectId/secrets/$envSlug" + }); + + const onFolderCrumbClick = (index: number) => { + const newSecPath = `/${secretPath.split("/").filter(Boolean).slice(0, index).join("/")}`; + if (secretPath === newSecPath) return; + navigate({ + search: (prev) => ({ ...prev, secretPath: newSecPath }) + }); + }; + + return ( +
+
onFolderCrumbClick(0)} + onKeyDown={() => null} + role="button" + tabIndex={0} + > + +
+ {(secretPath || "") + .split("/") + .filter(Boolean) + .map((path, index, arr) => ( +
onFolderCrumbClick(index + 1)} + onKeyDown={() => null} + role="button" + tabIndex={0} + > + {path} +
+ ))} +
+ ); +}; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderBreadCrumbs/index.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderBreadCrumbs/index.tsx new file mode 100644 index 000000000..8224cdb25 --- /dev/null +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderBreadCrumbs/index.tsx @@ -0,0 +1 @@ +export { FolderBreadCrumbs } from "./FolderBreadCrumbs"; diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderListView/FolderListView.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderListView/FolderListView.tsx index 9b8c9ccaa..fd65bc639 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderListView/FolderListView.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/FolderListView/FolderListView.tsx @@ -36,6 +36,7 @@ type Props = { workspaceId: string; secretPath?: string; onNavigateToFolder: (path: string) => void; + canNavigate: boolean; }; export const FolderListView = ({ @@ -43,7 +44,8 @@ export const FolderListView = ({ environment, workspaceId, secretPath = "/", - onNavigateToFolder + onNavigateToFolder, + canNavigate }: Props) => { const { popUp, handlePopUpToggle, handlePopUpOpen, handlePopUpClose } = usePopUp([ "updateFolder", @@ -190,7 +192,7 @@ export const FolderListView = ({ }; const handleFolderClick = (name: string, isPending?: boolean) => { - if (isPending) { + if (isPending || !canNavigate) { return; } const path = `${secretPathQueryparam === "/" ? "" : secretPathQueryparam}/${name}`; diff --git a/frontend/src/pages/secret-manager/SecretSyncDetailsByIDPage/components/SecretSyncAuditLogsSection.tsx b/frontend/src/pages/secret-manager/SecretSyncDetailsByIDPage/components/SecretSyncAuditLogsSection.tsx index ddb618708..58c00db6f 100644 --- a/frontend/src/pages/secret-manager/SecretSyncDetailsByIDPage/components/SecretSyncAuditLogsSection.tsx +++ b/frontend/src/pages/secret-manager/SecretSyncDetailsByIDPage/components/SecretSyncAuditLogsSection.tsx @@ -2,7 +2,7 @@ import { faFingerprint } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Link } from "@tanstack/react-router"; -import { useSubscription } from "@app/context"; +import { useSubscription, useWorkspace } from "@app/context"; import { EventType } from "@app/hooks/api/auditLogs/enums"; import { TSecretSync } from "@app/hooks/api/secretSyncs"; import { LogsSection } from "@app/pages/organization/AuditLogsPage/components/LogsSection"; @@ -19,6 +19,7 @@ type Props = { export const SecretSyncAuditLogsSection = ({ secretSync }: Props) => { const { subscription } = useSubscription(); + const { currentWorkspace } = useWorkspace(); const auditLogsRetentionDays = subscription?.auditLogsRetentionDays ?? 30; @@ -36,6 +37,7 @@ export const SecretSyncAuditLogsSection = ({ secretSync }: Props) => { ; - handlePopUpClose: (popUpName: keyof UsePopUpState<["createEnv"]>) => void; - handlePopUpToggle: (popUpName: keyof UsePopUpState<["createEnv"]>, state?: boolean) => void; + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; + onComplete?: (environment: WorkspaceEnv) => void; }; const schema = z.object({ @@ -24,10 +24,14 @@ const schema = z.object({ export type FormData = z.infer; -export const AddEnvironmentModal = ({ popUp, handlePopUpClose, handlePopUpToggle }: Props) => { +type ContentProps = { + onComplete: (environment: WorkspaceEnv) => void; +}; + +const Content = ({ onComplete }: ContentProps) => { const { currentWorkspace } = useWorkspace(); const { mutateAsync, isPending } = useCreateWsEnvironment(); - const { control, handleSubmit, reset } = useForm({ + const { control, handleSubmit } = useForm({ resolver: zodResolver(schema) }); @@ -35,7 +39,7 @@ export const AddEnvironmentModal = ({ popUp, handlePopUpClose, handlePopUpToggle try { if (!currentWorkspace?.id) return; - await mutateAsync({ + const env = await mutateAsync({ workspaceId: currentWorkspace.id, name: environmentName, slug: environmentSlug @@ -46,7 +50,7 @@ export const AddEnvironmentModal = ({ popUp, handlePopUpClose, handlePopUpToggle type: "success" }); - handlePopUpClose("createEnv"); + onComplete(env); } catch (err) { console.error(err); createNotification({ @@ -57,64 +61,62 @@ export const AddEnvironmentModal = ({ popUp, handlePopUpClose, handlePopUpToggle }; return ( - { - handlePopUpToggle("createEnv", isOpen); - reset(); - }} - > - - - ( - - - - )} - /> - ( - - - - )} - /> -
- + + ( + + + + )} + /> + ( + + + + )} + /> +
+ + + + +
+ + ); +}; - -
- +export const AddEnvironmentModal = ({ onComplete, ...props }: Props) => { + return ( + + + { + if (onComplete) onComplete(env); + props.onOpenChange(false); + }} + /> ); diff --git a/frontend/src/pages/secret-manager/SettingsPage/components/EnvironmentSection/EnvironmentSection.tsx b/frontend/src/pages/secret-manager/SettingsPage/components/EnvironmentSection/EnvironmentSection.tsx index 323fe2640..34acf0c7b 100644 --- a/frontend/src/pages/secret-manager/SettingsPage/components/EnvironmentSection/EnvironmentSection.tsx +++ b/frontend/src/pages/secret-manager/SettingsPage/components/EnvironmentSection/EnvironmentSection.tsx @@ -103,9 +103,8 @@ export const EnvironmentSection = () => { )} handlePopUpToggle("createEnv", isOpen)} /> rootRoute, - } as any) +const middlewaresRestrictLoginSignupRoute = middlewaresRestrictLoginSignupImport.update({ + id: "/_restrict-login-signup", + getParentRoute: () => rootRoute +} as any); const middlewaresAuthenticateRoute = middlewaresAuthenticateImport.update({ - id: '/_authenticate', - getParentRoute: () => rootRoute, -} as any) + id: "/_authenticate", + getParentRoute: () => rootRoute +} as any); -const publicShareSecretPageRouteRoute = publicShareSecretPageRouteImport.update( - { - id: '/share-secret', - path: '/share-secret', - getParentRoute: () => rootRoute, - } as any, -) +const publicShareSecretPageRouteRoute = publicShareSecretPageRouteImport.update({ + id: "/share-secret", + path: "/share-secret", + getParentRoute: () => rootRoute +} as any); const authCliRedirectPageRouteRoute = authCliRedirectPageRouteImport.update({ - id: '/cli-redirect', - path: '/cli-redirect', - getParentRoute: () => rootRoute, -} as any) + id: "/cli-redirect", + path: "/cli-redirect", + getParentRoute: () => rootRoute +} as any); const indexRoute = indexImport.update({ - id: '/', - path: '/', - getParentRoute: () => rootRoute, -} as any) + id: "/", + path: "/", + getParentRoute: () => rootRoute +} as any); const RestrictLoginSignupSignupRoute = RestrictLoginSignupSignupImport.update({ - id: '/signup', - path: '/signup', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, -} as any) + id: "/signup", + path: "/signup", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); const RestrictLoginSignupLoginRoute = RestrictLoginSignupLoginImport.update({ - id: '/login', - path: '/login', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, -} as any) + id: "/login", + path: "/login", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); -const AuthenticatePersonalSettingsRoute = - AuthenticatePersonalSettingsImport.update({ - id: '/personal-settings', - path: '/personal-settings', - getParentRoute: () => middlewaresAuthenticateRoute, - } as any) +const AuthenticatePersonalSettingsRoute = AuthenticatePersonalSettingsImport.update({ + id: "/personal-settings", + path: "/personal-settings", + getParentRoute: () => middlewaresAuthenticateRoute +} as any); -const middlewaresInjectOrgDetailsRoute = - middlewaresInjectOrgDetailsImport.update({ - id: '/_inject-org-details', - getParentRoute: () => middlewaresAuthenticateRoute, - } as any) +const middlewaresInjectOrgDetailsRoute = middlewaresInjectOrgDetailsImport.update({ + id: "/_inject-org-details", + getParentRoute: () => middlewaresAuthenticateRoute +} as any); const authVerifyEmailPageRouteRoute = authVerifyEmailPageRouteImport.update({ - id: '/verify-email', - path: '/verify-email', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, -} as any) + id: "/verify-email", + path: "/verify-email", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); const authSignUpInvitePageRouteRoute = authSignUpInvitePageRouteImport.update({ - id: '/signupinvite', - path: '/signupinvite', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, -} as any) + id: "/signupinvite", + path: "/signupinvite", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); -const authRequestNewInvitePageRouteRoute = - authRequestNewInvitePageRouteImport.update({ - id: '/requestnewinvite', - path: '/requestnewinvite', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, - } as any) +const authRequestNewInvitePageRouteRoute = authRequestNewInvitePageRouteImport.update({ + id: "/requestnewinvite", + path: "/requestnewinvite", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); -const authPasswordResetPageRouteRoute = authPasswordResetPageRouteImport.update( - { - id: '/password-reset', - path: '/password-reset', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, - } as any, -) +const authPasswordResetPageRouteRoute = authPasswordResetPageRouteImport.update({ + id: "/password-reset", + path: "/password-reset", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); -const authEmailNotVerifiedPageRouteRoute = - authEmailNotVerifiedPageRouteImport.update({ - id: '/email-not-verified', - path: '/email-not-verified', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, - } as any) +const authEmailNotVerifiedPageRouteRoute = authEmailNotVerifiedPageRouteImport.update({ + id: "/email-not-verified", + path: "/email-not-verified", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); -const authPasswordSetupPageRouteRoute = authPasswordSetupPageRouteImport.update( - { - id: '/password-setup', - path: '/password-setup', - getParentRoute: () => middlewaresAuthenticateRoute, - } as any, -) +const authPasswordSetupPageRouteRoute = authPasswordSetupPageRouteImport.update({ + id: "/password-setup", + path: "/password-setup", + getParentRoute: () => middlewaresAuthenticateRoute +} as any); const userLayoutRoute = userLayoutImport.update({ - id: '/_layout', - getParentRoute: () => AuthenticatePersonalSettingsRoute, -} as any) + id: "/_layout", + getParentRoute: () => AuthenticatePersonalSettingsRoute +} as any); -const AuthenticateInjectOrgDetailsAdminRoute = - AuthenticateInjectOrgDetailsAdminImport.update({ - id: '/admin', - path: '/admin', - getParentRoute: () => middlewaresInjectOrgDetailsRoute, - } as any) +const AuthenticateInjectOrgDetailsAdminRoute = AuthenticateInjectOrgDetailsAdminImport.update({ + id: "/admin", + path: "/admin", + getParentRoute: () => middlewaresInjectOrgDetailsRoute +} as any); const organizationLayoutRoute = organizationLayoutImport.update({ - id: '/_org-layout', - getParentRoute: () => middlewaresInjectOrgDetailsRoute, -} as any) + id: "/_org-layout", + getParentRoute: () => middlewaresInjectOrgDetailsRoute +} as any); -const publicViewSharedSecretByIDPageRouteRoute = - publicViewSharedSecretByIDPageRouteImport.update({ - id: '/shared/secret/$secretId', - path: '/shared/secret/$secretId', - getParentRoute: () => rootRoute, - } as any) +const publicViewSharedSecretByIDPageRouteRoute = publicViewSharedSecretByIDPageRouteImport.update({ + id: "/shared/secret/$secretId", + path: "/shared/secret/$secretId", + getParentRoute: () => rootRoute +} as any); -const publicViewSecretRequestByIDPageRouteRoute = - publicViewSecretRequestByIDPageRouteImport.update({ - id: '/secret-request/secret/$secretRequestId', - path: '/secret-request/secret/$secretRequestId', - getParentRoute: () => rootRoute, - } as any) +const publicViewSecretRequestByIDPageRouteRoute = publicViewSecretRequestByIDPageRouteImport.update( + { + id: "/secret-request/secret/$secretRequestId", + path: "/secret-request/secret/$secretRequestId", + getParentRoute: () => rootRoute + } as any +); const authSignUpSsoPageRouteRoute = authSignUpSsoPageRouteImport.update({ - id: '/sso', - path: '/sso', - getParentRoute: () => RestrictLoginSignupSignupRoute, -} as any) + id: "/sso", + path: "/sso", + getParentRoute: () => RestrictLoginSignupSignupRoute +} as any); const authLoginSsoPageRouteRoute = authLoginSsoPageRouteImport.update({ - id: '/sso', - path: '/sso', - getParentRoute: () => RestrictLoginSignupLoginRoute, -} as any) + id: "/sso", + path: "/sso", + getParentRoute: () => RestrictLoginSignupLoginRoute +} as any); const authSelectOrgPageRouteRoute = authSelectOrgPageRouteImport.update({ - id: '/select-organization', - path: '/select-organization', - getParentRoute: () => RestrictLoginSignupLoginRoute, -} as any) + id: "/select-organization", + path: "/select-organization", + getParentRoute: () => RestrictLoginSignupLoginRoute +} as any); const authLoginLdapPageRouteRoute = authLoginLdapPageRouteImport.update({ - id: '/ldap', - path: '/ldap', - getParentRoute: () => RestrictLoginSignupLoginRoute, -} as any) + id: "/ldap", + path: "/ldap", + getParentRoute: () => RestrictLoginSignupLoginRoute +} as any); const authAdminLoginPageRouteRoute = authAdminLoginPageRouteImport.update({ - id: '/admin', - path: '/admin', - getParentRoute: () => RestrictLoginSignupLoginRoute, -} as any) + id: "/admin", + path: "/admin", + getParentRoute: () => RestrictLoginSignupLoginRoute +} as any); const adminSignUpPageRouteRoute = adminSignUpPageRouteImport.update({ - id: '/admin/signup', - path: '/admin/signup', - getParentRoute: () => middlewaresRestrictLoginSignupRoute, -} as any) + id: "/admin/signup", + path: "/admin/signup", + getParentRoute: () => middlewaresRestrictLoginSignupRoute +} as any); -const organizationNoOrgPageRouteRoute = organizationNoOrgPageRouteImport.update( - { - id: '/organization/none', - path: '/organization/none', - getParentRoute: () => middlewaresAuthenticateRoute, - } as any, -) +const organizationNoOrgPageRouteRoute = organizationNoOrgPageRouteImport.update({ + id: "/organization/none", + path: "/organization/none", + getParentRoute: () => middlewaresAuthenticateRoute +} as any); const authSignUpPageRouteRoute = authSignUpPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => RestrictLoginSignupSignupRoute, -} as any) + id: "/", + path: "/", + getParentRoute: () => RestrictLoginSignupSignupRoute +} as any); const authLoginPageRouteRoute = authLoginPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => RestrictLoginSignupLoginRoute, -} as any) + id: "/", + path: "/", + getParentRoute: () => RestrictLoginSignupLoginRoute +} as any); const adminLayoutRoute = adminLayoutImport.update({ - id: '/_admin-layout', - getParentRoute: () => AuthenticateInjectOrgDetailsAdminRoute, -} as any) + id: "/_admin-layout", + getParentRoute: () => AuthenticateInjectOrgDetailsAdminRoute +} as any); const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute = AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport.update({ - id: '/organization', - path: '/organization', - getParentRoute: () => organizationLayoutRoute, - } as any) + id: "/organization", + path: "/organization", + getParentRoute: () => organizationLayoutRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute = AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport.update({ - id: '/integrations', - path: '/integrations', - getParentRoute: () => organizationLayoutRoute, - } as any) + id: "/integrations", + path: "/integrations", + getParentRoute: () => organizationLayoutRoute + } as any); -const authProviderSuccessPageRouteRoute = - authProviderSuccessPageRouteImport.update({ - id: '/provider/success', - path: '/provider/success', - getParentRoute: () => RestrictLoginSignupLoginRoute, - } as any) +const authProviderSuccessPageRouteRoute = authProviderSuccessPageRouteImport.update({ + id: "/provider/success", + path: "/provider/success", + getParentRoute: () => RestrictLoginSignupLoginRoute +} as any); -const authProviderErrorPageRouteRoute = authProviderErrorPageRouteImport.update( - { - id: '/provider/error', - path: '/provider/error', - getParentRoute: () => RestrictLoginSignupLoginRoute, - } as any, -) +const authProviderErrorPageRouteRoute = authProviderErrorPageRouteImport.update({ + id: "/provider/error", + path: "/provider/error", + getParentRoute: () => RestrictLoginSignupLoginRoute +} as any); -const userPersonalSettingsPageRouteRoute = - userPersonalSettingsPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => userLayoutRoute, - } as any) +const userPersonalSettingsPageRouteRoute = userPersonalSettingsPageRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => userLayoutRoute +} as any); const AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRoute = AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdImport.update({ - id: '/secret-manager/$projectId', - path: '/secret-manager/$projectId', - getParentRoute: () => organizationLayoutRoute, - } as any) + id: "/secret-manager/$projectId", + path: "/secret-manager/$projectId", + getParentRoute: () => organizationLayoutRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute = AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) + id: "/settings", + path: "/settings", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute = AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport.update({ - id: '/secret-sharing', - path: '/secret-sharing', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) + id: "/secret-sharing", + path: "/secret-sharing", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute = AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport.update({ - id: '/gateways', - path: '/gateways', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) + id: "/gateways", + path: "/gateways", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute = AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport.update({ - id: '/app-connections', - path: '/app-connections', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) + id: "/app-connections", + path: "/app-connections", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any); -const adminIntegrationsPageRouteRoute = adminIntegrationsPageRouteImport.update( - { - id: '/integrations', - path: '/integrations', - getParentRoute: () => adminLayoutRoute, - } as any, -) +const adminIntegrationsPageRouteRoute = adminIntegrationsPageRouteImport.update({ + id: "/integrations", + path: "/integrations", + getParentRoute: () => adminLayoutRoute +} as any); const adminEnvironmentPageRouteRoute = adminEnvironmentPageRouteImport.update({ - id: '/environment', - path: '/environment', - getParentRoute: () => adminLayoutRoute, -} as any) + id: "/environment", + path: "/environment", + getParentRoute: () => adminLayoutRoute +} as any); const adminEncryptionPageRouteRoute = adminEncryptionPageRouteImport.update({ - id: '/encryption', - path: '/encryption', - getParentRoute: () => adminLayoutRoute, -} as any) + id: "/encryption", + path: "/encryption", + getParentRoute: () => adminLayoutRoute +} as any); const adminCachingPageRouteRoute = adminCachingPageRouteImport.update({ - id: '/caching', - path: '/caching', - getParentRoute: () => adminLayoutRoute, -} as any) + id: "/caching", + path: "/caching", + getParentRoute: () => adminLayoutRoute +} as any); -const adminAuthenticationPageRouteRoute = - adminAuthenticationPageRouteImport.update({ - id: '/authentication', - path: '/authentication', - getParentRoute: () => adminLayoutRoute, - } as any) +const adminAuthenticationPageRouteRoute = adminAuthenticationPageRouteImport.update({ + id: "/authentication", + path: "/authentication", + getParentRoute: () => adminLayoutRoute +} as any); -const organizationProjectsPageRouteRoute = - organizationProjectsPageRouteImport.update({ - id: '/projects', - path: '/projects', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) +const adminAccessManagementPageRouteRoute = adminAccessManagementPageRouteImport.update({ + id: "/access-management", + path: "/access-management", + getParentRoute: () => adminLayoutRoute +} as any); -const organizationBillingPageRouteRoute = - organizationBillingPageRouteImport.update({ - id: '/billing', - path: '/billing', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) +const organizationProjectsPageRouteRoute = organizationProjectsPageRouteImport.update({ + id: "/projects", + path: "/projects", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute +} as any); -const organizationAuditLogsPageRouteRoute = - organizationAuditLogsPageRouteImport.update({ - id: '/audit-logs', - path: '/audit-logs', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) +const organizationBillingPageRouteRoute = organizationBillingPageRouteImport.update({ + id: "/billing", + path: "/billing", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute +} as any); + +const organizationAuditLogsPageRouteRoute = organizationAuditLogsPageRouteImport.update({ + id: "/audit-logs", + path: "/audit-logs", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute +} as any); const organizationAccessManagementPageRouteRoute = organizationAccessManagementPageRouteImport.update({ - id: '/access-management', - path: '/access-management', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) + id: "/access-management", + path: "/access-management", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any); const adminGeneralPageRouteRoute = adminGeneralPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => adminLayoutRoute, -} as any) + id: "/", + path: "/", + getParentRoute: () => adminLayoutRoute +} as any); const secretManagerRedirectsRedirectApprovalPageRoute = secretManagerRedirectsRedirectApprovalPageImport.update({ - id: '/approval', - path: '/approval', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRoute, - } as any) + id: "/approval", + path: "/approval", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdImport.update({ - id: '/projects/ssh/$projectId', - path: '/projects/ssh/$projectId', - getParentRoute: () => organizationLayoutRoute, - } as any) + id: "/projects/ssh/$projectId", + path: "/projects/ssh/$projectId", + getParentRoute: () => organizationLayoutRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRoute = - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdImport.update( - { - id: '/projects/secret-scanning/$projectId', - path: '/projects/secret-scanning/$projectId', - getParentRoute: () => organizationLayoutRoute, - } as any, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdImport.update({ + id: "/projects/secret-scanning/$projectId", + path: "/projects/secret-scanning/$projectId", + getParentRoute: () => organizationLayoutRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRoute = - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdImport.update( - { - id: '/projects/secret-management/$projectId', - path: '/projects/secret-management/$projectId', - getParentRoute: () => organizationLayoutRoute, - } as any, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdImport.update({ + id: "/projects/secret-management/$projectId", + path: "/projects/secret-management/$projectId", + getParentRoute: () => organizationLayoutRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdImport.update({ - id: '/projects/kms/$projectId', - path: '/projects/kms/$projectId', - getParentRoute: () => organizationLayoutRoute, - } as any) + id: "/projects/kms/$projectId", + path: "/projects/kms/$projectId", + getParentRoute: () => organizationLayoutRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRoute = - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdImport.update( - { - id: '/projects/cert-management/$projectId', - path: '/projects/cert-management/$projectId', - getParentRoute: () => organizationLayoutRoute, - } as any, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdImport.update({ + id: "/projects/cert-management/$projectId", + path: "/projects/cert-management/$projectId", + getParentRoute: () => organizationLayoutRoute + } as any); -const adminUserIdentitiesResourcesPageRouteRoute = - adminUserIdentitiesResourcesPageRouteImport.update({ - id: '/resources/user-identities', - path: '/resources/user-identities', - getParentRoute: () => adminLayoutRoute, - } as any) - -const adminOrganizationResourcesPageRouteRoute = - adminOrganizationResourcesPageRouteImport.update({ - id: '/resources/organizations', - path: '/resources/organizations', - getParentRoute: () => adminLayoutRoute, - } as any) - -const adminMachineIdentitiesResourcesPageRouteRoute = - adminMachineIdentitiesResourcesPageRouteImport.update({ - id: '/resources/machine-identities', - path: '/resources/machine-identities', - getParentRoute: () => adminLayoutRoute, - } as any) +const adminResourceOverviewPageRouteRoute = adminResourceOverviewPageRouteImport.update({ + id: "/resources/overview", + path: "/resources/overview", + getParentRoute: () => adminLayoutRoute +} as any); const organizationSecretSharingSettingsPageRouteRoute = organizationSecretSharingSettingsPageRouteImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute, - } as any) + id: "/settings", + path: "/settings", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute + } as any); -const organizationRoleByIDPageRouteRoute = - organizationRoleByIDPageRouteImport.update({ - id: '/roles/$roleId', - path: '/roles/$roleId', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) +const organizationRoleByIDPageRouteRoute = organizationRoleByIDPageRouteImport.update({ + id: "/roles/$roleId", + path: "/roles/$roleId", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute +} as any); -const organizationUserDetailsByIDPageRouteRoute = - organizationUserDetailsByIDPageRouteImport.update({ - id: '/members/$membershipId', - path: '/members/$membershipId', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) +const organizationUserDetailsByIDPageRouteRoute = organizationUserDetailsByIDPageRouteImport.update( + { + id: "/members/$membershipId", + path: "/members/$membershipId", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any +); const organizationIdentityDetailsByIDPageRouteRoute = organizationIdentityDetailsByIDPageRouteImport.update({ - id: '/identities/$identityId', - path: '/identities/$identityId', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) + id: "/identities/$identityId", + path: "/identities/$identityId", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any); const organizationGroupDetailsByIDPageRouteRoute = organizationGroupDetailsByIDPageRouteImport.update({ - id: '/groups/$groupId', - path: '/groups/$groupId', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any) + id: "/groups/$groupId", + path: "/groups/$groupId", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute + } as any); -const organizationSettingsPageRouteRoute = - organizationSettingsPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute, - } as any) +const organizationSettingsPageRouteRoute = organizationSettingsPageRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute +} as any); -const organizationSecretSharingPageRouteRoute = - organizationSecretSharingPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute, - } as any) +const organizationSecretSharingPageRouteRoute = organizationSecretSharingPageRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute +} as any); const organizationGatewaysGatewayListPageRouteRoute = organizationGatewaysGatewayListPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute, - } as any) + id: "/", + path: "/", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute + } as any); const organizationAppConnectionsAppConnectionsPageRouteRoute = organizationAppConnectionsAppConnectionsPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute, - } as any) + id: "/", + path: "/", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute + } as any); const sshLayoutRoute = sshLayoutImport.update({ - id: '/_ssh-layout', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRoute, -} as any) + id: "/_ssh-layout", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRoute +} as any); const secretScanningLayoutRoute = secretScanningLayoutImport.update({ - id: '/_secret-scanning-layout', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRoute, -} as any) + id: "/_secret-scanning-layout", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRoute +} as any); const secretManagerLayoutRoute = secretManagerLayoutImport.update({ - id: '/_secret-manager-layout', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRoute, -} as any) + id: "/_secret-manager-layout", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRoute +} as any); const kmsLayoutRoute = kmsLayoutImport.update({ - id: '/_kms-layout', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRoute, -} as any) + id: "/_kms-layout", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRoute +} as any); const certManagerLayoutRoute = certManagerLayoutImport.update({ - id: '/_cert-manager-layout', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRoute, -} as any) + id: "/_cert-manager-layout", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRoute +} as any); const secretManagerIntegrationsRouteVercelOauthRedirectRoute = secretManagerIntegrationsRouteVercelOauthRedirectImport.update({ - id: '/vercel/oauth2/callback', - path: '/vercel/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/vercel/oauth2/callback", + path: "/vercel/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteNetlifyOauthRedirectRoute = secretManagerIntegrationsRouteNetlifyOauthRedirectImport.update({ - id: '/netlify/oauth2/callback', - path: '/netlify/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/netlify/oauth2/callback", + path: "/netlify/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteHerokuOauthRedirectRoute = secretManagerIntegrationsRouteHerokuOauthRedirectImport.update({ - id: '/heroku/oauth2/callback', - path: '/heroku/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/heroku/oauth2/callback", + path: "/heroku/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteGitlabOauthRedirectRoute = secretManagerIntegrationsRouteGitlabOauthRedirectImport.update({ - id: '/gitlab/oauth2/callback', - path: '/gitlab/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/gitlab/oauth2/callback", + path: "/gitlab/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteGithubOauthRedirectRoute = secretManagerIntegrationsRouteGithubOauthRedirectImport.update({ - id: '/github/oauth2/callback', - path: '/github/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/github/oauth2/callback", + path: "/github/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteGcpOauthRedirectRoute = secretManagerIntegrationsRouteGcpOauthRedirectImport.update({ - id: '/gcp-secret-manager/oauth2/callback', - path: '/gcp-secret-manager/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/gcp-secret-manager/oauth2/callback", + path: "/gcp-secret-manager/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteBitbucketOauthRedirectRoute = secretManagerIntegrationsRouteBitbucketOauthRedirectImport.update({ - id: '/bitbucket/oauth2/callback', - path: '/bitbucket/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/bitbucket/oauth2/callback", + path: "/bitbucket/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute = secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectImport.update({ - id: '/azure-key-vault/oauth2/callback', - path: '/azure-key-vault/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any) + id: "/azure-key-vault/oauth2/callback", + path: "/azure-key-vault/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute = - secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectImport.update( - { - id: '/azure-app-configuration/oauth2/callback', - path: '/azure-app-configuration/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute, - } as any, - ) + secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectImport.update({ + id: "/azure-app-configuration/oauth2/callback", + path: "/azure-app-configuration/oauth2/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute + } as any); const organizationSettingsPageOauthCallbackPageRouteRoute = organizationSettingsPageOauthCallbackPageRouteImport.update({ - id: '/oauth/callback', - path: '/oauth/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute, - } as any) + id: "/oauth/callback", + path: "/oauth/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute + } as any); -const projectAuditLogsPageRouteSshRoute = - projectAuditLogsPageRouteSshImport.update({ - id: '/audit-logs', - path: '/audit-logs', - getParentRoute: () => sshLayoutRoute, - } as any) +const projectAuditLogsPageRouteSshRoute = projectAuditLogsPageRouteSshImport.update({ + id: "/audit-logs", + path: "/audit-logs", + getParentRoute: () => sshLayoutRoute +} as any); -const projectAccessControlPageRouteSshRoute = - projectAccessControlPageRouteSshImport.update({ - id: '/access-management', - path: '/access-management', - getParentRoute: () => sshLayoutRoute, - } as any) +const projectAccessControlPageRouteSshRoute = projectAccessControlPageRouteSshImport.update({ + id: "/access-management", + path: "/access-management", + getParentRoute: () => sshLayoutRoute +} as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesImport.update( { - id: '/data-sources', - path: '/data-sources', - getParentRoute: () => secretScanningLayoutRoute, - } as any, - ) + id: "/data-sources", + path: "/data-sources", + getParentRoute: () => secretScanningLayoutRoute + } as any + ); const projectAuditLogsPageRouteSecretScanningRoute = projectAuditLogsPageRouteSecretScanningImport.update({ - id: '/audit-logs', - path: '/audit-logs', - getParentRoute: () => secretScanningLayoutRoute, - } as any) + id: "/audit-logs", + path: "/audit-logs", + getParentRoute: () => secretScanningLayoutRoute + } as any); const projectAccessControlPageRouteSecretScanningRoute = projectAccessControlPageRouteSecretScanningImport.update({ - id: '/access-management', - path: '/access-management', - getParentRoute: () => secretScanningLayoutRoute, - } as any) + id: "/access-management", + path: "/access-management", + getParentRoute: () => secretScanningLayoutRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport.update( { - id: '/integrations', - path: '/integrations', - getParentRoute: () => secretManagerLayoutRoute, - } as any, - ) + id: "/integrations", + path: "/integrations", + getParentRoute: () => secretManagerLayoutRoute + } as any + ); const projectAuditLogsPageRouteSecretManagerRoute = projectAuditLogsPageRouteSecretManagerImport.update({ - id: '/audit-logs', - path: '/audit-logs', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/audit-logs", + path: "/audit-logs", + getParentRoute: () => secretManagerLayoutRoute + } as any); const projectAccessControlPageRouteSecretManagerRoute = projectAccessControlPageRouteSecretManagerImport.update({ - id: '/access-management', - path: '/access-management', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/access-management", + path: "/access-management", + getParentRoute: () => secretManagerLayoutRoute + } as any); -const projectAuditLogsPageRouteKmsRoute = - projectAuditLogsPageRouteKmsImport.update({ - id: '/audit-logs', - path: '/audit-logs', - getParentRoute: () => kmsLayoutRoute, - } as any) +const projectAuditLogsPageRouteKmsRoute = projectAuditLogsPageRouteKmsImport.update({ + id: "/audit-logs", + path: "/audit-logs", + getParentRoute: () => kmsLayoutRoute +} as any); -const projectAccessControlPageRouteKmsRoute = - projectAccessControlPageRouteKmsImport.update({ - id: '/access-management', - path: '/access-management', - getParentRoute: () => kmsLayoutRoute, - } as any) +const projectAccessControlPageRouteKmsRoute = projectAccessControlPageRouteKmsImport.update({ + id: "/access-management", + path: "/access-management", + getParentRoute: () => kmsLayoutRoute +} as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersImport.update( { - id: '/subscribers', - path: '/subscribers', - getParentRoute: () => certManagerLayoutRoute, - } as any, - ) + id: "/subscribers", + path: "/subscribers", + getParentRoute: () => certManagerLayoutRoute + } as any + ); const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesImport.update( { - id: '/certificate-templates', - path: '/certificate-templates', - getParentRoute: () => certManagerLayoutRoute, - } as any, - ) + id: "/certificate-templates", + path: "/certificate-templates", + getParentRoute: () => certManagerLayoutRoute + } as any + ); -const projectAuditLogsPageRouteCertManagerRoute = - projectAuditLogsPageRouteCertManagerImport.update({ - id: '/audit-logs', - path: '/audit-logs', - getParentRoute: () => certManagerLayoutRoute, - } as any) +const projectAuditLogsPageRouteCertManagerRoute = projectAuditLogsPageRouteCertManagerImport.update( + { + id: "/audit-logs", + path: "/audit-logs", + getParentRoute: () => certManagerLayoutRoute + } as any +); const projectAccessControlPageRouteCertManagerRoute = projectAccessControlPageRouteCertManagerImport.update({ - id: '/access-management', - path: '/access-management', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/access-management", + path: "/access-management", + getParentRoute: () => certManagerLayoutRoute + } as any); const sshSettingsPageRouteRoute = sshSettingsPageRouteImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => sshLayoutRoute, -} as any) + id: "/settings", + path: "/settings", + getParentRoute: () => sshLayoutRoute +} as any); const sshSshHostsPageRouteRoute = sshSshHostsPageRouteImport.update({ - id: '/overview', - path: '/overview', - getParentRoute: () => sshLayoutRoute, -} as any) + id: "/overview", + path: "/overview", + getParentRoute: () => sshLayoutRoute +} as any); const sshSshCertsPageRouteRoute = sshSshCertsPageRouteImport.update({ - id: '/certificates', - path: '/certificates', - getParentRoute: () => sshLayoutRoute, -} as any) + id: "/certificates", + path: "/certificates", + getParentRoute: () => sshLayoutRoute +} as any); const sshSshCasPageRouteRoute = sshSshCasPageRouteImport.update({ - id: '/cas', - path: '/cas', - getParentRoute: () => sshLayoutRoute, -} as any) + id: "/cas", + path: "/cas", + getParentRoute: () => sshLayoutRoute +} as any); -const secretScanningSettingsPageRouteRoute = - secretScanningSettingsPageRouteImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => secretScanningLayoutRoute, - } as any) +const secretScanningSettingsPageRouteRoute = secretScanningSettingsPageRouteImport.update({ + id: "/settings", + path: "/settings", + getParentRoute: () => secretScanningLayoutRoute +} as any); const secretScanningSecretScanningFindingsPageRouteRoute = secretScanningSecretScanningFindingsPageRouteImport.update({ - id: '/findings', - path: '/findings', - getParentRoute: () => secretScanningLayoutRoute, - } as any) + id: "/findings", + path: "/findings", + getParentRoute: () => secretScanningLayoutRoute + } as any); -const secretManagerSettingsPageRouteRoute = - secretManagerSettingsPageRouteImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => secretManagerLayoutRoute, - } as any) +const secretManagerSettingsPageRouteRoute = secretManagerSettingsPageRouteImport.update({ + id: "/settings", + path: "/settings", + getParentRoute: () => secretManagerLayoutRoute +} as any); -const secretManagerSecretRotationPageRouteRoute = - secretManagerSecretRotationPageRouteImport.update({ - id: '/secret-rotation', - path: '/secret-rotation', - getParentRoute: () => secretManagerLayoutRoute, - } as any) +const secretManagerSecretRotationPageRouteRoute = secretManagerSecretRotationPageRouteImport.update( + { + id: "/secret-rotation", + path: "/secret-rotation", + getParentRoute: () => secretManagerLayoutRoute + } as any +); -const secretManagerOverviewPageRouteRoute = - secretManagerOverviewPageRouteImport.update({ - id: '/overview', - path: '/overview', - getParentRoute: () => secretManagerLayoutRoute, - } as any) +const secretManagerOverviewPageRouteRoute = secretManagerOverviewPageRouteImport.update({ + id: "/overview", + path: "/overview", + getParentRoute: () => secretManagerLayoutRoute +} as any); const secretManagerSecretApprovalsPageRouteRoute = secretManagerSecretApprovalsPageRouteImport.update({ - id: '/approval', - path: '/approval', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/approval", + path: "/approval", + getParentRoute: () => secretManagerLayoutRoute + } as any); -const secretManagerIPAllowlistPageRouteRoute = - secretManagerIPAllowlistPageRouteImport.update({ - id: '/allowlist', - path: '/allowlist', - getParentRoute: () => secretManagerLayoutRoute, - } as any) +const secretManagerIPAllowlistPageRouteRoute = secretManagerIPAllowlistPageRouteImport.update({ + id: "/allowlist", + path: "/allowlist", + getParentRoute: () => secretManagerLayoutRoute +} as any); const kmsSettingsPageRouteRoute = kmsSettingsPageRouteImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => kmsLayoutRoute, -} as any) + id: "/settings", + path: "/settings", + getParentRoute: () => kmsLayoutRoute +} as any); const kmsOverviewPageRouteRoute = kmsOverviewPageRouteImport.update({ - id: '/overview', - path: '/overview', - getParentRoute: () => kmsLayoutRoute, -} as any) + id: "/overview", + path: "/overview", + getParentRoute: () => kmsLayoutRoute +} as any); const kmsKmipPageRouteRoute = kmsKmipPageRouteImport.update({ - id: '/kmip', - path: '/kmip', - getParentRoute: () => kmsLayoutRoute, -} as any) + id: "/kmip", + path: "/kmip", + getParentRoute: () => kmsLayoutRoute +} as any); -const certManagerSettingsPageRouteRoute = - certManagerSettingsPageRouteImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => certManagerLayoutRoute, - } as any) +const certManagerSettingsPageRouteRoute = certManagerSettingsPageRouteImport.update({ + id: "/settings", + path: "/settings", + getParentRoute: () => certManagerLayoutRoute +} as any); -const certManagerCertificatesPageRouteRoute = - certManagerCertificatesPageRouteImport.update({ - id: '/certificates', - path: '/certificates', - getParentRoute: () => certManagerLayoutRoute, - } as any) +const certManagerCertificatesPageRouteRoute = certManagerCertificatesPageRouteImport.update({ + id: "/certificates", + path: "/certificates", + getParentRoute: () => certManagerLayoutRoute +} as any); const certManagerCertificateAuthoritiesPageRouteRoute = certManagerCertificateAuthoritiesPageRouteImport.update({ - id: '/certificate-authorities', - path: '/certificate-authorities', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/certificate-authorities", + path: "/certificate-authorities", + getParentRoute: () => certManagerLayoutRoute + } as any); -const certManagerAlertingPageRouteRoute = - certManagerAlertingPageRouteImport.update({ - id: '/alerting', - path: '/alerting', - getParentRoute: () => certManagerLayoutRoute, - } as any) +const certManagerAlertingPageRouteRoute = certManagerAlertingPageRouteImport.update({ + id: "/alerting", + path: "/alerting", + getParentRoute: () => certManagerLayoutRoute +} as any); const organizationAppConnectionsOauthCallbackPageRouteRoute = organizationAppConnectionsOauthCallbackPageRouteImport.update({ - id: '/$appConnection/oauth/callback', - path: '/$appConnection/oauth/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute, - } as any) + id: "/$appConnection/oauth/callback", + path: "/$appConnection/oauth/callback", + getParentRoute: () => AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute + } as any); -const projectRoleDetailsBySlugPageRouteSshRoute = - projectRoleDetailsBySlugPageRouteSshImport.update({ - id: '/roles/$roleSlug', - path: '/roles/$roleSlug', - getParentRoute: () => sshLayoutRoute, - } as any) +const projectRoleDetailsBySlugPageRouteSshRoute = projectRoleDetailsBySlugPageRouteSshImport.update( + { + id: "/roles/$roleSlug", + path: "/roles/$roleSlug", + getParentRoute: () => sshLayoutRoute + } as any +); -const projectMemberDetailsByIDPageRouteSshRoute = - projectMemberDetailsByIDPageRouteSshImport.update({ - id: '/members/$membershipId', - path: '/members/$membershipId', - getParentRoute: () => sshLayoutRoute, - } as any) +const projectMemberDetailsByIDPageRouteSshRoute = projectMemberDetailsByIDPageRouteSshImport.update( + { + id: "/members/$membershipId", + path: "/members/$membershipId", + getParentRoute: () => sshLayoutRoute + } as any +); const projectIdentityDetailsByIDPageRouteSshRoute = projectIdentityDetailsByIDPageRouteSshImport.update({ - id: '/identities/$identityId', - path: '/identities/$identityId', - getParentRoute: () => sshLayoutRoute, - } as any) + id: "/identities/$identityId", + path: "/identities/$identityId", + getParentRoute: () => sshLayoutRoute + } as any); -const projectGroupDetailsByIDPageRouteSshRoute = - projectGroupDetailsByIDPageRouteSshImport.update({ - id: '/groups/$groupId', - path: '/groups/$groupId', - getParentRoute: () => sshLayoutRoute, - } as any) +const projectGroupDetailsByIDPageRouteSshRoute = projectGroupDetailsByIDPageRouteSshImport.update({ + id: "/groups/$groupId", + path: "/groups/$groupId", + getParentRoute: () => sshLayoutRoute +} as any); const projectRoleDetailsBySlugPageRouteSecretScanningRoute = projectRoleDetailsBySlugPageRouteSecretScanningImport.update({ - id: '/roles/$roleSlug', - path: '/roles/$roleSlug', - getParentRoute: () => secretScanningLayoutRoute, - } as any) + id: "/roles/$roleSlug", + path: "/roles/$roleSlug", + getParentRoute: () => secretScanningLayoutRoute + } as any); const projectMemberDetailsByIDPageRouteSecretScanningRoute = projectMemberDetailsByIDPageRouteSecretScanningImport.update({ - id: '/members/$membershipId', - path: '/members/$membershipId', - getParentRoute: () => secretScanningLayoutRoute, - } as any) + id: "/members/$membershipId", + path: "/members/$membershipId", + getParentRoute: () => secretScanningLayoutRoute + } as any); const projectIdentityDetailsByIDPageRouteSecretScanningRoute = projectIdentityDetailsByIDPageRouteSecretScanningImport.update({ - id: '/identities/$identityId', - path: '/identities/$identityId', - getParentRoute: () => secretScanningLayoutRoute, - } as any) + id: "/identities/$identityId", + path: "/identities/$identityId", + getParentRoute: () => secretScanningLayoutRoute + } as any); const projectGroupDetailsByIDPageRouteSecretScanningRoute = projectGroupDetailsByIDPageRouteSecretScanningImport.update({ - id: '/groups/$groupId', - path: '/groups/$groupId', - getParentRoute: () => secretScanningLayoutRoute, - } as any) + id: "/groups/$groupId", + path: "/groups/$groupId", + getParentRoute: () => secretScanningLayoutRoute + } as any); const projectRoleDetailsBySlugPageRouteSecretManagerRoute = projectRoleDetailsBySlugPageRouteSecretManagerImport.update({ - id: '/roles/$roleSlug', - path: '/roles/$roleSlug', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/roles/$roleSlug", + path: "/roles/$roleSlug", + getParentRoute: () => secretManagerLayoutRoute + } as any); const projectMemberDetailsByIDPageRouteSecretManagerRoute = projectMemberDetailsByIDPageRouteSecretManagerImport.update({ - id: '/members/$membershipId', - path: '/members/$membershipId', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/members/$membershipId", + path: "/members/$membershipId", + getParentRoute: () => secretManagerLayoutRoute + } as any); const projectIdentityDetailsByIDPageRouteSecretManagerRoute = projectIdentityDetailsByIDPageRouteSecretManagerImport.update({ - id: '/identities/$identityId', - path: '/identities/$identityId', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/identities/$identityId", + path: "/identities/$identityId", + getParentRoute: () => secretManagerLayoutRoute + } as any); const projectGroupDetailsByIDPageRouteSecretManagerRoute = projectGroupDetailsByIDPageRouteSecretManagerImport.update({ - id: '/groups/$groupId', - path: '/groups/$groupId', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/groups/$groupId", + path: "/groups/$groupId", + getParentRoute: () => secretManagerLayoutRoute + } as any); -const projectRoleDetailsBySlugPageRouteKmsRoute = - projectRoleDetailsBySlugPageRouteKmsImport.update({ - id: '/roles/$roleSlug', - path: '/roles/$roleSlug', - getParentRoute: () => kmsLayoutRoute, - } as any) +const projectRoleDetailsBySlugPageRouteKmsRoute = projectRoleDetailsBySlugPageRouteKmsImport.update( + { + id: "/roles/$roleSlug", + path: "/roles/$roleSlug", + getParentRoute: () => kmsLayoutRoute + } as any +); -const projectMemberDetailsByIDPageRouteKmsRoute = - projectMemberDetailsByIDPageRouteKmsImport.update({ - id: '/members/$membershipId', - path: '/members/$membershipId', - getParentRoute: () => kmsLayoutRoute, - } as any) +const projectMemberDetailsByIDPageRouteKmsRoute = projectMemberDetailsByIDPageRouteKmsImport.update( + { + id: "/members/$membershipId", + path: "/members/$membershipId", + getParentRoute: () => kmsLayoutRoute + } as any +); const projectIdentityDetailsByIDPageRouteKmsRoute = projectIdentityDetailsByIDPageRouteKmsImport.update({ - id: '/identities/$identityId', - path: '/identities/$identityId', - getParentRoute: () => kmsLayoutRoute, - } as any) + id: "/identities/$identityId", + path: "/identities/$identityId", + getParentRoute: () => kmsLayoutRoute + } as any); -const projectGroupDetailsByIDPageRouteKmsRoute = - projectGroupDetailsByIDPageRouteKmsImport.update({ - id: '/groups/$groupId', - path: '/groups/$groupId', - getParentRoute: () => kmsLayoutRoute, - } as any) +const projectGroupDetailsByIDPageRouteKmsRoute = projectGroupDetailsByIDPageRouteKmsImport.update({ + id: "/groups/$groupId", + path: "/groups/$groupId", + getParentRoute: () => kmsLayoutRoute +} as any); const projectRoleDetailsBySlugPageRouteCertManagerRoute = projectRoleDetailsBySlugPageRouteCertManagerImport.update({ - id: '/roles/$roleSlug', - path: '/roles/$roleSlug', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/roles/$roleSlug", + path: "/roles/$roleSlug", + getParentRoute: () => certManagerLayoutRoute + } as any); const certManagerPkiCollectionDetailsByIDPageRoutesRoute = certManagerPkiCollectionDetailsByIDPageRoutesImport.update({ - id: '/pki-collections/$collectionId', - path: '/pki-collections/$collectionId', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/pki-collections/$collectionId", + path: "/pki-collections/$collectionId", + getParentRoute: () => certManagerLayoutRoute + } as any); const projectMemberDetailsByIDPageRouteCertManagerRoute = projectMemberDetailsByIDPageRouteCertManagerImport.update({ - id: '/members/$membershipId', - path: '/members/$membershipId', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/members/$membershipId", + path: "/members/$membershipId", + getParentRoute: () => certManagerLayoutRoute + } as any); const projectIdentityDetailsByIDPageRouteCertManagerRoute = projectIdentityDetailsByIDPageRouteCertManagerImport.update({ - id: '/identities/$identityId', - path: '/identities/$identityId', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/identities/$identityId", + path: "/identities/$identityId", + getParentRoute: () => certManagerLayoutRoute + } as any); const projectGroupDetailsByIDPageRouteCertManagerRoute = projectGroupDetailsByIDPageRouteCertManagerImport.update({ - id: '/groups/$groupId', - path: '/groups/$groupId', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/groups/$groupId", + path: "/groups/$groupId", + getParentRoute: () => certManagerLayoutRoute + } as any); -const sshSshHostGroupDetailsByIDPageRouteRoute = - sshSshHostGroupDetailsByIDPageRouteImport.update({ - id: '/ssh-host-groups/$sshHostGroupId', - path: '/ssh-host-groups/$sshHostGroupId', - getParentRoute: () => sshLayoutRoute, - } as any) +const sshSshHostGroupDetailsByIDPageRouteRoute = sshSshHostGroupDetailsByIDPageRouteImport.update({ + id: "/ssh-host-groups/$sshHostGroupId", + path: "/ssh-host-groups/$sshHostGroupId", + getParentRoute: () => sshLayoutRoute +} as any); const sshSshCaByIDPageRouteRoute = sshSshCaByIDPageRouteImport.update({ - id: '/ca/$caId', - path: '/ca/$caId', - getParentRoute: () => sshLayoutRoute, -} as any) + id: "/ca/$caId", + path: "/ca/$caId", + getParentRoute: () => sshLayoutRoute +} as any); const secretManagerSecretDashboardPageRouteRoute = secretManagerSecretDashboardPageRouteImport.update({ - id: '/secrets/$envSlug', - path: '/secrets/$envSlug', - getParentRoute: () => secretManagerLayoutRoute, - } as any) + id: "/secrets/$envSlug", + path: "/secrets/$envSlug", + getParentRoute: () => secretManagerLayoutRoute + } as any); const secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute = secretManagerIntegrationsSelectIntegrationAuthPageRouteImport.update({ - id: '/select-integration-auth', - path: '/select-integration-auth', + id: "/select-integration-auth", + path: "/select-integration-auth", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsDetailsByIDPageRouteRoute = secretManagerIntegrationsDetailsByIDPageRouteImport.update({ - id: '/$integrationId', - path: '/$integrationId', + id: "/$integrationId", + path: "/$integrationId", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const certManagerPkiSubscriberDetailsByIDPageRouteRoute = certManagerPkiSubscriberDetailsByIDPageRouteImport.update({ - id: '/$subscriberName', - path: '/$subscriberName', + id: "/$subscriberName", + path: "/$subscriberName", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute + } as any); const certManagerCertAuthDetailsByIDPageRouteRoute = certManagerCertAuthDetailsByIDPageRouteImport.update({ - id: '/ca/$caName', - path: '/ca/$caName', - getParentRoute: () => certManagerLayoutRoute, - } as any) + id: "/ca/$caName", + path: "/ca/$caName", + getParentRoute: () => certManagerLayoutRoute + } as any); const secretScanningSecretScanningDataSourcesPageRouteRoute = secretScanningSecretScanningDataSourcesPageRouteImport.update({ - id: '/', - path: '/', + id: "/", + path: "/", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute + } as any); const secretManagerIntegrationsListPageRouteRoute = secretManagerIntegrationsListPageRouteImport.update({ - id: '/', - path: '/', + id: "/", + path: "/", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); -const certManagerPkiSubscribersPageRouteRoute = - certManagerPkiSubscribersPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute, - } as any) +const certManagerPkiSubscribersPageRouteRoute = certManagerPkiSubscribersPageRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute +} as any); -const certManagerPkiTemplateListPageRouteRoute = - certManagerPkiTemplateListPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRoute, - } as any) +const certManagerPkiTemplateListPageRouteRoute = certManagerPkiTemplateListPageRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRoute +} as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdImport.update( { - id: '/commits/$environment/$folderId', - path: '/commits/$environment/$folderId', - getParentRoute: () => secretManagerLayoutRoute, - } as any, - ) + id: "/commits/$environment/$folderId", + path: "/commits/$environment/$folderId", + getParentRoute: () => secretManagerLayoutRoute + } as any + ); const secretScanningSecretScanningDataSourceByIdPageRouteRoute = secretScanningSecretScanningDataSourceByIdPageRouteImport.update({ - id: '/$type/$dataSourceId', - path: '/$type/$dataSourceId', + id: "/$type/$dataSourceId", + path: "/$type/$dataSourceId", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute + } as any); const secretManagerIntegrationsWindmillConfigurePageRouteRoute = secretManagerIntegrationsWindmillConfigurePageRouteImport.update({ - id: '/windmill/create', - path: '/windmill/create', + id: "/windmill/create", + path: "/windmill/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsWindmillAuthorizePageRouteRoute = secretManagerIntegrationsWindmillAuthorizePageRouteImport.update({ - id: '/windmill/authorize', - path: '/windmill/authorize', + id: "/windmill/authorize", + path: "/windmill/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsVercelConfigurePageRouteRoute = secretManagerIntegrationsVercelConfigurePageRouteImport.update({ - id: '/vercel/create', - path: '/vercel/create', + id: "/vercel/create", + path: "/vercel/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsTravisCIConfigurePageRouteRoute = secretManagerIntegrationsTravisCIConfigurePageRouteImport.update({ - id: '/travisci/create', - path: '/travisci/create', + id: "/travisci/create", + path: "/travisci/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsTravisCIAuthorizePageRouteRoute = secretManagerIntegrationsTravisCIAuthorizePageRouteImport.update({ - id: '/travisci/authorize', - path: '/travisci/authorize', + id: "/travisci/authorize", + path: "/travisci/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute = secretManagerIntegrationsTerraformCloudConfigurePageRouteImport.update({ - id: '/terraform-cloud/create', - path: '/terraform-cloud/create', + id: "/terraform-cloud/create", + path: "/terraform-cloud/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute = secretManagerIntegrationsTerraformCloudAuthorizePageRouteImport.update({ - id: '/terraform-cloud/authorize', - path: '/terraform-cloud/authorize', + id: "/terraform-cloud/authorize", + path: "/terraform-cloud/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsTeamcityConfigurePageRouteRoute = secretManagerIntegrationsTeamcityConfigurePageRouteImport.update({ - id: '/teamcity/create', - path: '/teamcity/create', + id: "/teamcity/create", + path: "/teamcity/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsTeamcityAuthorizePageRouteRoute = secretManagerIntegrationsTeamcityAuthorizePageRouteImport.update({ - id: '/teamcity/authorize', - path: '/teamcity/authorize', + id: "/teamcity/authorize", + path: "/teamcity/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsSupabaseConfigurePageRouteRoute = secretManagerIntegrationsSupabaseConfigurePageRouteImport.update({ - id: '/supabase/create', - path: '/supabase/create', + id: "/supabase/create", + path: "/supabase/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsSupabaseAuthorizePageRouteRoute = secretManagerIntegrationsSupabaseAuthorizePageRouteImport.update({ - id: '/supabase/authorize', - path: '/supabase/authorize', + id: "/supabase/authorize", + path: "/supabase/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRundeckConfigurePageRouteRoute = secretManagerIntegrationsRundeckConfigurePageRouteImport.update({ - id: '/rundeck/create', - path: '/rundeck/create', + id: "/rundeck/create", + path: "/rundeck/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRundeckAuthorizePageRouteRoute = secretManagerIntegrationsRundeckAuthorizePageRouteImport.update({ - id: '/rundeck/authorize', - path: '/rundeck/authorize', + id: "/rundeck/authorize", + path: "/rundeck/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRenderConfigurePageRouteRoute = secretManagerIntegrationsRenderConfigurePageRouteImport.update({ - id: '/render/create', - path: '/render/create', + id: "/render/create", + path: "/render/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRenderAuthorizePageRouteRoute = secretManagerIntegrationsRenderAuthorizePageRouteImport.update({ - id: '/render/authorize', - path: '/render/authorize', + id: "/render/authorize", + path: "/render/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRailwayConfigurePageRouteRoute = secretManagerIntegrationsRailwayConfigurePageRouteImport.update({ - id: '/railway/create', - path: '/railway/create', + id: "/railway/create", + path: "/railway/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsRailwayAuthorizePageRouteRoute = secretManagerIntegrationsRailwayAuthorizePageRouteImport.update({ - id: '/railway/authorize', - path: '/railway/authorize', + id: "/railway/authorize", + path: "/railway/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsQoveryConfigurePageRouteRoute = secretManagerIntegrationsQoveryConfigurePageRouteImport.update({ - id: '/qovery/create', - path: '/qovery/create', + id: "/qovery/create", + path: "/qovery/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsQoveryAuthorizePageRouteRoute = secretManagerIntegrationsQoveryAuthorizePageRouteImport.update({ - id: '/qovery/authorize', - path: '/qovery/authorize', + id: "/qovery/authorize", + path: "/qovery/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute = secretManagerIntegrationsOctopusDeployConfigurePageRouteImport.update({ - id: '/octopus-deploy/create', - path: '/octopus-deploy/create', + id: "/octopus-deploy/create", + path: "/octopus-deploy/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute = secretManagerIntegrationsOctopusDeployAuthorizePageRouteImport.update({ - id: '/octopus-deploy/authorize', - path: '/octopus-deploy/authorize', + id: "/octopus-deploy/authorize", + path: "/octopus-deploy/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsNorthflankConfigurePageRouteRoute = secretManagerIntegrationsNorthflankConfigurePageRouteImport.update({ - id: '/northflank/create', - path: '/northflank/create', + id: "/northflank/create", + path: "/northflank/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsNorthflankAuthorizePageRouteRoute = secretManagerIntegrationsNorthflankAuthorizePageRouteImport.update({ - id: '/northflank/authorize', - path: '/northflank/authorize', + id: "/northflank/authorize", + path: "/northflank/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsNetlifyConfigurePageRouteRoute = secretManagerIntegrationsNetlifyConfigurePageRouteImport.update({ - id: '/netlify/create', - path: '/netlify/create', + id: "/netlify/create", + path: "/netlify/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute = secretManagerIntegrationsLaravelForgeConfigurePageRouteImport.update({ - id: '/laravel-forge/create', - path: '/laravel-forge/create', + id: "/laravel-forge/create", + path: "/laravel-forge/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute = secretManagerIntegrationsLaravelForgeAuthorizePageRouteImport.update({ - id: '/laravel-forge/authorize', - path: '/laravel-forge/authorize', + id: "/laravel-forge/authorize", + path: "/laravel-forge/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsHerokuConfigurePageRouteRoute = secretManagerIntegrationsHerokuConfigurePageRouteImport.update({ - id: '/heroku/create', - path: '/heroku/create', + id: "/heroku/create", + path: "/heroku/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute = secretManagerIntegrationsHasuraCloudConfigurePageRouteImport.update({ - id: '/hasura-cloud/create', - path: '/hasura-cloud/create', + id: "/hasura-cloud/create", + path: "/hasura-cloud/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute = secretManagerIntegrationsHasuraCloudAuthorizePageRouteImport.update({ - id: '/hasura-cloud/authorize', - path: '/hasura-cloud/authorize', + id: "/hasura-cloud/authorize", + path: "/hasura-cloud/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute = secretManagerIntegrationsHashicorpVaultConfigurePageRouteImport.update({ - id: '/hashicorp-vault/create', - path: '/hashicorp-vault/create', + id: "/hashicorp-vault/create", + path: "/hashicorp-vault/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute = secretManagerIntegrationsHashicorpVaultAuthorizePageRouteImport.update({ - id: '/hashicorp-vault/authorize', - path: '/hashicorp-vault/authorize', + id: "/hashicorp-vault/authorize", + path: "/hashicorp-vault/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGitlabConfigurePageRouteRoute = secretManagerIntegrationsGitlabConfigurePageRouteImport.update({ - id: '/gitlab/create', - path: '/gitlab/create', + id: "/gitlab/create", + path: "/gitlab/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGitlabAuthorizePageRouteRoute = secretManagerIntegrationsGitlabAuthorizePageRouteImport.update({ - id: '/gitlab/authorize', - path: '/gitlab/authorize', + id: "/gitlab/authorize", + path: "/gitlab/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGithubConfigurePageRouteRoute = secretManagerIntegrationsGithubConfigurePageRouteImport.update({ - id: '/github/create', - path: '/github/create', + id: "/github/create", + path: "/github/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGithubAuthorizePageRouteRoute = secretManagerIntegrationsGithubAuthorizePageRouteImport.update({ - id: '/github/auth-mode-selection', - path: '/github/auth-mode-selection', + id: "/github/auth-mode-selection", + path: "/github/auth-mode-selection", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute = secretManagerIntegrationsGcpSecretManagerConfigurePageRouteImport.update({ - id: '/gcp-secret-manager/create', - path: '/gcp-secret-manager/create', + id: "/gcp-secret-manager/create", + path: "/gcp-secret-manager/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute = secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteImport.update({ - id: '/gcp-secret-manager/authorize', - path: '/gcp-secret-manager/authorize', + id: "/gcp-secret-manager/authorize", + path: "/gcp-secret-manager/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsFlyioConfigurePageRouteRoute = secretManagerIntegrationsFlyioConfigurePageRouteImport.update({ - id: '/flyio/create', - path: '/flyio/create', + id: "/flyio/create", + path: "/flyio/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsFlyioAuthorizePageRouteRoute = secretManagerIntegrationsFlyioAuthorizePageRouteImport.update({ - id: '/flyio/authorize', - path: '/flyio/authorize', + id: "/flyio/authorize", + path: "/flyio/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute = - secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteImport.update( - { - id: '/digital-ocean-app-platform/create', - path: '/digital-ocean-app-platform/create', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any, - ) + secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteImport.update({ + id: "/digital-ocean-app-platform/create", + path: "/digital-ocean-app-platform/create", + getParentRoute: () => + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute = - secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteImport.update( - { - id: '/digital-ocean-app-platform/authorize', - path: '/digital-ocean-app-platform/authorize', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any, - ) + secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteImport.update({ + id: "/digital-ocean-app-platform/authorize", + path: "/digital-ocean-app-platform/authorize", + getParentRoute: () => + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsDatabricksConfigurePageRouteRoute = secretManagerIntegrationsDatabricksConfigurePageRouteImport.update({ - id: '/databricks/create', - path: '/databricks/create', + id: "/databricks/create", + path: "/databricks/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsDatabricksAuthorizePageRouteRoute = secretManagerIntegrationsDatabricksAuthorizePageRouteImport.update({ - id: '/databricks/authorize', - path: '/databricks/authorize', + id: "/databricks/authorize", + path: "/databricks/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCodefreshConfigurePageRouteRoute = secretManagerIntegrationsCodefreshConfigurePageRouteImport.update({ - id: '/codefresh/create', - path: '/codefresh/create', + id: "/codefresh/create", + path: "/codefresh/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCodefreshAuthorizePageRouteRoute = secretManagerIntegrationsCodefreshAuthorizePageRouteImport.update({ - id: '/codefresh/authorize', - path: '/codefresh/authorize', + id: "/codefresh/authorize", + path: "/codefresh/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute = secretManagerIntegrationsCloudflareWorkersConfigurePageRouteImport.update({ - id: '/cloudflare-workers/create', - path: '/cloudflare-workers/create', + id: "/cloudflare-workers/create", + path: "/cloudflare-workers/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute = secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteImport.update({ - id: '/cloudflare-workers/authorize', - path: '/cloudflare-workers/authorize', + id: "/cloudflare-workers/authorize", + path: "/cloudflare-workers/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute = secretManagerIntegrationsCloudflarePagesConfigurePageRouteImport.update({ - id: '/cloudflare-pages/create', - path: '/cloudflare-pages/create', + id: "/cloudflare-pages/create", + path: "/cloudflare-pages/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute = secretManagerIntegrationsCloudflarePagesAuthorizePageRouteImport.update({ - id: '/cloudflare-pages/authorize', - path: '/cloudflare-pages/authorize', + id: "/cloudflare-pages/authorize", + path: "/cloudflare-pages/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCloud66ConfigurePageRouteRoute = secretManagerIntegrationsCloud66ConfigurePageRouteImport.update({ - id: '/cloud-66/create', - path: '/cloud-66/create', + id: "/cloud-66/create", + path: "/cloud-66/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCloud66AuthorizePageRouteRoute = secretManagerIntegrationsCloud66AuthorizePageRouteImport.update({ - id: '/cloud-66/authorize', - path: '/cloud-66/authorize', + id: "/cloud-66/authorize", + path: "/cloud-66/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCircleCIConfigurePageRouteRoute = secretManagerIntegrationsCircleCIConfigurePageRouteImport.update({ - id: '/circleci/create', - path: '/circleci/create', + id: "/circleci/create", + path: "/circleci/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsCircleCIAuthorizePageRouteRoute = secretManagerIntegrationsCircleCIAuthorizePageRouteImport.update({ - id: '/circleci/authorize', - path: '/circleci/authorize', + id: "/circleci/authorize", + path: "/circleci/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsChecklyConfigurePageRouteRoute = secretManagerIntegrationsChecklyConfigurePageRouteImport.update({ - id: '/checkly/create', - path: '/checkly/create', + id: "/checkly/create", + path: "/checkly/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsChecklyAuthorizePageRouteRoute = secretManagerIntegrationsChecklyAuthorizePageRouteImport.update({ - id: '/checkly/authorize', - path: '/checkly/authorize', + id: "/checkly/authorize", + path: "/checkly/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsBitbucketConfigurePageRouteRoute = secretManagerIntegrationsBitbucketConfigurePageRouteImport.update({ - id: '/bitbucket/create', - path: '/bitbucket/create', + id: "/bitbucket/create", + path: "/bitbucket/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute = secretManagerIntegrationsAzureKeyVaultConfigurePageRouteImport.update({ - id: '/azure-key-vault/create', - path: '/azure-key-vault/create', + id: "/azure-key-vault/create", + path: "/azure-key-vault/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute = secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteImport.update({ - id: '/azure-key-vault/authorize', - path: '/azure-key-vault/authorize', + id: "/azure-key-vault/authorize", + path: "/azure-key-vault/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute = secretManagerIntegrationsAzureDevopsConfigurePageRouteImport.update({ - id: '/azure-devops/create', - path: '/azure-devops/create', + id: "/azure-devops/create", + path: "/azure-devops/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute = secretManagerIntegrationsAzureDevopsAuthorizePageRouteImport.update({ - id: '/azure-devops/authorize', - path: '/azure-devops/authorize', + id: "/azure-devops/authorize", + path: "/azure-devops/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute = - secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteImport.update( - { - id: '/azure-app-configuration/create', - path: '/azure-app-configuration/create', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any, - ) + secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteImport.update({ + id: "/azure-app-configuration/create", + path: "/azure-app-configuration/create", + getParentRoute: () => + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute = secretManagerIntegrationsAwsSecretManagerConfigurePageRouteImport.update({ - id: '/aws-secret-manager/create', - path: '/aws-secret-manager/create', + id: "/aws-secret-manager/create", + path: "/aws-secret-manager/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute = secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteImport.update({ - id: '/aws-secret-manager/authorize', - path: '/aws-secret-manager/authorize', + id: "/aws-secret-manager/authorize", + path: "/aws-secret-manager/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute = secretManagerIntegrationsAwsParameterStoreConfigurePageRouteImport.update({ - id: '/aws-parameter-store/create', - path: '/aws-parameter-store/create', + id: "/aws-parameter-store/create", + path: "/aws-parameter-store/create", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute = secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteImport.update({ - id: '/aws-parameter-store/authorize', - path: '/aws-parameter-store/authorize', + id: "/aws-parameter-store/authorize", + path: "/aws-parameter-store/authorize", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdImport.update( { - id: '/$commitId', - path: '/$commitId', + id: "/$commitId", + path: "/$commitId", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute, - } as any, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute + } as any + ); const secretManagerIntegrationsVercelOauthCallbackPageRouteRoute = secretManagerIntegrationsVercelOauthCallbackPageRouteImport.update({ - id: '/vercel/oauth2/callback', - path: '/vercel/oauth2/callback', + id: "/vercel/oauth2/callback", + path: "/vercel/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerSecretSyncDetailsByIDPageRouteRoute = secretManagerSecretSyncDetailsByIDPageRouteImport.update({ - id: '/secret-syncs/$destination/$syncId', - path: '/secret-syncs/$destination/$syncId', + id: "/secret-syncs/$destination/$syncId", + path: "/secret-syncs/$destination/$syncId", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute = secretManagerIntegrationsNetlifyOauthCallbackPageRouteImport.update({ - id: '/netlify/oauth2/callback', - path: '/netlify/oauth2/callback', + id: "/netlify/oauth2/callback", + path: "/netlify/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute = secretManagerIntegrationsHerokuOauthCallbackPageRouteImport.update({ - id: '/heroku/oauth2/callback', - path: '/heroku/oauth2/callback', + id: "/heroku/oauth2/callback", + path: "/heroku/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute = secretManagerIntegrationsGitlabOauthCallbackPageRouteImport.update({ - id: '/gitlab/oauth2/callback', - path: '/gitlab/oauth2/callback', + id: "/gitlab/oauth2/callback", + path: "/gitlab/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGithubOauthCallbackPageRouteRoute = secretManagerIntegrationsGithubOauthCallbackPageRouteImport.update({ - id: '/github/oauth2/callback', - path: '/github/oauth2/callback', + id: "/github/oauth2/callback", + path: "/github/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute = secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteImport.update({ - id: '/gcp-secret-manager/oauth2/callback', - path: '/gcp-secret-manager/oauth2/callback', + id: "/gcp-secret-manager/oauth2/callback", + path: "/gcp-secret-manager/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute = secretManagerIntegrationsBitbucketOauthCallbackPageRouteImport.update({ - id: '/bitbucket/oauth2/callback', - path: '/bitbucket/oauth2/callback', + id: "/bitbucket/oauth2/callback", + path: "/bitbucket/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute = secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteImport.update({ - id: '/azure-key-vault/oauth2/callback', - path: '/azure-key-vault/oauth2/callback', + id: "/azure-key-vault/oauth2/callback", + path: "/azure-key-vault/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); const secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute = - secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteImport.update( - { - id: '/azure-app-configuration/oauth2/callback', - path: '/azure-app-configuration/oauth2/callback', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute, - } as any, - ) - -const secretManagerCommitsPageRouteRoute = - secretManagerCommitsPageRouteImport.update({ - id: '/', - path: '/', + secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteImport.update({ + id: "/azure-app-configuration/oauth2/callback", + path: "/azure-app-configuration/oauth2/callback", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute + } as any); + +const secretManagerCommitsPageRouteRoute = secretManagerCommitsPageRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute +} as any); const secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute = secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteImport.update({ - id: '/restore', - path: '/restore', + id: "/restore", + path: "/restore", getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute, - } as any) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute + } as any); -const secretManagerCommitDetailsPageRouteRoute = - secretManagerCommitDetailsPageRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute, - } as any) +const secretManagerCommitDetailsPageRouteRoute = secretManagerCommitDetailsPageRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute +} as any); // Populate the FileRoutesByPath interface -declare module '@tanstack/react-router' { +declare module "@tanstack/react-router" { interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof indexImport - parentRoute: typeof rootRoute - } - '/cli-redirect': { - id: '/cli-redirect' - path: '/cli-redirect' - fullPath: '/cli-redirect' - preLoaderRoute: typeof authCliRedirectPageRouteImport - parentRoute: typeof rootRoute - } - '/share-secret': { - id: '/share-secret' - path: '/share-secret' - fullPath: '/share-secret' - preLoaderRoute: typeof publicShareSecretPageRouteImport - parentRoute: typeof rootRoute - } - '/_authenticate': { - id: '/_authenticate' - path: '' - fullPath: '' - preLoaderRoute: typeof middlewaresAuthenticateImport - parentRoute: typeof rootRoute - } - '/_restrict-login-signup': { - id: '/_restrict-login-signup' - path: '' - fullPath: '' - preLoaderRoute: typeof middlewaresRestrictLoginSignupImport - parentRoute: typeof rootRoute - } - '/_authenticate/password-setup': { - id: '/_authenticate/password-setup' - path: '/password-setup' - fullPath: '/password-setup' - preLoaderRoute: typeof authPasswordSetupPageRouteImport - parentRoute: typeof middlewaresAuthenticateImport - } - '/_restrict-login-signup/email-not-verified': { - id: '/_restrict-login-signup/email-not-verified' - path: '/email-not-verified' - fullPath: '/email-not-verified' - preLoaderRoute: typeof authEmailNotVerifiedPageRouteImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_restrict-login-signup/password-reset': { - id: '/_restrict-login-signup/password-reset' - path: '/password-reset' - fullPath: '/password-reset' - preLoaderRoute: typeof authPasswordResetPageRouteImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_restrict-login-signup/requestnewinvite': { - id: '/_restrict-login-signup/requestnewinvite' - path: '/requestnewinvite' - fullPath: '/requestnewinvite' - preLoaderRoute: typeof authRequestNewInvitePageRouteImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_restrict-login-signup/signupinvite': { - id: '/_restrict-login-signup/signupinvite' - path: '/signupinvite' - fullPath: '/signupinvite' - preLoaderRoute: typeof authSignUpInvitePageRouteImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_restrict-login-signup/verify-email': { - id: '/_restrict-login-signup/verify-email' - path: '/verify-email' - fullPath: '/verify-email' - preLoaderRoute: typeof authVerifyEmailPageRouteImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_authenticate/_inject-org-details': { - id: '/_authenticate/_inject-org-details' - path: '' - fullPath: '' - preLoaderRoute: typeof middlewaresInjectOrgDetailsImport - parentRoute: typeof middlewaresAuthenticateImport - } - '/_authenticate/personal-settings': { - id: '/_authenticate/personal-settings' - path: '/personal-settings' - fullPath: '/personal-settings' - preLoaderRoute: typeof AuthenticatePersonalSettingsImport - parentRoute: typeof middlewaresAuthenticateImport - } - '/_restrict-login-signup/login': { - id: '/_restrict-login-signup/login' - path: '/login' - fullPath: '/login' - preLoaderRoute: typeof RestrictLoginSignupLoginImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_restrict-login-signup/signup': { - id: '/_restrict-login-signup/signup' - path: '/signup' - fullPath: '/signup' - preLoaderRoute: typeof RestrictLoginSignupSignupImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_restrict-login-signup/login/': { - id: '/_restrict-login-signup/login/' - path: '/' - fullPath: '/login/' - preLoaderRoute: typeof authLoginPageRouteImport - parentRoute: typeof RestrictLoginSignupLoginImport - } - '/_restrict-login-signup/signup/': { - id: '/_restrict-login-signup/signup/' - path: '/' - fullPath: '/signup/' - preLoaderRoute: typeof authSignUpPageRouteImport - parentRoute: typeof RestrictLoginSignupSignupImport - } - '/_authenticate/organization/none': { - id: '/_authenticate/organization/none' - path: '/organization/none' - fullPath: '/organization/none' - preLoaderRoute: typeof organizationNoOrgPageRouteImport - parentRoute: typeof middlewaresAuthenticateImport - } - '/_restrict-login-signup/admin/signup': { - id: '/_restrict-login-signup/admin/signup' - path: '/admin/signup' - fullPath: '/admin/signup' - preLoaderRoute: typeof adminSignUpPageRouteImport - parentRoute: typeof middlewaresRestrictLoginSignupImport - } - '/_restrict-login-signup/login/admin': { - id: '/_restrict-login-signup/login/admin' - path: '/admin' - fullPath: '/login/admin' - preLoaderRoute: typeof authAdminLoginPageRouteImport - parentRoute: typeof RestrictLoginSignupLoginImport - } - '/_restrict-login-signup/login/ldap': { - id: '/_restrict-login-signup/login/ldap' - path: '/ldap' - fullPath: '/login/ldap' - preLoaderRoute: typeof authLoginLdapPageRouteImport - parentRoute: typeof RestrictLoginSignupLoginImport - } - '/_restrict-login-signup/login/select-organization': { - id: '/_restrict-login-signup/login/select-organization' - path: '/select-organization' - fullPath: '/login/select-organization' - preLoaderRoute: typeof authSelectOrgPageRouteImport - parentRoute: typeof RestrictLoginSignupLoginImport - } - '/_restrict-login-signup/login/sso': { - id: '/_restrict-login-signup/login/sso' - path: '/sso' - fullPath: '/login/sso' - preLoaderRoute: typeof authLoginSsoPageRouteImport - parentRoute: typeof RestrictLoginSignupLoginImport - } - '/_restrict-login-signup/signup/sso': { - id: '/_restrict-login-signup/signup/sso' - path: '/sso' - fullPath: '/signup/sso' - preLoaderRoute: typeof authSignUpSsoPageRouteImport - parentRoute: typeof RestrictLoginSignupSignupImport - } - '/secret-request/secret/$secretRequestId': { - id: '/secret-request/secret/$secretRequestId' - path: '/secret-request/secret/$secretRequestId' - fullPath: '/secret-request/secret/$secretRequestId' - preLoaderRoute: typeof publicViewSecretRequestByIDPageRouteImport - parentRoute: typeof rootRoute - } - '/shared/secret/$secretId': { - id: '/shared/secret/$secretId' - path: '/shared/secret/$secretId' - fullPath: '/shared/secret/$secretId' - preLoaderRoute: typeof publicViewSharedSecretByIDPageRouteImport - parentRoute: typeof rootRoute - } - '/_authenticate/_inject-org-details/_org-layout': { - id: '/_authenticate/_inject-org-details/_org-layout' - path: '' - fullPath: '' - preLoaderRoute: typeof organizationLayoutImport - parentRoute: typeof middlewaresInjectOrgDetailsImport - } - '/_authenticate/_inject-org-details/admin': { - id: '/_authenticate/_inject-org-details/admin' - path: '/admin' - fullPath: '/admin' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsAdminImport - parentRoute: typeof middlewaresInjectOrgDetailsImport - } - '/_authenticate/personal-settings/_layout': { - id: '/_authenticate/personal-settings/_layout' - path: '' - fullPath: '/personal-settings' - preLoaderRoute: typeof userLayoutImport - parentRoute: typeof AuthenticatePersonalSettingsImport - } - '/_authenticate/personal-settings/_layout/': { - id: '/_authenticate/personal-settings/_layout/' - path: '/' - fullPath: '/personal-settings/' - preLoaderRoute: typeof userPersonalSettingsPageRouteImport - parentRoute: typeof userLayoutImport - } - '/_restrict-login-signup/login/provider/error': { - id: '/_restrict-login-signup/login/provider/error' - path: '/provider/error' - fullPath: '/login/provider/error' - preLoaderRoute: typeof authProviderErrorPageRouteImport - parentRoute: typeof RestrictLoginSignupLoginImport - } - '/_restrict-login-signup/login/provider/success': { - id: '/_restrict-login-signup/login/provider/success' - path: '/provider/success' - fullPath: '/login/provider/success' - preLoaderRoute: typeof authProviderSuccessPageRouteImport - parentRoute: typeof RestrictLoginSignupLoginImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations' - path: '/integrations' - fullPath: '/integrations' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/organization': { - id: '/_authenticate/_inject-org-details/_org-layout/organization' - path: '/organization' - fullPath: '/organization' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout' - path: '' - fullPath: '/admin' - preLoaderRoute: typeof adminLayoutImport - parentRoute: typeof AuthenticateInjectOrgDetailsAdminImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/' - path: '/' - fullPath: '/admin/' - preLoaderRoute: typeof adminGeneralPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/access-management': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/access-management' - path: '/access-management' - fullPath: '/organization/access-management' - preLoaderRoute: typeof organizationAccessManagementPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs' - path: '/audit-logs' - fullPath: '/organization/audit-logs' - preLoaderRoute: typeof organizationAuditLogsPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/billing': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/billing' - path: '/billing' - fullPath: '/organization/billing' - preLoaderRoute: typeof organizationBillingPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/projects': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/projects' - path: '/projects' - fullPath: '/organization/projects' - preLoaderRoute: typeof organizationProjectsPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/authentication': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/authentication' - path: '/authentication' - fullPath: '/admin/authentication' - preLoaderRoute: typeof adminAuthenticationPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/caching': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/caching' - path: '/caching' - fullPath: '/admin/caching' - preLoaderRoute: typeof adminCachingPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/encryption': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/encryption' - path: '/encryption' - fullPath: '/admin/encryption' - preLoaderRoute: typeof adminEncryptionPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/environment': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/environment' - path: '/environment' - fullPath: '/admin/environment' - preLoaderRoute: typeof adminEnvironmentPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/integrations': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/integrations' - path: '/integrations' - fullPath: '/admin/integrations' - preLoaderRoute: typeof adminIntegrationsPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/app-connections': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/app-connections' - path: '/app-connections' - fullPath: '/organization/app-connections' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/gateways': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/gateways' - path: '/gateways' - fullPath: '/organization/gateways' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing' - path: '/secret-sharing' - fullPath: '/organization/secret-sharing' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/settings': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/settings' - path: '/settings' - fullPath: '/organization/settings' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId': { - id: '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId' - path: '/secret-manager/$projectId' - fullPath: '/secret-manager/$projectId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/' - path: '/' - fullPath: '/organization/app-connections/' - preLoaderRoute: typeof organizationAppConnectionsAppConnectionsPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/gateways/': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/gateways/' - path: '/' - fullPath: '/organization/gateways/' - preLoaderRoute: typeof organizationGatewaysGatewayListPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/' - path: '/' - fullPath: '/organization/secret-sharing/' - preLoaderRoute: typeof organizationSecretSharingPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/settings/': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/settings/' - path: '/' - fullPath: '/organization/settings/' - preLoaderRoute: typeof organizationSettingsPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId' - path: '/groups/$groupId' - fullPath: '/organization/groups/$groupId' - preLoaderRoute: typeof organizationGroupDetailsByIDPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId' - path: '/identities/$identityId' - fullPath: '/organization/identities/$identityId' - preLoaderRoute: typeof organizationIdentityDetailsByIDPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId' - path: '/members/$membershipId' - fullPath: '/organization/members/$membershipId' - preLoaderRoute: typeof organizationUserDetailsByIDPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId' - path: '/roles/$roleId' - fullPath: '/organization/roles/$roleId' - preLoaderRoute: typeof organizationRoleByIDPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings' - path: '/settings' - fullPath: '/organization/secret-sharing/settings' - preLoaderRoute: typeof organizationSecretSharingSettingsPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/resources/machine-identities': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/resources/machine-identities' - path: '/resources/machine-identities' - fullPath: '/admin/resources/machine-identities' - preLoaderRoute: typeof adminMachineIdentitiesResourcesPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/resources/organizations': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/resources/organizations' - path: '/resources/organizations' - fullPath: '/admin/resources/organizations' - preLoaderRoute: typeof adminOrganizationResourcesPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/admin/_admin-layout/resources/user-identities': { - id: '/_authenticate/_inject-org-details/admin/_admin-layout/resources/user-identities' - path: '/resources/user-identities' - fullPath: '/admin/resources/user-identities' - preLoaderRoute: typeof adminUserIdentitiesResourcesPageRouteImport - parentRoute: typeof adminLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId' - path: '/projects/cert-management/$projectId' - fullPath: '/projects/cert-management/$projectId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId' - path: '/projects/kms/$projectId' - fullPath: '/projects/kms/$projectId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId' - path: '/projects/secret-management/$projectId' - fullPath: '/projects/secret-management/$projectId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId' - path: '/projects/secret-scanning/$projectId' - fullPath: '/projects/secret-scanning/$projectId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId' - path: '/projects/ssh/$projectId' - fullPath: '/projects/ssh/$projectId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdImport - parentRoute: typeof organizationLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval': { - id: '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval' - path: '/approval' - fullPath: '/secret-manager/$projectId/approval' - preLoaderRoute: typeof secretManagerRedirectsRedirectApprovalPageImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback' - path: '/oauth/callback' - fullPath: '/organization/settings/oauth/callback' - preLoaderRoute: typeof organizationSettingsPageOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback' - path: '/azure-app-configuration/oauth2/callback' - fullPath: '/integrations/azure-app-configuration/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback' - path: '/azure-key-vault/oauth2/callback' - fullPath: '/integrations/azure-key-vault/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback' - path: '/bitbucket/oauth2/callback' - fullPath: '/integrations/bitbucket/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteBitbucketOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback' - path: '/gcp-secret-manager/oauth2/callback' - fullPath: '/integrations/gcp-secret-manager/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteGcpOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback' - path: '/github/oauth2/callback' - fullPath: '/integrations/github/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteGithubOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback' - path: '/gitlab/oauth2/callback' - fullPath: '/integrations/gitlab/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteGitlabOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback' - path: '/heroku/oauth2/callback' - fullPath: '/integrations/heroku/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteHerokuOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback' - path: '/netlify/oauth2/callback' - fullPath: '/integrations/netlify/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteNetlifyOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback' - path: '/vercel/oauth2/callback' - fullPath: '/integrations/vercel/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsRouteVercelOauthRedirectImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout' - path: '' - fullPath: '/projects/cert-management/$projectId' - preLoaderRoute: typeof certManagerLayoutImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout' - path: '' - fullPath: '/projects/kms/$projectId' - preLoaderRoute: typeof kmsLayoutImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout' - path: '' - fullPath: '/projects/secret-management/$projectId' - preLoaderRoute: typeof secretManagerLayoutImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout' - path: '' - fullPath: '/projects/secret-scanning/$projectId' - preLoaderRoute: typeof secretScanningLayoutImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout' - path: '' - fullPath: '/projects/ssh/$projectId' - preLoaderRoute: typeof sshLayoutImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdImport - } - '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback' - path: '/$appConnection/oauth/callback' - fullPath: '/organization/app-connections/$appConnection/oauth/callback' - preLoaderRoute: typeof organizationAppConnectionsOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting' - path: '/alerting' - fullPath: '/projects/cert-management/$projectId/alerting' - preLoaderRoute: typeof certManagerAlertingPageRouteImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities' - path: '/certificate-authorities' - fullPath: '/projects/cert-management/$projectId/certificate-authorities' - preLoaderRoute: typeof certManagerCertificateAuthoritiesPageRouteImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates' - path: '/certificates' - fullPath: '/projects/cert-management/$projectId/certificates' - preLoaderRoute: typeof certManagerCertificatesPageRouteImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings' - path: '/settings' - fullPath: '/projects/cert-management/$projectId/settings' - preLoaderRoute: typeof certManagerSettingsPageRouteImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip' - path: '/kmip' - fullPath: '/projects/kms/$projectId/kmip' - preLoaderRoute: typeof kmsKmipPageRouteImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview' - path: '/overview' - fullPath: '/projects/kms/$projectId/overview' - preLoaderRoute: typeof kmsOverviewPageRouteImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings' - path: '/settings' - fullPath: '/projects/kms/$projectId/settings' - preLoaderRoute: typeof kmsSettingsPageRouteImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist' - path: '/allowlist' - fullPath: '/projects/secret-management/$projectId/allowlist' - preLoaderRoute: typeof secretManagerIPAllowlistPageRouteImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval' - path: '/approval' - fullPath: '/projects/secret-management/$projectId/approval' - preLoaderRoute: typeof secretManagerSecretApprovalsPageRouteImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview' - path: '/overview' - fullPath: '/projects/secret-management/$projectId/overview' - preLoaderRoute: typeof secretManagerOverviewPageRouteImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation' - path: '/secret-rotation' - fullPath: '/projects/secret-management/$projectId/secret-rotation' - preLoaderRoute: typeof secretManagerSecretRotationPageRouteImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings' - path: '/settings' - fullPath: '/projects/secret-management/$projectId/settings' - preLoaderRoute: typeof secretManagerSettingsPageRouteImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings' - path: '/findings' - fullPath: '/projects/secret-scanning/$projectId/findings' - preLoaderRoute: typeof secretScanningSecretScanningFindingsPageRouteImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings' - path: '/settings' - fullPath: '/projects/secret-scanning/$projectId/settings' - preLoaderRoute: typeof secretScanningSettingsPageRouteImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas' - path: '/cas' - fullPath: '/projects/ssh/$projectId/cas' - preLoaderRoute: typeof sshSshCasPageRouteImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates' - path: '/certificates' - fullPath: '/projects/ssh/$projectId/certificates' - preLoaderRoute: typeof sshSshCertsPageRouteImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview' - path: '/overview' - fullPath: '/projects/ssh/$projectId/overview' - preLoaderRoute: typeof sshSshHostsPageRouteImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings' - path: '/settings' - fullPath: '/projects/ssh/$projectId/settings' - preLoaderRoute: typeof sshSettingsPageRouteImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management' - path: '/access-management' - fullPath: '/projects/cert-management/$projectId/access-management' - preLoaderRoute: typeof projectAccessControlPageRouteCertManagerImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs' - path: '/audit-logs' - fullPath: '/projects/cert-management/$projectId/audit-logs' - preLoaderRoute: typeof projectAuditLogsPageRouteCertManagerImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates' - path: '/certificate-templates' - fullPath: '/projects/cert-management/$projectId/certificate-templates' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers' - path: '/subscribers' - fullPath: '/projects/cert-management/$projectId/subscribers' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management' - path: '/access-management' - fullPath: '/projects/kms/$projectId/access-management' - preLoaderRoute: typeof projectAccessControlPageRouteKmsImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs' - path: '/audit-logs' - fullPath: '/projects/kms/$projectId/audit-logs' - preLoaderRoute: typeof projectAuditLogsPageRouteKmsImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management' - path: '/access-management' - fullPath: '/projects/secret-management/$projectId/access-management' - preLoaderRoute: typeof projectAccessControlPageRouteSecretManagerImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs' - path: '/audit-logs' - fullPath: '/projects/secret-management/$projectId/audit-logs' - preLoaderRoute: typeof projectAuditLogsPageRouteSecretManagerImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations' - path: '/integrations' - fullPath: '/projects/secret-management/$projectId/integrations' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management' - path: '/access-management' - fullPath: '/projects/secret-scanning/$projectId/access-management' - preLoaderRoute: typeof projectAccessControlPageRouteSecretScanningImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs' - path: '/audit-logs' - fullPath: '/projects/secret-scanning/$projectId/audit-logs' - preLoaderRoute: typeof projectAuditLogsPageRouteSecretScanningImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources' - path: '/data-sources' - fullPath: '/projects/secret-scanning/$projectId/data-sources' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management' - path: '/access-management' - fullPath: '/projects/ssh/$projectId/access-management' - preLoaderRoute: typeof projectAccessControlPageRouteSshImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs' - path: '/audit-logs' - fullPath: '/projects/ssh/$projectId/audit-logs' - preLoaderRoute: typeof projectAuditLogsPageRouteSshImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/' - path: '/' - fullPath: '/projects/cert-management/$projectId/certificate-templates/' - preLoaderRoute: typeof certManagerPkiTemplateListPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/' - path: '/' - fullPath: '/projects/cert-management/$projectId/subscribers/' - preLoaderRoute: typeof certManagerPkiSubscribersPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/' - path: '/' - fullPath: '/projects/secret-management/$projectId/integrations/' - preLoaderRoute: typeof secretManagerIntegrationsListPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/' - path: '/' - fullPath: '/projects/secret-scanning/$projectId/data-sources/' - preLoaderRoute: typeof secretScanningSecretScanningDataSourcesPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName' - path: '/ca/$caName' - fullPath: '/projects/cert-management/$projectId/ca/$caName' - preLoaderRoute: typeof certManagerCertAuthDetailsByIDPageRouteImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName' - path: '/$subscriberName' - fullPath: '/projects/cert-management/$projectId/subscribers/$subscriberName' - preLoaderRoute: typeof certManagerPkiSubscriberDetailsByIDPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId' - path: '/$integrationId' - fullPath: '/projects/secret-management/$projectId/integrations/$integrationId' - preLoaderRoute: typeof secretManagerIntegrationsDetailsByIDPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth' - path: '/select-integration-auth' - fullPath: '/projects/secret-management/$projectId/integrations/select-integration-auth' - preLoaderRoute: typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug' - path: '/secrets/$envSlug' - fullPath: '/projects/secret-management/$projectId/secrets/$envSlug' - preLoaderRoute: typeof secretManagerSecretDashboardPageRouteImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId' - path: '/ca/$caId' - fullPath: '/projects/ssh/$projectId/ca/$caId' - preLoaderRoute: typeof sshSshCaByIDPageRouteImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId' - path: '/ssh-host-groups/$sshHostGroupId' - fullPath: '/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId' - preLoaderRoute: typeof sshSshHostGroupDetailsByIDPageRouteImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId' - path: '/groups/$groupId' - fullPath: '/projects/cert-management/$projectId/groups/$groupId' - preLoaderRoute: typeof projectGroupDetailsByIDPageRouteCertManagerImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId' - path: '/identities/$identityId' - fullPath: '/projects/cert-management/$projectId/identities/$identityId' - preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteCertManagerImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId' - path: '/members/$membershipId' - fullPath: '/projects/cert-management/$projectId/members/$membershipId' - preLoaderRoute: typeof projectMemberDetailsByIDPageRouteCertManagerImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId' - path: '/pki-collections/$collectionId' - fullPath: '/projects/cert-management/$projectId/pki-collections/$collectionId' - preLoaderRoute: typeof certManagerPkiCollectionDetailsByIDPageRoutesImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug' - path: '/roles/$roleSlug' - fullPath: '/projects/cert-management/$projectId/roles/$roleSlug' - preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteCertManagerImport - parentRoute: typeof certManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId' - path: '/groups/$groupId' - fullPath: '/projects/kms/$projectId/groups/$groupId' - preLoaderRoute: typeof projectGroupDetailsByIDPageRouteKmsImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId' - path: '/identities/$identityId' - fullPath: '/projects/kms/$projectId/identities/$identityId' - preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteKmsImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId' - path: '/members/$membershipId' - fullPath: '/projects/kms/$projectId/members/$membershipId' - preLoaderRoute: typeof projectMemberDetailsByIDPageRouteKmsImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug' - path: '/roles/$roleSlug' - fullPath: '/projects/kms/$projectId/roles/$roleSlug' - preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteKmsImport - parentRoute: typeof kmsLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId' - path: '/groups/$groupId' - fullPath: '/projects/secret-management/$projectId/groups/$groupId' - preLoaderRoute: typeof projectGroupDetailsByIDPageRouteSecretManagerImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId' - path: '/identities/$identityId' - fullPath: '/projects/secret-management/$projectId/identities/$identityId' - preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteSecretManagerImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId' - path: '/members/$membershipId' - fullPath: '/projects/secret-management/$projectId/members/$membershipId' - preLoaderRoute: typeof projectMemberDetailsByIDPageRouteSecretManagerImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug' - path: '/roles/$roleSlug' - fullPath: '/projects/secret-management/$projectId/roles/$roleSlug' - preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteSecretManagerImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId' - path: '/groups/$groupId' - fullPath: '/projects/secret-scanning/$projectId/groups/$groupId' - preLoaderRoute: typeof projectGroupDetailsByIDPageRouteSecretScanningImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId' - path: '/identities/$identityId' - fullPath: '/projects/secret-scanning/$projectId/identities/$identityId' - preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteSecretScanningImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId' - path: '/members/$membershipId' - fullPath: '/projects/secret-scanning/$projectId/members/$membershipId' - preLoaderRoute: typeof projectMemberDetailsByIDPageRouteSecretScanningImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug' - path: '/roles/$roleSlug' - fullPath: '/projects/secret-scanning/$projectId/roles/$roleSlug' - preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteSecretScanningImport - parentRoute: typeof secretScanningLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId' - path: '/groups/$groupId' - fullPath: '/projects/ssh/$projectId/groups/$groupId' - preLoaderRoute: typeof projectGroupDetailsByIDPageRouteSshImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId' - path: '/identities/$identityId' - fullPath: '/projects/ssh/$projectId/identities/$identityId' - preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteSshImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId' - path: '/members/$membershipId' - fullPath: '/projects/ssh/$projectId/members/$membershipId' - preLoaderRoute: typeof projectMemberDetailsByIDPageRouteSshImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug' - path: '/roles/$roleSlug' - fullPath: '/projects/ssh/$projectId/roles/$roleSlug' - preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteSshImport - parentRoute: typeof sshLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize' - path: '/aws-parameter-store/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize' - preLoaderRoute: typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create' - path: '/aws-parameter-store/create' - fullPath: '/projects/secret-management/$projectId/integrations/aws-parameter-store/create' - preLoaderRoute: typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize' - path: '/aws-secret-manager/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize' - preLoaderRoute: typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create' - path: '/aws-secret-manager/create' - fullPath: '/projects/secret-management/$projectId/integrations/aws-secret-manager/create' - preLoaderRoute: typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create' - path: '/azure-app-configuration/create' - fullPath: '/projects/secret-management/$projectId/integrations/azure-app-configuration/create' - preLoaderRoute: typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize' - path: '/azure-devops/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/azure-devops/authorize' - preLoaderRoute: typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create' - path: '/azure-devops/create' - fullPath: '/projects/secret-management/$projectId/integrations/azure-devops/create' - preLoaderRoute: typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize' - path: '/azure-key-vault/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/azure-key-vault/authorize' - preLoaderRoute: typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create' - path: '/azure-key-vault/create' - fullPath: '/projects/secret-management/$projectId/integrations/azure-key-vault/create' - preLoaderRoute: typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create' - path: '/bitbucket/create' - fullPath: '/projects/secret-management/$projectId/integrations/bitbucket/create' - preLoaderRoute: typeof secretManagerIntegrationsBitbucketConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize' - path: '/checkly/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/checkly/authorize' - preLoaderRoute: typeof secretManagerIntegrationsChecklyAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create' - path: '/checkly/create' - fullPath: '/projects/secret-management/$projectId/integrations/checkly/create' - preLoaderRoute: typeof secretManagerIntegrationsChecklyConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize' - path: '/circleci/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/circleci/authorize' - preLoaderRoute: typeof secretManagerIntegrationsCircleCIAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create' - path: '/circleci/create' - fullPath: '/projects/secret-management/$projectId/integrations/circleci/create' - preLoaderRoute: typeof secretManagerIntegrationsCircleCIConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize' - path: '/cloud-66/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/cloud-66/authorize' - preLoaderRoute: typeof secretManagerIntegrationsCloud66AuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create' - path: '/cloud-66/create' - fullPath: '/projects/secret-management/$projectId/integrations/cloud-66/create' - preLoaderRoute: typeof secretManagerIntegrationsCloud66ConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize' - path: '/cloudflare-pages/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize' - preLoaderRoute: typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create' - path: '/cloudflare-pages/create' - fullPath: '/projects/secret-management/$projectId/integrations/cloudflare-pages/create' - preLoaderRoute: typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize' - path: '/cloudflare-workers/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize' - preLoaderRoute: typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create' - path: '/cloudflare-workers/create' - fullPath: '/projects/secret-management/$projectId/integrations/cloudflare-workers/create' - preLoaderRoute: typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize' - path: '/codefresh/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/codefresh/authorize' - preLoaderRoute: typeof secretManagerIntegrationsCodefreshAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create' - path: '/codefresh/create' - fullPath: '/projects/secret-management/$projectId/integrations/codefresh/create' - preLoaderRoute: typeof secretManagerIntegrationsCodefreshConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize' - path: '/databricks/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/databricks/authorize' - preLoaderRoute: typeof secretManagerIntegrationsDatabricksAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create' - path: '/databricks/create' - fullPath: '/projects/secret-management/$projectId/integrations/databricks/create' - preLoaderRoute: typeof secretManagerIntegrationsDatabricksConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize' - path: '/digital-ocean-app-platform/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize' - preLoaderRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create' - path: '/digital-ocean-app-platform/create' - fullPath: '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create' - preLoaderRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize' - path: '/flyio/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/flyio/authorize' - preLoaderRoute: typeof secretManagerIntegrationsFlyioAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create' - path: '/flyio/create' - fullPath: '/projects/secret-management/$projectId/integrations/flyio/create' - preLoaderRoute: typeof secretManagerIntegrationsFlyioConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize' - path: '/gcp-secret-manager/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize' - preLoaderRoute: typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create' - path: '/gcp-secret-manager/create' - fullPath: '/projects/secret-management/$projectId/integrations/gcp-secret-manager/create' - preLoaderRoute: typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection' - path: '/github/auth-mode-selection' - fullPath: '/projects/secret-management/$projectId/integrations/github/auth-mode-selection' - preLoaderRoute: typeof secretManagerIntegrationsGithubAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create' - path: '/github/create' - fullPath: '/projects/secret-management/$projectId/integrations/github/create' - preLoaderRoute: typeof secretManagerIntegrationsGithubConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize' - path: '/gitlab/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/gitlab/authorize' - preLoaderRoute: typeof secretManagerIntegrationsGitlabAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create' - path: '/gitlab/create' - fullPath: '/projects/secret-management/$projectId/integrations/gitlab/create' - preLoaderRoute: typeof secretManagerIntegrationsGitlabConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize' - path: '/hashicorp-vault/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize' - preLoaderRoute: typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create' - path: '/hashicorp-vault/create' - fullPath: '/projects/secret-management/$projectId/integrations/hashicorp-vault/create' - preLoaderRoute: typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize' - path: '/hasura-cloud/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/hasura-cloud/authorize' - preLoaderRoute: typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create' - path: '/hasura-cloud/create' - fullPath: '/projects/secret-management/$projectId/integrations/hasura-cloud/create' - preLoaderRoute: typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create' - path: '/heroku/create' - fullPath: '/projects/secret-management/$projectId/integrations/heroku/create' - preLoaderRoute: typeof secretManagerIntegrationsHerokuConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize' - path: '/laravel-forge/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/laravel-forge/authorize' - preLoaderRoute: typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create' - path: '/laravel-forge/create' - fullPath: '/projects/secret-management/$projectId/integrations/laravel-forge/create' - preLoaderRoute: typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create' - path: '/netlify/create' - fullPath: '/projects/secret-management/$projectId/integrations/netlify/create' - preLoaderRoute: typeof secretManagerIntegrationsNetlifyConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize' - path: '/northflank/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/northflank/authorize' - preLoaderRoute: typeof secretManagerIntegrationsNorthflankAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create' - path: '/northflank/create' - fullPath: '/projects/secret-management/$projectId/integrations/northflank/create' - preLoaderRoute: typeof secretManagerIntegrationsNorthflankConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize' - path: '/octopus-deploy/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/octopus-deploy/authorize' - preLoaderRoute: typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create' - path: '/octopus-deploy/create' - fullPath: '/projects/secret-management/$projectId/integrations/octopus-deploy/create' - preLoaderRoute: typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize' - path: '/qovery/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/qovery/authorize' - preLoaderRoute: typeof secretManagerIntegrationsQoveryAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create' - path: '/qovery/create' - fullPath: '/projects/secret-management/$projectId/integrations/qovery/create' - preLoaderRoute: typeof secretManagerIntegrationsQoveryConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize' - path: '/railway/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/railway/authorize' - preLoaderRoute: typeof secretManagerIntegrationsRailwayAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create' - path: '/railway/create' - fullPath: '/projects/secret-management/$projectId/integrations/railway/create' - preLoaderRoute: typeof secretManagerIntegrationsRailwayConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize' - path: '/render/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/render/authorize' - preLoaderRoute: typeof secretManagerIntegrationsRenderAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create' - path: '/render/create' - fullPath: '/projects/secret-management/$projectId/integrations/render/create' - preLoaderRoute: typeof secretManagerIntegrationsRenderConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize' - path: '/rundeck/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/rundeck/authorize' - preLoaderRoute: typeof secretManagerIntegrationsRundeckAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create' - path: '/rundeck/create' - fullPath: '/projects/secret-management/$projectId/integrations/rundeck/create' - preLoaderRoute: typeof secretManagerIntegrationsRundeckConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize' - path: '/supabase/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/supabase/authorize' - preLoaderRoute: typeof secretManagerIntegrationsSupabaseAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create' - path: '/supabase/create' - fullPath: '/projects/secret-management/$projectId/integrations/supabase/create' - preLoaderRoute: typeof secretManagerIntegrationsSupabaseConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize' - path: '/teamcity/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/teamcity/authorize' - preLoaderRoute: typeof secretManagerIntegrationsTeamcityAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create' - path: '/teamcity/create' - fullPath: '/projects/secret-management/$projectId/integrations/teamcity/create' - preLoaderRoute: typeof secretManagerIntegrationsTeamcityConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize' - path: '/terraform-cloud/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/terraform-cloud/authorize' - preLoaderRoute: typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create' - path: '/terraform-cloud/create' - fullPath: '/projects/secret-management/$projectId/integrations/terraform-cloud/create' - preLoaderRoute: typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize' - path: '/travisci/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/travisci/authorize' - preLoaderRoute: typeof secretManagerIntegrationsTravisCIAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create' - path: '/travisci/create' - fullPath: '/projects/secret-management/$projectId/integrations/travisci/create' - preLoaderRoute: typeof secretManagerIntegrationsTravisCIConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create' - path: '/vercel/create' - fullPath: '/projects/secret-management/$projectId/integrations/vercel/create' - preLoaderRoute: typeof secretManagerIntegrationsVercelConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize' - path: '/windmill/authorize' - fullPath: '/projects/secret-management/$projectId/integrations/windmill/authorize' - preLoaderRoute: typeof secretManagerIntegrationsWindmillAuthorizePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create' - path: '/windmill/create' - fullPath: '/projects/secret-management/$projectId/integrations/windmill/create' - preLoaderRoute: typeof secretManagerIntegrationsWindmillConfigurePageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId' - path: '/$type/$dataSourceId' - fullPath: '/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId' - preLoaderRoute: typeof secretScanningSecretScanningDataSourceByIdPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId' - path: '/commits/$environment/$folderId' - fullPath: '/projects/secret-management/$projectId/commits/$environment/$folderId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdImport - parentRoute: typeof secretManagerLayoutImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/' - path: '/' - fullPath: '/projects/secret-management/$projectId/commits/$environment/$folderId/' - preLoaderRoute: typeof secretManagerCommitsPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback' - path: '/azure-app-configuration/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback' - path: '/azure-key-vault/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback' - path: '/bitbucket/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback' - path: '/gcp-secret-manager/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback' - path: '/github/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/github/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsGithubOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback' - path: '/gitlab/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback' - path: '/heroku/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/heroku/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback' - path: '/netlify/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/netlify/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId' - path: '/secret-syncs/$destination/$syncId' - fullPath: '/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId' - preLoaderRoute: typeof secretManagerSecretSyncDetailsByIDPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback' - path: '/vercel/oauth2/callback' - fullPath: '/projects/secret-management/$projectId/integrations/vercel/oauth2/callback' - preLoaderRoute: typeof secretManagerIntegrationsVercelOauthCallbackPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId' - path: '/$commitId' - fullPath: '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId' - preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/' - path: '/' - fullPath: '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/' - preLoaderRoute: typeof secretManagerCommitDetailsPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdImport - } - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore': { - id: '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore' - path: '/restore' - fullPath: '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore' - preLoaderRoute: typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdImport - } + "/": { + id: "/"; + path: "/"; + fullPath: "/"; + preLoaderRoute: typeof indexImport; + parentRoute: typeof rootRoute; + }; + "/cli-redirect": { + id: "/cli-redirect"; + path: "/cli-redirect"; + fullPath: "/cli-redirect"; + preLoaderRoute: typeof authCliRedirectPageRouteImport; + parentRoute: typeof rootRoute; + }; + "/share-secret": { + id: "/share-secret"; + path: "/share-secret"; + fullPath: "/share-secret"; + preLoaderRoute: typeof publicShareSecretPageRouteImport; + parentRoute: typeof rootRoute; + }; + "/_authenticate": { + id: "/_authenticate"; + path: ""; + fullPath: ""; + preLoaderRoute: typeof middlewaresAuthenticateImport; + parentRoute: typeof rootRoute; + }; + "/_restrict-login-signup": { + id: "/_restrict-login-signup"; + path: ""; + fullPath: ""; + preLoaderRoute: typeof middlewaresRestrictLoginSignupImport; + parentRoute: typeof rootRoute; + }; + "/_authenticate/password-setup": { + id: "/_authenticate/password-setup"; + path: "/password-setup"; + fullPath: "/password-setup"; + preLoaderRoute: typeof authPasswordSetupPageRouteImport; + parentRoute: typeof middlewaresAuthenticateImport; + }; + "/_restrict-login-signup/email-not-verified": { + id: "/_restrict-login-signup/email-not-verified"; + path: "/email-not-verified"; + fullPath: "/email-not-verified"; + preLoaderRoute: typeof authEmailNotVerifiedPageRouteImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_restrict-login-signup/password-reset": { + id: "/_restrict-login-signup/password-reset"; + path: "/password-reset"; + fullPath: "/password-reset"; + preLoaderRoute: typeof authPasswordResetPageRouteImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_restrict-login-signup/requestnewinvite": { + id: "/_restrict-login-signup/requestnewinvite"; + path: "/requestnewinvite"; + fullPath: "/requestnewinvite"; + preLoaderRoute: typeof authRequestNewInvitePageRouteImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_restrict-login-signup/signupinvite": { + id: "/_restrict-login-signup/signupinvite"; + path: "/signupinvite"; + fullPath: "/signupinvite"; + preLoaderRoute: typeof authSignUpInvitePageRouteImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_restrict-login-signup/verify-email": { + id: "/_restrict-login-signup/verify-email"; + path: "/verify-email"; + fullPath: "/verify-email"; + preLoaderRoute: typeof authVerifyEmailPageRouteImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_authenticate/_inject-org-details": { + id: "/_authenticate/_inject-org-details"; + path: ""; + fullPath: ""; + preLoaderRoute: typeof middlewaresInjectOrgDetailsImport; + parentRoute: typeof middlewaresAuthenticateImport; + }; + "/_authenticate/personal-settings": { + id: "/_authenticate/personal-settings"; + path: "/personal-settings"; + fullPath: "/personal-settings"; + preLoaderRoute: typeof AuthenticatePersonalSettingsImport; + parentRoute: typeof middlewaresAuthenticateImport; + }; + "/_restrict-login-signup/login": { + id: "/_restrict-login-signup/login"; + path: "/login"; + fullPath: "/login"; + preLoaderRoute: typeof RestrictLoginSignupLoginImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_restrict-login-signup/signup": { + id: "/_restrict-login-signup/signup"; + path: "/signup"; + fullPath: "/signup"; + preLoaderRoute: typeof RestrictLoginSignupSignupImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_restrict-login-signup/login/": { + id: "/_restrict-login-signup/login/"; + path: "/"; + fullPath: "/login/"; + preLoaderRoute: typeof authLoginPageRouteImport; + parentRoute: typeof RestrictLoginSignupLoginImport; + }; + "/_restrict-login-signup/signup/": { + id: "/_restrict-login-signup/signup/"; + path: "/"; + fullPath: "/signup/"; + preLoaderRoute: typeof authSignUpPageRouteImport; + parentRoute: typeof RestrictLoginSignupSignupImport; + }; + "/_authenticate/organization/none": { + id: "/_authenticate/organization/none"; + path: "/organization/none"; + fullPath: "/organization/none"; + preLoaderRoute: typeof organizationNoOrgPageRouteImport; + parentRoute: typeof middlewaresAuthenticateImport; + }; + "/_restrict-login-signup/admin/signup": { + id: "/_restrict-login-signup/admin/signup"; + path: "/admin/signup"; + fullPath: "/admin/signup"; + preLoaderRoute: typeof adminSignUpPageRouteImport; + parentRoute: typeof middlewaresRestrictLoginSignupImport; + }; + "/_restrict-login-signup/login/admin": { + id: "/_restrict-login-signup/login/admin"; + path: "/admin"; + fullPath: "/login/admin"; + preLoaderRoute: typeof authAdminLoginPageRouteImport; + parentRoute: typeof RestrictLoginSignupLoginImport; + }; + "/_restrict-login-signup/login/ldap": { + id: "/_restrict-login-signup/login/ldap"; + path: "/ldap"; + fullPath: "/login/ldap"; + preLoaderRoute: typeof authLoginLdapPageRouteImport; + parentRoute: typeof RestrictLoginSignupLoginImport; + }; + "/_restrict-login-signup/login/select-organization": { + id: "/_restrict-login-signup/login/select-organization"; + path: "/select-organization"; + fullPath: "/login/select-organization"; + preLoaderRoute: typeof authSelectOrgPageRouteImport; + parentRoute: typeof RestrictLoginSignupLoginImport; + }; + "/_restrict-login-signup/login/sso": { + id: "/_restrict-login-signup/login/sso"; + path: "/sso"; + fullPath: "/login/sso"; + preLoaderRoute: typeof authLoginSsoPageRouteImport; + parentRoute: typeof RestrictLoginSignupLoginImport; + }; + "/_restrict-login-signup/signup/sso": { + id: "/_restrict-login-signup/signup/sso"; + path: "/sso"; + fullPath: "/signup/sso"; + preLoaderRoute: typeof authSignUpSsoPageRouteImport; + parentRoute: typeof RestrictLoginSignupSignupImport; + }; + "/secret-request/secret/$secretRequestId": { + id: "/secret-request/secret/$secretRequestId"; + path: "/secret-request/secret/$secretRequestId"; + fullPath: "/secret-request/secret/$secretRequestId"; + preLoaderRoute: typeof publicViewSecretRequestByIDPageRouteImport; + parentRoute: typeof rootRoute; + }; + "/shared/secret/$secretId": { + id: "/shared/secret/$secretId"; + path: "/shared/secret/$secretId"; + fullPath: "/shared/secret/$secretId"; + preLoaderRoute: typeof publicViewSharedSecretByIDPageRouteImport; + parentRoute: typeof rootRoute; + }; + "/_authenticate/_inject-org-details/_org-layout": { + id: "/_authenticate/_inject-org-details/_org-layout"; + path: ""; + fullPath: ""; + preLoaderRoute: typeof organizationLayoutImport; + parentRoute: typeof middlewaresInjectOrgDetailsImport; + }; + "/_authenticate/_inject-org-details/admin": { + id: "/_authenticate/_inject-org-details/admin"; + path: "/admin"; + fullPath: "/admin"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsAdminImport; + parentRoute: typeof middlewaresInjectOrgDetailsImport; + }; + "/_authenticate/personal-settings/_layout": { + id: "/_authenticate/personal-settings/_layout"; + path: ""; + fullPath: "/personal-settings"; + preLoaderRoute: typeof userLayoutImport; + parentRoute: typeof AuthenticatePersonalSettingsImport; + }; + "/_authenticate/personal-settings/_layout/": { + id: "/_authenticate/personal-settings/_layout/"; + path: "/"; + fullPath: "/personal-settings/"; + preLoaderRoute: typeof userPersonalSettingsPageRouteImport; + parentRoute: typeof userLayoutImport; + }; + "/_restrict-login-signup/login/provider/error": { + id: "/_restrict-login-signup/login/provider/error"; + path: "/provider/error"; + fullPath: "/login/provider/error"; + preLoaderRoute: typeof authProviderErrorPageRouteImport; + parentRoute: typeof RestrictLoginSignupLoginImport; + }; + "/_restrict-login-signup/login/provider/success": { + id: "/_restrict-login-signup/login/provider/success"; + path: "/provider/success"; + fullPath: "/login/provider/success"; + preLoaderRoute: typeof authProviderSuccessPageRouteImport; + parentRoute: typeof RestrictLoginSignupLoginImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations"; + path: "/integrations"; + fullPath: "/integrations"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization": { + id: "/_authenticate/_inject-org-details/_org-layout/organization"; + path: "/organization"; + fullPath: "/organization"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout"; + path: ""; + fullPath: "/admin"; + preLoaderRoute: typeof adminLayoutImport; + parentRoute: typeof AuthenticateInjectOrgDetailsAdminImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/"; + path: "/"; + fullPath: "/admin/"; + preLoaderRoute: typeof adminGeneralPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/access-management": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/access-management"; + path: "/access-management"; + fullPath: "/organization/access-management"; + preLoaderRoute: typeof organizationAccessManagementPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/audit-logs": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/audit-logs"; + path: "/audit-logs"; + fullPath: "/organization/audit-logs"; + preLoaderRoute: typeof organizationAuditLogsPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/billing": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/billing"; + path: "/billing"; + fullPath: "/organization/billing"; + preLoaderRoute: typeof organizationBillingPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/projects": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/projects"; + path: "/projects"; + fullPath: "/organization/projects"; + preLoaderRoute: typeof organizationProjectsPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/access-management": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/access-management"; + path: "/access-management"; + fullPath: "/admin/access-management"; + preLoaderRoute: typeof adminAccessManagementPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/authentication": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/authentication"; + path: "/authentication"; + fullPath: "/admin/authentication"; + preLoaderRoute: typeof adminAuthenticationPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/caching": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/caching"; + path: "/caching"; + fullPath: "/admin/caching"; + preLoaderRoute: typeof adminCachingPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/encryption": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/encryption"; + path: "/encryption"; + fullPath: "/admin/encryption"; + preLoaderRoute: typeof adminEncryptionPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/environment": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/environment"; + path: "/environment"; + fullPath: "/admin/environment"; + preLoaderRoute: typeof adminEnvironmentPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/integrations": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/integrations"; + path: "/integrations"; + fullPath: "/admin/integrations"; + preLoaderRoute: typeof adminIntegrationsPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/app-connections": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/app-connections"; + path: "/app-connections"; + fullPath: "/organization/app-connections"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/gateways": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/gateways"; + path: "/gateways"; + fullPath: "/organization/gateways"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing"; + path: "/secret-sharing"; + fullPath: "/organization/secret-sharing"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/settings": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/settings"; + path: "/settings"; + fullPath: "/organization/settings"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId": { + id: "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId"; + path: "/secret-manager/$projectId"; + fullPath: "/secret-manager/$projectId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/"; + path: "/"; + fullPath: "/organization/app-connections/"; + preLoaderRoute: typeof organizationAppConnectionsAppConnectionsPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/gateways/": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/gateways/"; + path: "/"; + fullPath: "/organization/gateways/"; + preLoaderRoute: typeof organizationGatewaysGatewayListPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/"; + path: "/"; + fullPath: "/organization/secret-sharing/"; + preLoaderRoute: typeof organizationSecretSharingPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/settings/": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/settings/"; + path: "/"; + fullPath: "/organization/settings/"; + preLoaderRoute: typeof organizationSettingsPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId"; + path: "/groups/$groupId"; + fullPath: "/organization/groups/$groupId"; + preLoaderRoute: typeof organizationGroupDetailsByIDPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId"; + path: "/identities/$identityId"; + fullPath: "/organization/identities/$identityId"; + preLoaderRoute: typeof organizationIdentityDetailsByIDPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId"; + path: "/members/$membershipId"; + fullPath: "/organization/members/$membershipId"; + preLoaderRoute: typeof organizationUserDetailsByIDPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId"; + path: "/roles/$roleId"; + fullPath: "/organization/roles/$roleId"; + preLoaderRoute: typeof organizationRoleByIDPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings"; + path: "/settings"; + fullPath: "/organization/secret-sharing/settings"; + preLoaderRoute: typeof organizationSecretSharingSettingsPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport; + }; + "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview": { + id: "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview"; + path: "/resources/overview"; + fullPath: "/admin/resources/overview"; + preLoaderRoute: typeof adminResourceOverviewPageRouteImport; + parentRoute: typeof adminLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId"; + path: "/projects/cert-management/$projectId"; + fullPath: "/projects/cert-management/$projectId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId"; + path: "/projects/kms/$projectId"; + fullPath: "/projects/kms/$projectId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId"; + path: "/projects/secret-management/$projectId"; + fullPath: "/projects/secret-management/$projectId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId"; + path: "/projects/secret-scanning/$projectId"; + fullPath: "/projects/secret-scanning/$projectId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId"; + path: "/projects/ssh/$projectId"; + fullPath: "/projects/ssh/$projectId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdImport; + parentRoute: typeof organizationLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval": { + id: "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval"; + path: "/approval"; + fullPath: "/secret-manager/$projectId/approval"; + preLoaderRoute: typeof secretManagerRedirectsRedirectApprovalPageImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback"; + path: "/oauth/callback"; + fullPath: "/organization/settings/oauth/callback"; + preLoaderRoute: typeof organizationSettingsPageOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback"; + path: "/azure-app-configuration/oauth2/callback"; + fullPath: "/integrations/azure-app-configuration/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback"; + path: "/azure-key-vault/oauth2/callback"; + fullPath: "/integrations/azure-key-vault/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback"; + path: "/bitbucket/oauth2/callback"; + fullPath: "/integrations/bitbucket/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteBitbucketOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback"; + path: "/gcp-secret-manager/oauth2/callback"; + fullPath: "/integrations/gcp-secret-manager/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteGcpOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback"; + path: "/github/oauth2/callback"; + fullPath: "/integrations/github/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteGithubOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback"; + path: "/gitlab/oauth2/callback"; + fullPath: "/integrations/gitlab/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteGitlabOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback"; + path: "/heroku/oauth2/callback"; + fullPath: "/integrations/heroku/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteHerokuOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback"; + path: "/netlify/oauth2/callback"; + fullPath: "/integrations/netlify/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteNetlifyOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback"; + path: "/vercel/oauth2/callback"; + fullPath: "/integrations/vercel/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsRouteVercelOauthRedirectImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout"; + path: ""; + fullPath: "/projects/cert-management/$projectId"; + preLoaderRoute: typeof certManagerLayoutImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout"; + path: ""; + fullPath: "/projects/kms/$projectId"; + preLoaderRoute: typeof kmsLayoutImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout"; + path: ""; + fullPath: "/projects/secret-management/$projectId"; + preLoaderRoute: typeof secretManagerLayoutImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout"; + path: ""; + fullPath: "/projects/secret-scanning/$projectId"; + preLoaderRoute: typeof secretScanningLayoutImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout"; + path: ""; + fullPath: "/projects/ssh/$projectId"; + preLoaderRoute: typeof sshLayoutImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback"; + path: "/$appConnection/oauth/callback"; + fullPath: "/organization/app-connections/$appConnection/oauth/callback"; + preLoaderRoute: typeof organizationAppConnectionsOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting"; + path: "/alerting"; + fullPath: "/projects/cert-management/$projectId/alerting"; + preLoaderRoute: typeof certManagerAlertingPageRouteImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities"; + path: "/certificate-authorities"; + fullPath: "/projects/cert-management/$projectId/certificate-authorities"; + preLoaderRoute: typeof certManagerCertificateAuthoritiesPageRouteImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates"; + path: "/certificates"; + fullPath: "/projects/cert-management/$projectId/certificates"; + preLoaderRoute: typeof certManagerCertificatesPageRouteImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings"; + path: "/settings"; + fullPath: "/projects/cert-management/$projectId/settings"; + preLoaderRoute: typeof certManagerSettingsPageRouteImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip"; + path: "/kmip"; + fullPath: "/projects/kms/$projectId/kmip"; + preLoaderRoute: typeof kmsKmipPageRouteImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview"; + path: "/overview"; + fullPath: "/projects/kms/$projectId/overview"; + preLoaderRoute: typeof kmsOverviewPageRouteImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings"; + path: "/settings"; + fullPath: "/projects/kms/$projectId/settings"; + preLoaderRoute: typeof kmsSettingsPageRouteImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist"; + path: "/allowlist"; + fullPath: "/projects/secret-management/$projectId/allowlist"; + preLoaderRoute: typeof secretManagerIPAllowlistPageRouteImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval"; + path: "/approval"; + fullPath: "/projects/secret-management/$projectId/approval"; + preLoaderRoute: typeof secretManagerSecretApprovalsPageRouteImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview"; + path: "/overview"; + fullPath: "/projects/secret-management/$projectId/overview"; + preLoaderRoute: typeof secretManagerOverviewPageRouteImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation"; + path: "/secret-rotation"; + fullPath: "/projects/secret-management/$projectId/secret-rotation"; + preLoaderRoute: typeof secretManagerSecretRotationPageRouteImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings"; + path: "/settings"; + fullPath: "/projects/secret-management/$projectId/settings"; + preLoaderRoute: typeof secretManagerSettingsPageRouteImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings"; + path: "/findings"; + fullPath: "/projects/secret-scanning/$projectId/findings"; + preLoaderRoute: typeof secretScanningSecretScanningFindingsPageRouteImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings"; + path: "/settings"; + fullPath: "/projects/secret-scanning/$projectId/settings"; + preLoaderRoute: typeof secretScanningSettingsPageRouteImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas"; + path: "/cas"; + fullPath: "/projects/ssh/$projectId/cas"; + preLoaderRoute: typeof sshSshCasPageRouteImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates"; + path: "/certificates"; + fullPath: "/projects/ssh/$projectId/certificates"; + preLoaderRoute: typeof sshSshCertsPageRouteImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview"; + path: "/overview"; + fullPath: "/projects/ssh/$projectId/overview"; + preLoaderRoute: typeof sshSshHostsPageRouteImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings"; + path: "/settings"; + fullPath: "/projects/ssh/$projectId/settings"; + preLoaderRoute: typeof sshSettingsPageRouteImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management"; + path: "/access-management"; + fullPath: "/projects/cert-management/$projectId/access-management"; + preLoaderRoute: typeof projectAccessControlPageRouteCertManagerImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs"; + path: "/audit-logs"; + fullPath: "/projects/cert-management/$projectId/audit-logs"; + preLoaderRoute: typeof projectAuditLogsPageRouteCertManagerImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates"; + path: "/certificate-templates"; + fullPath: "/projects/cert-management/$projectId/certificate-templates"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers"; + path: "/subscribers"; + fullPath: "/projects/cert-management/$projectId/subscribers"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management"; + path: "/access-management"; + fullPath: "/projects/kms/$projectId/access-management"; + preLoaderRoute: typeof projectAccessControlPageRouteKmsImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs"; + path: "/audit-logs"; + fullPath: "/projects/kms/$projectId/audit-logs"; + preLoaderRoute: typeof projectAuditLogsPageRouteKmsImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management"; + path: "/access-management"; + fullPath: "/projects/secret-management/$projectId/access-management"; + preLoaderRoute: typeof projectAccessControlPageRouteSecretManagerImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs"; + path: "/audit-logs"; + fullPath: "/projects/secret-management/$projectId/audit-logs"; + preLoaderRoute: typeof projectAuditLogsPageRouteSecretManagerImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations"; + path: "/integrations"; + fullPath: "/projects/secret-management/$projectId/integrations"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management"; + path: "/access-management"; + fullPath: "/projects/secret-scanning/$projectId/access-management"; + preLoaderRoute: typeof projectAccessControlPageRouteSecretScanningImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs"; + path: "/audit-logs"; + fullPath: "/projects/secret-scanning/$projectId/audit-logs"; + preLoaderRoute: typeof projectAuditLogsPageRouteSecretScanningImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources"; + path: "/data-sources"; + fullPath: "/projects/secret-scanning/$projectId/data-sources"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management"; + path: "/access-management"; + fullPath: "/projects/ssh/$projectId/access-management"; + preLoaderRoute: typeof projectAccessControlPageRouteSshImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs"; + path: "/audit-logs"; + fullPath: "/projects/ssh/$projectId/audit-logs"; + preLoaderRoute: typeof projectAuditLogsPageRouteSshImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/"; + path: "/"; + fullPath: "/projects/cert-management/$projectId/certificate-templates/"; + preLoaderRoute: typeof certManagerPkiTemplateListPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/"; + path: "/"; + fullPath: "/projects/cert-management/$projectId/subscribers/"; + preLoaderRoute: typeof certManagerPkiSubscribersPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/"; + path: "/"; + fullPath: "/projects/secret-management/$projectId/integrations/"; + preLoaderRoute: typeof secretManagerIntegrationsListPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/"; + path: "/"; + fullPath: "/projects/secret-scanning/$projectId/data-sources/"; + preLoaderRoute: typeof secretScanningSecretScanningDataSourcesPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName"; + path: "/ca/$caName"; + fullPath: "/projects/cert-management/$projectId/ca/$caName"; + preLoaderRoute: typeof certManagerCertAuthDetailsByIDPageRouteImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName"; + path: "/$subscriberName"; + fullPath: "/projects/cert-management/$projectId/subscribers/$subscriberName"; + preLoaderRoute: typeof certManagerPkiSubscriberDetailsByIDPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId"; + path: "/$integrationId"; + fullPath: "/projects/secret-management/$projectId/integrations/$integrationId"; + preLoaderRoute: typeof secretManagerIntegrationsDetailsByIDPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth"; + path: "/select-integration-auth"; + fullPath: "/projects/secret-management/$projectId/integrations/select-integration-auth"; + preLoaderRoute: typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug"; + path: "/secrets/$envSlug"; + fullPath: "/projects/secret-management/$projectId/secrets/$envSlug"; + preLoaderRoute: typeof secretManagerSecretDashboardPageRouteImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId"; + path: "/ca/$caId"; + fullPath: "/projects/ssh/$projectId/ca/$caId"; + preLoaderRoute: typeof sshSshCaByIDPageRouteImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId"; + path: "/ssh-host-groups/$sshHostGroupId"; + fullPath: "/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId"; + preLoaderRoute: typeof sshSshHostGroupDetailsByIDPageRouteImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId"; + path: "/groups/$groupId"; + fullPath: "/projects/cert-management/$projectId/groups/$groupId"; + preLoaderRoute: typeof projectGroupDetailsByIDPageRouteCertManagerImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId"; + path: "/identities/$identityId"; + fullPath: "/projects/cert-management/$projectId/identities/$identityId"; + preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteCertManagerImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId"; + path: "/members/$membershipId"; + fullPath: "/projects/cert-management/$projectId/members/$membershipId"; + preLoaderRoute: typeof projectMemberDetailsByIDPageRouteCertManagerImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId"; + path: "/pki-collections/$collectionId"; + fullPath: "/projects/cert-management/$projectId/pki-collections/$collectionId"; + preLoaderRoute: typeof certManagerPkiCollectionDetailsByIDPageRoutesImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug"; + path: "/roles/$roleSlug"; + fullPath: "/projects/cert-management/$projectId/roles/$roleSlug"; + preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteCertManagerImport; + parentRoute: typeof certManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId"; + path: "/groups/$groupId"; + fullPath: "/projects/kms/$projectId/groups/$groupId"; + preLoaderRoute: typeof projectGroupDetailsByIDPageRouteKmsImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId"; + path: "/identities/$identityId"; + fullPath: "/projects/kms/$projectId/identities/$identityId"; + preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteKmsImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId"; + path: "/members/$membershipId"; + fullPath: "/projects/kms/$projectId/members/$membershipId"; + preLoaderRoute: typeof projectMemberDetailsByIDPageRouteKmsImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug"; + path: "/roles/$roleSlug"; + fullPath: "/projects/kms/$projectId/roles/$roleSlug"; + preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteKmsImport; + parentRoute: typeof kmsLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId"; + path: "/groups/$groupId"; + fullPath: "/projects/secret-management/$projectId/groups/$groupId"; + preLoaderRoute: typeof projectGroupDetailsByIDPageRouteSecretManagerImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId"; + path: "/identities/$identityId"; + fullPath: "/projects/secret-management/$projectId/identities/$identityId"; + preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteSecretManagerImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId"; + path: "/members/$membershipId"; + fullPath: "/projects/secret-management/$projectId/members/$membershipId"; + preLoaderRoute: typeof projectMemberDetailsByIDPageRouteSecretManagerImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug"; + path: "/roles/$roleSlug"; + fullPath: "/projects/secret-management/$projectId/roles/$roleSlug"; + preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteSecretManagerImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId"; + path: "/groups/$groupId"; + fullPath: "/projects/secret-scanning/$projectId/groups/$groupId"; + preLoaderRoute: typeof projectGroupDetailsByIDPageRouteSecretScanningImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId"; + path: "/identities/$identityId"; + fullPath: "/projects/secret-scanning/$projectId/identities/$identityId"; + preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteSecretScanningImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId"; + path: "/members/$membershipId"; + fullPath: "/projects/secret-scanning/$projectId/members/$membershipId"; + preLoaderRoute: typeof projectMemberDetailsByIDPageRouteSecretScanningImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug"; + path: "/roles/$roleSlug"; + fullPath: "/projects/secret-scanning/$projectId/roles/$roleSlug"; + preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteSecretScanningImport; + parentRoute: typeof secretScanningLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId"; + path: "/groups/$groupId"; + fullPath: "/projects/ssh/$projectId/groups/$groupId"; + preLoaderRoute: typeof projectGroupDetailsByIDPageRouteSshImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId"; + path: "/identities/$identityId"; + fullPath: "/projects/ssh/$projectId/identities/$identityId"; + preLoaderRoute: typeof projectIdentityDetailsByIDPageRouteSshImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId"; + path: "/members/$membershipId"; + fullPath: "/projects/ssh/$projectId/members/$membershipId"; + preLoaderRoute: typeof projectMemberDetailsByIDPageRouteSshImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug"; + path: "/roles/$roleSlug"; + fullPath: "/projects/ssh/$projectId/roles/$roleSlug"; + preLoaderRoute: typeof projectRoleDetailsBySlugPageRouteSshImport; + parentRoute: typeof sshLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize"; + path: "/aws-parameter-store/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create"; + path: "/aws-parameter-store/create"; + fullPath: "/projects/secret-management/$projectId/integrations/aws-parameter-store/create"; + preLoaderRoute: typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize"; + path: "/aws-secret-manager/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create"; + path: "/aws-secret-manager/create"; + fullPath: "/projects/secret-management/$projectId/integrations/aws-secret-manager/create"; + preLoaderRoute: typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create"; + path: "/azure-app-configuration/create"; + fullPath: "/projects/secret-management/$projectId/integrations/azure-app-configuration/create"; + preLoaderRoute: typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize"; + path: "/azure-devops/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/azure-devops/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create"; + path: "/azure-devops/create"; + fullPath: "/projects/secret-management/$projectId/integrations/azure-devops/create"; + preLoaderRoute: typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize"; + path: "/azure-key-vault/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create"; + path: "/azure-key-vault/create"; + fullPath: "/projects/secret-management/$projectId/integrations/azure-key-vault/create"; + preLoaderRoute: typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create"; + path: "/bitbucket/create"; + fullPath: "/projects/secret-management/$projectId/integrations/bitbucket/create"; + preLoaderRoute: typeof secretManagerIntegrationsBitbucketConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize"; + path: "/checkly/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/checkly/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsChecklyAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create"; + path: "/checkly/create"; + fullPath: "/projects/secret-management/$projectId/integrations/checkly/create"; + preLoaderRoute: typeof secretManagerIntegrationsChecklyConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize"; + path: "/circleci/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/circleci/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsCircleCIAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create"; + path: "/circleci/create"; + fullPath: "/projects/secret-management/$projectId/integrations/circleci/create"; + preLoaderRoute: typeof secretManagerIntegrationsCircleCIConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize"; + path: "/cloud-66/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/cloud-66/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsCloud66AuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create"; + path: "/cloud-66/create"; + fullPath: "/projects/secret-management/$projectId/integrations/cloud-66/create"; + preLoaderRoute: typeof secretManagerIntegrationsCloud66ConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize"; + path: "/cloudflare-pages/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create"; + path: "/cloudflare-pages/create"; + fullPath: "/projects/secret-management/$projectId/integrations/cloudflare-pages/create"; + preLoaderRoute: typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize"; + path: "/cloudflare-workers/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create"; + path: "/cloudflare-workers/create"; + fullPath: "/projects/secret-management/$projectId/integrations/cloudflare-workers/create"; + preLoaderRoute: typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize"; + path: "/codefresh/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/codefresh/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsCodefreshAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create"; + path: "/codefresh/create"; + fullPath: "/projects/secret-management/$projectId/integrations/codefresh/create"; + preLoaderRoute: typeof secretManagerIntegrationsCodefreshConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize"; + path: "/databricks/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/databricks/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsDatabricksAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create"; + path: "/databricks/create"; + fullPath: "/projects/secret-management/$projectId/integrations/databricks/create"; + preLoaderRoute: typeof secretManagerIntegrationsDatabricksConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize"; + path: "/digital-ocean-app-platform/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create"; + path: "/digital-ocean-app-platform/create"; + fullPath: "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create"; + preLoaderRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize"; + path: "/flyio/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/flyio/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsFlyioAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create"; + path: "/flyio/create"; + fullPath: "/projects/secret-management/$projectId/integrations/flyio/create"; + preLoaderRoute: typeof secretManagerIntegrationsFlyioConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize"; + path: "/gcp-secret-manager/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create"; + path: "/gcp-secret-manager/create"; + fullPath: "/projects/secret-management/$projectId/integrations/gcp-secret-manager/create"; + preLoaderRoute: typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection"; + path: "/github/auth-mode-selection"; + fullPath: "/projects/secret-management/$projectId/integrations/github/auth-mode-selection"; + preLoaderRoute: typeof secretManagerIntegrationsGithubAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create"; + path: "/github/create"; + fullPath: "/projects/secret-management/$projectId/integrations/github/create"; + preLoaderRoute: typeof secretManagerIntegrationsGithubConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize"; + path: "/gitlab/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/gitlab/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsGitlabAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create"; + path: "/gitlab/create"; + fullPath: "/projects/secret-management/$projectId/integrations/gitlab/create"; + preLoaderRoute: typeof secretManagerIntegrationsGitlabConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize"; + path: "/hashicorp-vault/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create"; + path: "/hashicorp-vault/create"; + fullPath: "/projects/secret-management/$projectId/integrations/hashicorp-vault/create"; + preLoaderRoute: typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize"; + path: "/hasura-cloud/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/hasura-cloud/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create"; + path: "/hasura-cloud/create"; + fullPath: "/projects/secret-management/$projectId/integrations/hasura-cloud/create"; + preLoaderRoute: typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create"; + path: "/heroku/create"; + fullPath: "/projects/secret-management/$projectId/integrations/heroku/create"; + preLoaderRoute: typeof secretManagerIntegrationsHerokuConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize"; + path: "/laravel-forge/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/laravel-forge/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create"; + path: "/laravel-forge/create"; + fullPath: "/projects/secret-management/$projectId/integrations/laravel-forge/create"; + preLoaderRoute: typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create"; + path: "/netlify/create"; + fullPath: "/projects/secret-management/$projectId/integrations/netlify/create"; + preLoaderRoute: typeof secretManagerIntegrationsNetlifyConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize"; + path: "/northflank/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/northflank/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsNorthflankAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create"; + path: "/northflank/create"; + fullPath: "/projects/secret-management/$projectId/integrations/northflank/create"; + preLoaderRoute: typeof secretManagerIntegrationsNorthflankConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize"; + path: "/octopus-deploy/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/octopus-deploy/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create"; + path: "/octopus-deploy/create"; + fullPath: "/projects/secret-management/$projectId/integrations/octopus-deploy/create"; + preLoaderRoute: typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize"; + path: "/qovery/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/qovery/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsQoveryAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create"; + path: "/qovery/create"; + fullPath: "/projects/secret-management/$projectId/integrations/qovery/create"; + preLoaderRoute: typeof secretManagerIntegrationsQoveryConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize"; + path: "/railway/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/railway/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsRailwayAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create"; + path: "/railway/create"; + fullPath: "/projects/secret-management/$projectId/integrations/railway/create"; + preLoaderRoute: typeof secretManagerIntegrationsRailwayConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize"; + path: "/render/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/render/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsRenderAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create"; + path: "/render/create"; + fullPath: "/projects/secret-management/$projectId/integrations/render/create"; + preLoaderRoute: typeof secretManagerIntegrationsRenderConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize"; + path: "/rundeck/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/rundeck/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsRundeckAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create"; + path: "/rundeck/create"; + fullPath: "/projects/secret-management/$projectId/integrations/rundeck/create"; + preLoaderRoute: typeof secretManagerIntegrationsRundeckConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize"; + path: "/supabase/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/supabase/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsSupabaseAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create"; + path: "/supabase/create"; + fullPath: "/projects/secret-management/$projectId/integrations/supabase/create"; + preLoaderRoute: typeof secretManagerIntegrationsSupabaseConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize"; + path: "/teamcity/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/teamcity/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsTeamcityAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create"; + path: "/teamcity/create"; + fullPath: "/projects/secret-management/$projectId/integrations/teamcity/create"; + preLoaderRoute: typeof secretManagerIntegrationsTeamcityConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize"; + path: "/terraform-cloud/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/terraform-cloud/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create"; + path: "/terraform-cloud/create"; + fullPath: "/projects/secret-management/$projectId/integrations/terraform-cloud/create"; + preLoaderRoute: typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize"; + path: "/travisci/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/travisci/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsTravisCIAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create"; + path: "/travisci/create"; + fullPath: "/projects/secret-management/$projectId/integrations/travisci/create"; + preLoaderRoute: typeof secretManagerIntegrationsTravisCIConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create"; + path: "/vercel/create"; + fullPath: "/projects/secret-management/$projectId/integrations/vercel/create"; + preLoaderRoute: typeof secretManagerIntegrationsVercelConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize"; + path: "/windmill/authorize"; + fullPath: "/projects/secret-management/$projectId/integrations/windmill/authorize"; + preLoaderRoute: typeof secretManagerIntegrationsWindmillAuthorizePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create"; + path: "/windmill/create"; + fullPath: "/projects/secret-management/$projectId/integrations/windmill/create"; + preLoaderRoute: typeof secretManagerIntegrationsWindmillConfigurePageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId"; + path: "/$type/$dataSourceId"; + fullPath: "/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId"; + preLoaderRoute: typeof secretScanningSecretScanningDataSourceByIdPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId"; + path: "/commits/$environment/$folderId"; + fullPath: "/projects/secret-management/$projectId/commits/$environment/$folderId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdImport; + parentRoute: typeof secretManagerLayoutImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/"; + path: "/"; + fullPath: "/projects/secret-management/$projectId/commits/$environment/$folderId/"; + preLoaderRoute: typeof secretManagerCommitsPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback"; + path: "/azure-app-configuration/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback"; + path: "/azure-key-vault/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback"; + path: "/bitbucket/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback"; + path: "/gcp-secret-manager/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback"; + path: "/github/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/github/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsGithubOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback"; + path: "/gitlab/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback"; + path: "/heroku/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/heroku/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback"; + path: "/netlify/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/netlify/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId"; + path: "/secret-syncs/$destination/$syncId"; + fullPath: "/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId"; + preLoaderRoute: typeof secretManagerSecretSyncDetailsByIDPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback"; + path: "/vercel/oauth2/callback"; + fullPath: "/projects/secret-management/$projectId/integrations/vercel/oauth2/callback"; + preLoaderRoute: typeof secretManagerIntegrationsVercelOauthCallbackPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId"; + path: "/$commitId"; + fullPath: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId"; + preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/"; + path: "/"; + fullPath: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/"; + preLoaderRoute: typeof secretManagerCommitDetailsPageRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdImport; + }; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore": { + id: "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore"; + path: "/restore"; + fullPath: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore"; + preLoaderRoute: typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteImport; + parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdImport; + }; } } // Create and export the route tree interface AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteChildren { - secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute: typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute - secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute: typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute - secretManagerIntegrationsRouteBitbucketOauthRedirectRoute: typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute - secretManagerIntegrationsRouteGcpOauthRedirectRoute: typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute - secretManagerIntegrationsRouteGithubOauthRedirectRoute: typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute - secretManagerIntegrationsRouteGitlabOauthRedirectRoute: typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute - secretManagerIntegrationsRouteHerokuOauthRedirectRoute: typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute - secretManagerIntegrationsRouteNetlifyOauthRedirectRoute: typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute - secretManagerIntegrationsRouteVercelOauthRedirectRoute: typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute + secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute: typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute; + secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute: typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute; + secretManagerIntegrationsRouteBitbucketOauthRedirectRoute: typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute; + secretManagerIntegrationsRouteGcpOauthRedirectRoute: typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute; + secretManagerIntegrationsRouteGithubOauthRedirectRoute: typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute; + secretManagerIntegrationsRouteGitlabOauthRedirectRoute: typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute; + secretManagerIntegrationsRouteHerokuOauthRedirectRoute: typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute; + secretManagerIntegrationsRouteNetlifyOauthRedirectRoute: typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute; + secretManagerIntegrationsRouteVercelOauthRedirectRoute: typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute; } const AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteChildren = @@ -3663,17 +3543,17 @@ const AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteChildren: Authentica secretManagerIntegrationsRouteNetlifyOauthRedirectRoute: secretManagerIntegrationsRouteNetlifyOauthRedirectRoute, secretManagerIntegrationsRouteVercelOauthRedirectRoute: - secretManagerIntegrationsRouteVercelOauthRedirectRoute, - } + secretManagerIntegrationsRouteVercelOauthRedirectRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteChildren { - organizationAppConnectionsAppConnectionsPageRouteRoute: typeof organizationAppConnectionsAppConnectionsPageRouteRoute - organizationAppConnectionsOauthCallbackPageRouteRoute: typeof organizationAppConnectionsOauthCallbackPageRouteRoute + organizationAppConnectionsAppConnectionsPageRouteRoute: typeof organizationAppConnectionsAppConnectionsPageRouteRoute; + organizationAppConnectionsOauthCallbackPageRouteRoute: typeof organizationAppConnectionsOauthCallbackPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteChildren = @@ -3681,83 +3561,79 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteChildr organizationAppConnectionsAppConnectionsPageRouteRoute: organizationAppConnectionsAppConnectionsPageRouteRoute, organizationAppConnectionsOauthCallbackPageRouteRoute: - organizationAppConnectionsOauthCallbackPageRouteRoute, - } + organizationAppConnectionsOauthCallbackPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren { - organizationGatewaysGatewayListPageRouteRoute: typeof organizationGatewaysGatewayListPageRouteRoute + organizationGatewaysGatewayListPageRouteRoute: typeof organizationGatewaysGatewayListPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren = { - organizationGatewaysGatewayListPageRouteRoute: - organizationGatewaysGatewayListPageRouteRoute, - } + organizationGatewaysGatewayListPageRouteRoute: organizationGatewaysGatewayListPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren { - organizationSecretSharingPageRouteRoute: typeof organizationSecretSharingPageRouteRoute - organizationSecretSharingSettingsPageRouteRoute: typeof organizationSecretSharingSettingsPageRouteRoute + organizationSecretSharingPageRouteRoute: typeof organizationSecretSharingPageRouteRoute; + organizationSecretSharingSettingsPageRouteRoute: typeof organizationSecretSharingSettingsPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren = { - organizationSecretSharingPageRouteRoute: - organizationSecretSharingPageRouteRoute, - organizationSecretSharingSettingsPageRouteRoute: - organizationSecretSharingSettingsPageRouteRoute, - } + organizationSecretSharingPageRouteRoute: organizationSecretSharingPageRouteRoute, + organizationSecretSharingSettingsPageRouteRoute: organizationSecretSharingSettingsPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteChildren { - organizationSettingsPageRouteRoute: typeof organizationSettingsPageRouteRoute - organizationSettingsPageOauthCallbackPageRouteRoute: typeof organizationSettingsPageOauthCallbackPageRouteRoute + organizationSettingsPageRouteRoute: typeof organizationSettingsPageRouteRoute; + organizationSettingsPageOauthCallbackPageRouteRoute: typeof organizationSettingsPageOauthCallbackPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteChildren = { organizationSettingsPageRouteRoute: organizationSettingsPageRouteRoute, organizationSettingsPageOauthCallbackPageRouteRoute: - organizationSettingsPageOauthCallbackPageRouteRoute, - } + organizationSettingsPageOauthCallbackPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren { - organizationAccessManagementPageRouteRoute: typeof organizationAccessManagementPageRouteRoute - organizationAuditLogsPageRouteRoute: typeof organizationAuditLogsPageRouteRoute - organizationBillingPageRouteRoute: typeof organizationBillingPageRouteRoute - organizationProjectsPageRouteRoute: typeof organizationProjectsPageRouteRoute - AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren - organizationGroupDetailsByIDPageRouteRoute: typeof organizationGroupDetailsByIDPageRouteRoute - organizationIdentityDetailsByIDPageRouteRoute: typeof organizationIdentityDetailsByIDPageRouteRoute - organizationUserDetailsByIDPageRouteRoute: typeof organizationUserDetailsByIDPageRouteRoute - organizationRoleByIDPageRouteRoute: typeof organizationRoleByIDPageRouteRoute + organizationAccessManagementPageRouteRoute: typeof organizationAccessManagementPageRouteRoute; + organizationAuditLogsPageRouteRoute: typeof organizationAuditLogsPageRouteRoute; + organizationBillingPageRouteRoute: typeof organizationBillingPageRouteRoute; + organizationProjectsPageRouteRoute: typeof organizationProjectsPageRouteRoute; + AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren; + organizationGroupDetailsByIDPageRouteRoute: typeof organizationGroupDetailsByIDPageRouteRoute; + organizationIdentityDetailsByIDPageRouteRoute: typeof organizationIdentityDetailsByIDPageRouteRoute; + organizationUserDetailsByIDPageRouteRoute: typeof organizationUserDetailsByIDPageRouteRoute; + organizationRoleByIDPageRouteRoute: typeof organizationRoleByIDPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren = { - organizationAccessManagementPageRouteRoute: - organizationAccessManagementPageRouteRoute, + organizationAccessManagementPageRouteRoute: organizationAccessManagementPageRouteRoute, organizationAuditLogsPageRouteRoute: organizationAuditLogsPageRouteRoute, organizationBillingPageRouteRoute: organizationBillingPageRouteRoute, organizationProjectsPageRouteRoute: organizationProjectsPageRouteRoute, @@ -3769,101 +3645,91 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren: Authentica AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren, AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute: AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren, - organizationGroupDetailsByIDPageRouteRoute: - organizationGroupDetailsByIDPageRouteRoute, - organizationIdentityDetailsByIDPageRouteRoute: - organizationIdentityDetailsByIDPageRouteRoute, - organizationUserDetailsByIDPageRouteRoute: - organizationUserDetailsByIDPageRouteRoute, - organizationRoleByIDPageRouteRoute: organizationRoleByIDPageRouteRoute, - } + organizationGroupDetailsByIDPageRouteRoute: organizationGroupDetailsByIDPageRouteRoute, + organizationIdentityDetailsByIDPageRouteRoute: organizationIdentityDetailsByIDPageRouteRoute, + organizationUserDetailsByIDPageRouteRoute: organizationUserDetailsByIDPageRouteRoute, + organizationRoleByIDPageRouteRoute: organizationRoleByIDPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteChildren { - secretManagerRedirectsRedirectApprovalPageRoute: typeof secretManagerRedirectsRedirectApprovalPageRoute + secretManagerRedirectsRedirectApprovalPageRoute: typeof secretManagerRedirectsRedirectApprovalPageRoute; } const AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteChildren = { - secretManagerRedirectsRedirectApprovalPageRoute: - secretManagerRedirectsRedirectApprovalPageRoute, - } + secretManagerRedirectsRedirectApprovalPageRoute: secretManagerRedirectsRedirectApprovalPageRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteChildren { - certManagerPkiTemplateListPageRouteRoute: typeof certManagerPkiTemplateListPageRouteRoute + certManagerPkiTemplateListPageRouteRoute: typeof certManagerPkiTemplateListPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteChildren = { - certManagerPkiTemplateListPageRouteRoute: - certManagerPkiTemplateListPageRouteRoute, - } + certManagerPkiTemplateListPageRouteRoute: certManagerPkiTemplateListPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteChildren { - certManagerPkiSubscribersPageRouteRoute: typeof certManagerPkiSubscribersPageRouteRoute - certManagerPkiSubscriberDetailsByIDPageRouteRoute: typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute + certManagerPkiSubscribersPageRouteRoute: typeof certManagerPkiSubscribersPageRouteRoute; + certManagerPkiSubscriberDetailsByIDPageRouteRoute: typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteChildren = { - certManagerPkiSubscribersPageRouteRoute: - certManagerPkiSubscribersPageRouteRoute, + certManagerPkiSubscribersPageRouteRoute: certManagerPkiSubscribersPageRouteRoute, certManagerPkiSubscriberDetailsByIDPageRouteRoute: - certManagerPkiSubscriberDetailsByIDPageRouteRoute, - } + certManagerPkiSubscriberDetailsByIDPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteChildren + ); interface certManagerLayoutRouteChildren { - certManagerAlertingPageRouteRoute: typeof certManagerAlertingPageRouteRoute - certManagerCertificateAuthoritiesPageRouteRoute: typeof certManagerCertificateAuthoritiesPageRouteRoute - certManagerCertificatesPageRouteRoute: typeof certManagerCertificatesPageRouteRoute - certManagerSettingsPageRouteRoute: typeof certManagerSettingsPageRouteRoute - projectAccessControlPageRouteCertManagerRoute: typeof projectAccessControlPageRouteCertManagerRoute - projectAuditLogsPageRouteCertManagerRoute: typeof projectAuditLogsPageRouteCertManagerRoute - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren - certManagerCertAuthDetailsByIDPageRouteRoute: typeof certManagerCertAuthDetailsByIDPageRouteRoute - projectGroupDetailsByIDPageRouteCertManagerRoute: typeof projectGroupDetailsByIDPageRouteCertManagerRoute - projectIdentityDetailsByIDPageRouteCertManagerRoute: typeof projectIdentityDetailsByIDPageRouteCertManagerRoute - projectMemberDetailsByIDPageRouteCertManagerRoute: typeof projectMemberDetailsByIDPageRouteCertManagerRoute - certManagerPkiCollectionDetailsByIDPageRoutesRoute: typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute - projectRoleDetailsBySlugPageRouteCertManagerRoute: typeof projectRoleDetailsBySlugPageRouteCertManagerRoute + certManagerAlertingPageRouteRoute: typeof certManagerAlertingPageRouteRoute; + certManagerCertificateAuthoritiesPageRouteRoute: typeof certManagerCertificateAuthoritiesPageRouteRoute; + certManagerCertificatesPageRouteRoute: typeof certManagerCertificatesPageRouteRoute; + certManagerSettingsPageRouteRoute: typeof certManagerSettingsPageRouteRoute; + projectAccessControlPageRouteCertManagerRoute: typeof projectAccessControlPageRouteCertManagerRoute; + projectAuditLogsPageRouteCertManagerRoute: typeof projectAuditLogsPageRouteCertManagerRoute; + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren; + certManagerCertAuthDetailsByIDPageRouteRoute: typeof certManagerCertAuthDetailsByIDPageRouteRoute; + projectGroupDetailsByIDPageRouteCertManagerRoute: typeof projectGroupDetailsByIDPageRouteCertManagerRoute; + projectIdentityDetailsByIDPageRouteCertManagerRoute: typeof projectIdentityDetailsByIDPageRouteCertManagerRoute; + projectMemberDetailsByIDPageRouteCertManagerRoute: typeof projectMemberDetailsByIDPageRouteCertManagerRoute; + certManagerPkiCollectionDetailsByIDPageRoutesRoute: typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute; + projectRoleDetailsBySlugPageRouteCertManagerRoute: typeof projectRoleDetailsBySlugPageRouteCertManagerRoute; } const certManagerLayoutRouteChildren: certManagerLayoutRouteChildren = { certManagerAlertingPageRouteRoute: certManagerAlertingPageRouteRoute, - certManagerCertificateAuthoritiesPageRouteRoute: - certManagerCertificateAuthoritiesPageRouteRoute, + certManagerCertificateAuthoritiesPageRouteRoute: certManagerCertificateAuthoritiesPageRouteRoute, certManagerCertificatesPageRouteRoute: certManagerCertificatesPageRouteRoute, certManagerSettingsPageRouteRoute: certManagerSettingsPageRouteRoute, - projectAccessControlPageRouteCertManagerRoute: - projectAccessControlPageRouteCertManagerRoute, - projectAuditLogsPageRouteCertManagerRoute: - projectAuditLogsPageRouteCertManagerRoute, + projectAccessControlPageRouteCertManagerRoute: projectAccessControlPageRouteCertManagerRoute, + projectAuditLogsPageRouteCertManagerRoute: projectAuditLogsPageRouteCertManagerRoute, AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRoute: AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren, AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRoute: AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren, - certManagerCertAuthDetailsByIDPageRouteRoute: - certManagerCertAuthDetailsByIDPageRouteRoute, + certManagerCertAuthDetailsByIDPageRouteRoute: certManagerCertAuthDetailsByIDPageRouteRoute, projectGroupDetailsByIDPageRouteCertManagerRoute: projectGroupDetailsByIDPageRouteCertManagerRoute, projectIdentityDetailsByIDPageRouteCertManagerRoute: @@ -3873,36 +3739,37 @@ const certManagerLayoutRouteChildren: certManagerLayoutRouteChildren = { certManagerPkiCollectionDetailsByIDPageRoutesRoute: certManagerPkiCollectionDetailsByIDPageRoutesRoute, projectRoleDetailsBySlugPageRouteCertManagerRoute: - projectRoleDetailsBySlugPageRouteCertManagerRoute, -} + projectRoleDetailsBySlugPageRouteCertManagerRoute +}; -const certManagerLayoutRouteWithChildren = - certManagerLayoutRoute._addFileChildren(certManagerLayoutRouteChildren) +const certManagerLayoutRouteWithChildren = certManagerLayoutRoute._addFileChildren( + certManagerLayoutRouteChildren +); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteChildren { - certManagerLayoutRoute: typeof certManagerLayoutRouteWithChildren + certManagerLayoutRoute: typeof certManagerLayoutRouteWithChildren; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteChildren = { - certManagerLayoutRoute: certManagerLayoutRouteWithChildren, - } + certManagerLayoutRoute: certManagerLayoutRouteWithChildren + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteChildren + ); interface kmsLayoutRouteChildren { - kmsKmipPageRouteRoute: typeof kmsKmipPageRouteRoute - kmsOverviewPageRouteRoute: typeof kmsOverviewPageRouteRoute - kmsSettingsPageRouteRoute: typeof kmsSettingsPageRouteRoute - projectAccessControlPageRouteKmsRoute: typeof projectAccessControlPageRouteKmsRoute - projectAuditLogsPageRouteKmsRoute: typeof projectAuditLogsPageRouteKmsRoute - projectGroupDetailsByIDPageRouteKmsRoute: typeof projectGroupDetailsByIDPageRouteKmsRoute - projectIdentityDetailsByIDPageRouteKmsRoute: typeof projectIdentityDetailsByIDPageRouteKmsRoute - projectMemberDetailsByIDPageRouteKmsRoute: typeof projectMemberDetailsByIDPageRouteKmsRoute - projectRoleDetailsBySlugPageRouteKmsRoute: typeof projectRoleDetailsBySlugPageRouteKmsRoute + kmsKmipPageRouteRoute: typeof kmsKmipPageRouteRoute; + kmsOverviewPageRouteRoute: typeof kmsOverviewPageRouteRoute; + kmsSettingsPageRouteRoute: typeof kmsSettingsPageRouteRoute; + projectAccessControlPageRouteKmsRoute: typeof projectAccessControlPageRouteKmsRoute; + projectAuditLogsPageRouteKmsRoute: typeof projectAuditLogsPageRouteKmsRoute; + projectGroupDetailsByIDPageRouteKmsRoute: typeof projectGroupDetailsByIDPageRouteKmsRoute; + projectIdentityDetailsByIDPageRouteKmsRoute: typeof projectIdentityDetailsByIDPageRouteKmsRoute; + projectMemberDetailsByIDPageRouteKmsRoute: typeof projectMemberDetailsByIDPageRouteKmsRoute; + projectRoleDetailsBySlugPageRouteKmsRoute: typeof projectRoleDetailsBySlugPageRouteKmsRoute; } const kmsLayoutRouteChildren: kmsLayoutRouteChildren = { @@ -3911,119 +3778,112 @@ const kmsLayoutRouteChildren: kmsLayoutRouteChildren = { kmsSettingsPageRouteRoute: kmsSettingsPageRouteRoute, projectAccessControlPageRouteKmsRoute: projectAccessControlPageRouteKmsRoute, projectAuditLogsPageRouteKmsRoute: projectAuditLogsPageRouteKmsRoute, - projectGroupDetailsByIDPageRouteKmsRoute: - projectGroupDetailsByIDPageRouteKmsRoute, - projectIdentityDetailsByIDPageRouteKmsRoute: - projectIdentityDetailsByIDPageRouteKmsRoute, - projectMemberDetailsByIDPageRouteKmsRoute: - projectMemberDetailsByIDPageRouteKmsRoute, - projectRoleDetailsBySlugPageRouteKmsRoute: - projectRoleDetailsBySlugPageRouteKmsRoute, -} + projectGroupDetailsByIDPageRouteKmsRoute: projectGroupDetailsByIDPageRouteKmsRoute, + projectIdentityDetailsByIDPageRouteKmsRoute: projectIdentityDetailsByIDPageRouteKmsRoute, + projectMemberDetailsByIDPageRouteKmsRoute: projectMemberDetailsByIDPageRouteKmsRoute, + projectRoleDetailsBySlugPageRouteKmsRoute: projectRoleDetailsBySlugPageRouteKmsRoute +}; -const kmsLayoutRouteWithChildren = kmsLayoutRoute._addFileChildren( - kmsLayoutRouteChildren, -) +const kmsLayoutRouteWithChildren = kmsLayoutRoute._addFileChildren(kmsLayoutRouteChildren); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteChildren { - kmsLayoutRoute: typeof kmsLayoutRouteWithChildren + kmsLayoutRoute: typeof kmsLayoutRouteWithChildren; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteChildren = { - kmsLayoutRoute: kmsLayoutRouteWithChildren, - } + kmsLayoutRoute: kmsLayoutRouteWithChildren + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteChildren { - secretManagerIntegrationsListPageRouteRoute: typeof secretManagerIntegrationsListPageRouteRoute - secretManagerIntegrationsDetailsByIDPageRouteRoute: typeof secretManagerIntegrationsDetailsByIDPageRouteRoute - secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute: typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute - secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute: typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute - secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute: typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute - secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute: typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute - secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute: typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute - secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute - secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute: typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute - secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute - secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute - secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute - secretManagerIntegrationsBitbucketConfigurePageRouteRoute: typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute - secretManagerIntegrationsChecklyAuthorizePageRouteRoute: typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute - secretManagerIntegrationsChecklyConfigurePageRouteRoute: typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute - secretManagerIntegrationsCircleCIAuthorizePageRouteRoute: typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute - secretManagerIntegrationsCircleCIConfigurePageRouteRoute: typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute - secretManagerIntegrationsCloud66AuthorizePageRouteRoute: typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute - secretManagerIntegrationsCloud66ConfigurePageRouteRoute: typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute - secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute: typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute - secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute: typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute - secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute: typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute - secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute: typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute - secretManagerIntegrationsCodefreshAuthorizePageRouteRoute: typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute - secretManagerIntegrationsCodefreshConfigurePageRouteRoute: typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute - secretManagerIntegrationsDatabricksAuthorizePageRouteRoute: typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute - secretManagerIntegrationsDatabricksConfigurePageRouteRoute: typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute - secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute - secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute - secretManagerIntegrationsFlyioAuthorizePageRouteRoute: typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute - secretManagerIntegrationsFlyioConfigurePageRouteRoute: typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute - secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute: typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute - secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute: typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute - secretManagerIntegrationsGithubAuthorizePageRouteRoute: typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute - secretManagerIntegrationsGithubConfigurePageRouteRoute: typeof secretManagerIntegrationsGithubConfigurePageRouteRoute - secretManagerIntegrationsGitlabAuthorizePageRouteRoute: typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute - secretManagerIntegrationsGitlabConfigurePageRouteRoute: typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute - secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute: typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute - secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute: typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute - secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute: typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute - secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute: typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute - secretManagerIntegrationsHerokuConfigurePageRouteRoute: typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute - secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute: typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute - secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute: typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute - secretManagerIntegrationsNetlifyConfigurePageRouteRoute: typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute - secretManagerIntegrationsNorthflankAuthorizePageRouteRoute: typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute - secretManagerIntegrationsNorthflankConfigurePageRouteRoute: typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute - secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute: typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute - secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute: typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute - secretManagerIntegrationsQoveryAuthorizePageRouteRoute: typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute - secretManagerIntegrationsQoveryConfigurePageRouteRoute: typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute - secretManagerIntegrationsRailwayAuthorizePageRouteRoute: typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute - secretManagerIntegrationsRailwayConfigurePageRouteRoute: typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute - secretManagerIntegrationsRenderAuthorizePageRouteRoute: typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute - secretManagerIntegrationsRenderConfigurePageRouteRoute: typeof secretManagerIntegrationsRenderConfigurePageRouteRoute - secretManagerIntegrationsRundeckAuthorizePageRouteRoute: typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute - secretManagerIntegrationsRundeckConfigurePageRouteRoute: typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute - secretManagerIntegrationsSupabaseAuthorizePageRouteRoute: typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute - secretManagerIntegrationsSupabaseConfigurePageRouteRoute: typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute - secretManagerIntegrationsTeamcityAuthorizePageRouteRoute: typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute - secretManagerIntegrationsTeamcityConfigurePageRouteRoute: typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute - secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute: typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute - secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute: typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute - secretManagerIntegrationsTravisCIAuthorizePageRouteRoute: typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute - secretManagerIntegrationsTravisCIConfigurePageRouteRoute: typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute - secretManagerIntegrationsVercelConfigurePageRouteRoute: typeof secretManagerIntegrationsVercelConfigurePageRouteRoute - secretManagerIntegrationsWindmillAuthorizePageRouteRoute: typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute - secretManagerIntegrationsWindmillConfigurePageRouteRoute: typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute - secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute - secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute - secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute - secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute - secretManagerIntegrationsGithubOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute - secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute - secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute - secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute - secretManagerSecretSyncDetailsByIDPageRouteRoute: typeof secretManagerSecretSyncDetailsByIDPageRouteRoute - secretManagerIntegrationsVercelOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute + secretManagerIntegrationsListPageRouteRoute: typeof secretManagerIntegrationsListPageRouteRoute; + secretManagerIntegrationsDetailsByIDPageRouteRoute: typeof secretManagerIntegrationsDetailsByIDPageRouteRoute; + secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute: typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute; + secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute: typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute; + secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute: typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute; + secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute: typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute; + secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute: typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute; + secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute; + secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute: typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute; + secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute; + secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute; + secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute; + secretManagerIntegrationsBitbucketConfigurePageRouteRoute: typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute; + secretManagerIntegrationsChecklyAuthorizePageRouteRoute: typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute; + secretManagerIntegrationsChecklyConfigurePageRouteRoute: typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute; + secretManagerIntegrationsCircleCIAuthorizePageRouteRoute: typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute; + secretManagerIntegrationsCircleCIConfigurePageRouteRoute: typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute; + secretManagerIntegrationsCloud66AuthorizePageRouteRoute: typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute; + secretManagerIntegrationsCloud66ConfigurePageRouteRoute: typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute; + secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute: typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute; + secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute: typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute; + secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute: typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute; + secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute: typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute; + secretManagerIntegrationsCodefreshAuthorizePageRouteRoute: typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute; + secretManagerIntegrationsCodefreshConfigurePageRouteRoute: typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute; + secretManagerIntegrationsDatabricksAuthorizePageRouteRoute: typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute; + secretManagerIntegrationsDatabricksConfigurePageRouteRoute: typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute; + secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute; + secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute: typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute; + secretManagerIntegrationsFlyioAuthorizePageRouteRoute: typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute; + secretManagerIntegrationsFlyioConfigurePageRouteRoute: typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute; + secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute: typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute; + secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute: typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute; + secretManagerIntegrationsGithubAuthorizePageRouteRoute: typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute; + secretManagerIntegrationsGithubConfigurePageRouteRoute: typeof secretManagerIntegrationsGithubConfigurePageRouteRoute; + secretManagerIntegrationsGitlabAuthorizePageRouteRoute: typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute; + secretManagerIntegrationsGitlabConfigurePageRouteRoute: typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute; + secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute: typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute; + secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute: typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute; + secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute: typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute; + secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute: typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute; + secretManagerIntegrationsHerokuConfigurePageRouteRoute: typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute; + secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute: typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute; + secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute: typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute; + secretManagerIntegrationsNetlifyConfigurePageRouteRoute: typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute; + secretManagerIntegrationsNorthflankAuthorizePageRouteRoute: typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute; + secretManagerIntegrationsNorthflankConfigurePageRouteRoute: typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute; + secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute: typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute; + secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute: typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute; + secretManagerIntegrationsQoveryAuthorizePageRouteRoute: typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute; + secretManagerIntegrationsQoveryConfigurePageRouteRoute: typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute; + secretManagerIntegrationsRailwayAuthorizePageRouteRoute: typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute; + secretManagerIntegrationsRailwayConfigurePageRouteRoute: typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute; + secretManagerIntegrationsRenderAuthorizePageRouteRoute: typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute; + secretManagerIntegrationsRenderConfigurePageRouteRoute: typeof secretManagerIntegrationsRenderConfigurePageRouteRoute; + secretManagerIntegrationsRundeckAuthorizePageRouteRoute: typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute; + secretManagerIntegrationsRundeckConfigurePageRouteRoute: typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute; + secretManagerIntegrationsSupabaseAuthorizePageRouteRoute: typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute; + secretManagerIntegrationsSupabaseConfigurePageRouteRoute: typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute; + secretManagerIntegrationsTeamcityAuthorizePageRouteRoute: typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute; + secretManagerIntegrationsTeamcityConfigurePageRouteRoute: typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute; + secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute: typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute; + secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute: typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute; + secretManagerIntegrationsTravisCIAuthorizePageRouteRoute: typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute; + secretManagerIntegrationsTravisCIConfigurePageRouteRoute: typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute; + secretManagerIntegrationsVercelConfigurePageRouteRoute: typeof secretManagerIntegrationsVercelConfigurePageRouteRoute; + secretManagerIntegrationsWindmillAuthorizePageRouteRoute: typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute; + secretManagerIntegrationsWindmillConfigurePageRouteRoute: typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute; + secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute; + secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute; + secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute; + secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute; + secretManagerIntegrationsGithubOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute; + secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute; + secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute; + secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute; + secretManagerSecretSyncDetailsByIDPageRouteRoute: typeof secretManagerSecretSyncDetailsByIDPageRouteRoute; + secretManagerIntegrationsVercelOauthCallbackPageRouteRoute: typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteChildren = { - secretManagerIntegrationsListPageRouteRoute: - secretManagerIntegrationsListPageRouteRoute, + secretManagerIntegrationsListPageRouteRoute: secretManagerIntegrationsListPageRouteRoute, secretManagerIntegrationsDetailsByIDPageRouteRoute: secretManagerIntegrationsDetailsByIDPageRouteRoute, secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute: @@ -4177,83 +4037,76 @@ const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecr secretManagerSecretSyncDetailsByIDPageRouteRoute: secretManagerSecretSyncDetailsByIDPageRouteRoute, secretManagerIntegrationsVercelOauthCallbackPageRouteRoute: - secretManagerIntegrationsVercelOauthCallbackPageRouteRoute, - } + secretManagerIntegrationsVercelOauthCallbackPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteChildren { - secretManagerCommitDetailsPageRouteRoute: typeof secretManagerCommitDetailsPageRouteRoute - secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute: typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute + secretManagerCommitDetailsPageRouteRoute: typeof secretManagerCommitDetailsPageRouteRoute; + secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute: typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteChildren = { - secretManagerCommitDetailsPageRouteRoute: - secretManagerCommitDetailsPageRouteRoute, + secretManagerCommitDetailsPageRouteRoute: secretManagerCommitDetailsPageRouteRoute, secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute: - secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute, - } + secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteChildren { - secretManagerCommitsPageRouteRoute: typeof secretManagerCommitsPageRouteRoute - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren + secretManagerCommitsPageRouteRoute: typeof secretManagerCommitsPageRouteRoute; + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteChildren = { secretManagerCommitsPageRouteRoute: secretManagerCommitsPageRouteRoute, AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRoute: - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren, - } + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteChildren + ); interface secretManagerLayoutRouteChildren { - secretManagerIPAllowlistPageRouteRoute: typeof secretManagerIPAllowlistPageRouteRoute - secretManagerSecretApprovalsPageRouteRoute: typeof secretManagerSecretApprovalsPageRouteRoute - secretManagerOverviewPageRouteRoute: typeof secretManagerOverviewPageRouteRoute - secretManagerSecretRotationPageRouteRoute: typeof secretManagerSecretRotationPageRouteRoute - secretManagerSettingsPageRouteRoute: typeof secretManagerSettingsPageRouteRoute - projectAccessControlPageRouteSecretManagerRoute: typeof projectAccessControlPageRouteSecretManagerRoute - projectAuditLogsPageRouteSecretManagerRoute: typeof projectAuditLogsPageRouteSecretManagerRoute - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren - secretManagerSecretDashboardPageRouteRoute: typeof secretManagerSecretDashboardPageRouteRoute - projectGroupDetailsByIDPageRouteSecretManagerRoute: typeof projectGroupDetailsByIDPageRouteSecretManagerRoute - projectIdentityDetailsByIDPageRouteSecretManagerRoute: typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute - projectMemberDetailsByIDPageRouteSecretManagerRoute: typeof projectMemberDetailsByIDPageRouteSecretManagerRoute - projectRoleDetailsBySlugPageRouteSecretManagerRoute: typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren + secretManagerIPAllowlistPageRouteRoute: typeof secretManagerIPAllowlistPageRouteRoute; + secretManagerSecretApprovalsPageRouteRoute: typeof secretManagerSecretApprovalsPageRouteRoute; + secretManagerOverviewPageRouteRoute: typeof secretManagerOverviewPageRouteRoute; + secretManagerSecretRotationPageRouteRoute: typeof secretManagerSecretRotationPageRouteRoute; + secretManagerSettingsPageRouteRoute: typeof secretManagerSettingsPageRouteRoute; + projectAccessControlPageRouteSecretManagerRoute: typeof projectAccessControlPageRouteSecretManagerRoute; + projectAuditLogsPageRouteSecretManagerRoute: typeof projectAuditLogsPageRouteSecretManagerRoute; + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren; + secretManagerSecretDashboardPageRouteRoute: typeof secretManagerSecretDashboardPageRouteRoute; + projectGroupDetailsByIDPageRouteSecretManagerRoute: typeof projectGroupDetailsByIDPageRouteSecretManagerRoute; + projectIdentityDetailsByIDPageRouteSecretManagerRoute: typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute; + projectMemberDetailsByIDPageRouteSecretManagerRoute: typeof projectMemberDetailsByIDPageRouteSecretManagerRoute; + projectRoleDetailsBySlugPageRouteSecretManagerRoute: typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute; + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren; } const secretManagerLayoutRouteChildren: secretManagerLayoutRouteChildren = { - secretManagerIPAllowlistPageRouteRoute: - secretManagerIPAllowlistPageRouteRoute, - secretManagerSecretApprovalsPageRouteRoute: - secretManagerSecretApprovalsPageRouteRoute, + secretManagerIPAllowlistPageRouteRoute: secretManagerIPAllowlistPageRouteRoute, + secretManagerSecretApprovalsPageRouteRoute: secretManagerSecretApprovalsPageRouteRoute, secretManagerOverviewPageRouteRoute: secretManagerOverviewPageRouteRoute, - secretManagerSecretRotationPageRouteRoute: - secretManagerSecretRotationPageRouteRoute, + secretManagerSecretRotationPageRouteRoute: secretManagerSecretRotationPageRouteRoute, secretManagerSettingsPageRouteRoute: secretManagerSettingsPageRouteRoute, - projectAccessControlPageRouteSecretManagerRoute: - projectAccessControlPageRouteSecretManagerRoute, - projectAuditLogsPageRouteSecretManagerRoute: - projectAuditLogsPageRouteSecretManagerRoute, + projectAccessControlPageRouteSecretManagerRoute: projectAccessControlPageRouteSecretManagerRoute, + projectAuditLogsPageRouteSecretManagerRoute: projectAuditLogsPageRouteSecretManagerRoute, AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRoute: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren, - secretManagerSecretDashboardPageRouteRoute: - secretManagerSecretDashboardPageRouteRoute, + secretManagerSecretDashboardPageRouteRoute: secretManagerSecretDashboardPageRouteRoute, projectGroupDetailsByIDPageRouteSecretManagerRoute: projectGroupDetailsByIDPageRouteSecretManagerRoute, projectIdentityDetailsByIDPageRouteSecretManagerRoute: @@ -4263,29 +4116,30 @@ const secretManagerLayoutRouteChildren: secretManagerLayoutRouteChildren = { projectRoleDetailsBySlugPageRouteSecretManagerRoute: projectRoleDetailsBySlugPageRouteSecretManagerRoute, AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRoute: - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren, -} + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren +}; -const secretManagerLayoutRouteWithChildren = - secretManagerLayoutRoute._addFileChildren(secretManagerLayoutRouteChildren) +const secretManagerLayoutRouteWithChildren = secretManagerLayoutRoute._addFileChildren( + secretManagerLayoutRouteChildren +); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteChildren { - secretManagerLayoutRoute: typeof secretManagerLayoutRouteWithChildren + secretManagerLayoutRoute: typeof secretManagerLayoutRouteWithChildren; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteChildren = { - secretManagerLayoutRoute: secretManagerLayoutRouteWithChildren, - } + secretManagerLayoutRoute: secretManagerLayoutRouteWithChildren + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteChildren + ); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteChildren { - secretScanningSecretScanningDataSourcesPageRouteRoute: typeof secretScanningSecretScanningDataSourcesPageRouteRoute - secretScanningSecretScanningDataSourceByIdPageRouteRoute: typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute + secretScanningSecretScanningDataSourcesPageRouteRoute: typeof secretScanningSecretScanningDataSourcesPageRouteRoute; + secretScanningSecretScanningDataSourceByIdPageRouteRoute: typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteChildren = @@ -4293,24 +4147,24 @@ const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecret secretScanningSecretScanningDataSourcesPageRouteRoute: secretScanningSecretScanningDataSourcesPageRouteRoute, secretScanningSecretScanningDataSourceByIdPageRouteRoute: - secretScanningSecretScanningDataSourceByIdPageRouteRoute, - } + secretScanningSecretScanningDataSourceByIdPageRouteRoute + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteChildren + ); interface secretScanningLayoutRouteChildren { - secretScanningSecretScanningFindingsPageRouteRoute: typeof secretScanningSecretScanningFindingsPageRouteRoute - secretScanningSettingsPageRouteRoute: typeof secretScanningSettingsPageRouteRoute - projectAccessControlPageRouteSecretScanningRoute: typeof projectAccessControlPageRouteSecretScanningRoute - projectAuditLogsPageRouteSecretScanningRoute: typeof projectAuditLogsPageRouteSecretScanningRoute - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren - projectGroupDetailsByIDPageRouteSecretScanningRoute: typeof projectGroupDetailsByIDPageRouteSecretScanningRoute - projectIdentityDetailsByIDPageRouteSecretScanningRoute: typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute - projectMemberDetailsByIDPageRouteSecretScanningRoute: typeof projectMemberDetailsByIDPageRouteSecretScanningRoute - projectRoleDetailsBySlugPageRouteSecretScanningRoute: typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute + secretScanningSecretScanningFindingsPageRouteRoute: typeof secretScanningSecretScanningFindingsPageRouteRoute; + secretScanningSettingsPageRouteRoute: typeof secretScanningSettingsPageRouteRoute; + projectAccessControlPageRouteSecretScanningRoute: typeof projectAccessControlPageRouteSecretScanningRoute; + projectAuditLogsPageRouteSecretScanningRoute: typeof projectAuditLogsPageRouteSecretScanningRoute; + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren; + projectGroupDetailsByIDPageRouteSecretScanningRoute: typeof projectGroupDetailsByIDPageRouteSecretScanningRoute; + projectIdentityDetailsByIDPageRouteSecretScanningRoute: typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute; + projectMemberDetailsByIDPageRouteSecretScanningRoute: typeof projectMemberDetailsByIDPageRouteSecretScanningRoute; + projectRoleDetailsBySlugPageRouteSecretScanningRoute: typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute; } const secretScanningLayoutRouteChildren: secretScanningLayoutRouteChildren = { @@ -4319,8 +4173,7 @@ const secretScanningLayoutRouteChildren: secretScanningLayoutRouteChildren = { secretScanningSettingsPageRouteRoute: secretScanningSettingsPageRouteRoute, projectAccessControlPageRouteSecretScanningRoute: projectAccessControlPageRouteSecretScanningRoute, - projectAuditLogsPageRouteSecretScanningRoute: - projectAuditLogsPageRouteSecretScanningRoute, + projectAuditLogsPageRouteSecretScanningRoute: projectAuditLogsPageRouteSecretScanningRoute, AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRoute: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren, projectGroupDetailsByIDPageRouteSecretScanningRoute: @@ -4330,39 +4183,40 @@ const secretScanningLayoutRouteChildren: secretScanningLayoutRouteChildren = { projectMemberDetailsByIDPageRouteSecretScanningRoute: projectMemberDetailsByIDPageRouteSecretScanningRoute, projectRoleDetailsBySlugPageRouteSecretScanningRoute: - projectRoleDetailsBySlugPageRouteSecretScanningRoute, -} + projectRoleDetailsBySlugPageRouteSecretScanningRoute +}; -const secretScanningLayoutRouteWithChildren = - secretScanningLayoutRoute._addFileChildren(secretScanningLayoutRouteChildren) +const secretScanningLayoutRouteWithChildren = secretScanningLayoutRoute._addFileChildren( + secretScanningLayoutRouteChildren +); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteChildren { - secretScanningLayoutRoute: typeof secretScanningLayoutRouteWithChildren + secretScanningLayoutRoute: typeof secretScanningLayoutRouteWithChildren; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteChildren = { - secretScanningLayoutRoute: secretScanningLayoutRouteWithChildren, - } + secretScanningLayoutRoute: secretScanningLayoutRouteWithChildren + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteChildren + ); interface sshLayoutRouteChildren { - sshSshCasPageRouteRoute: typeof sshSshCasPageRouteRoute - sshSshCertsPageRouteRoute: typeof sshSshCertsPageRouteRoute - sshSshHostsPageRouteRoute: typeof sshSshHostsPageRouteRoute - sshSettingsPageRouteRoute: typeof sshSettingsPageRouteRoute - projectAccessControlPageRouteSshRoute: typeof projectAccessControlPageRouteSshRoute - projectAuditLogsPageRouteSshRoute: typeof projectAuditLogsPageRouteSshRoute - sshSshCaByIDPageRouteRoute: typeof sshSshCaByIDPageRouteRoute - sshSshHostGroupDetailsByIDPageRouteRoute: typeof sshSshHostGroupDetailsByIDPageRouteRoute - projectGroupDetailsByIDPageRouteSshRoute: typeof projectGroupDetailsByIDPageRouteSshRoute - projectIdentityDetailsByIDPageRouteSshRoute: typeof projectIdentityDetailsByIDPageRouteSshRoute - projectMemberDetailsByIDPageRouteSshRoute: typeof projectMemberDetailsByIDPageRouteSshRoute - projectRoleDetailsBySlugPageRouteSshRoute: typeof projectRoleDetailsBySlugPageRouteSshRoute + sshSshCasPageRouteRoute: typeof sshSshCasPageRouteRoute; + sshSshCertsPageRouteRoute: typeof sshSshCertsPageRouteRoute; + sshSshHostsPageRouteRoute: typeof sshSshHostsPageRouteRoute; + sshSettingsPageRouteRoute: typeof sshSettingsPageRouteRoute; + projectAccessControlPageRouteSshRoute: typeof projectAccessControlPageRouteSshRoute; + projectAuditLogsPageRouteSshRoute: typeof projectAuditLogsPageRouteSshRoute; + sshSshCaByIDPageRouteRoute: typeof sshSshCaByIDPageRouteRoute; + sshSshHostGroupDetailsByIDPageRouteRoute: typeof sshSshHostGroupDetailsByIDPageRouteRoute; + projectGroupDetailsByIDPageRouteSshRoute: typeof projectGroupDetailsByIDPageRouteSshRoute; + projectIdentityDetailsByIDPageRouteSshRoute: typeof projectIdentityDetailsByIDPageRouteSshRoute; + projectMemberDetailsByIDPageRouteSshRoute: typeof projectMemberDetailsByIDPageRouteSshRoute; + projectRoleDetailsBySlugPageRouteSshRoute: typeof projectRoleDetailsBySlugPageRouteSshRoute; } const sshLayoutRouteChildren: sshLayoutRouteChildren = { @@ -4373,45 +4227,38 @@ const sshLayoutRouteChildren: sshLayoutRouteChildren = { projectAccessControlPageRouteSshRoute: projectAccessControlPageRouteSshRoute, projectAuditLogsPageRouteSshRoute: projectAuditLogsPageRouteSshRoute, sshSshCaByIDPageRouteRoute: sshSshCaByIDPageRouteRoute, - sshSshHostGroupDetailsByIDPageRouteRoute: - sshSshHostGroupDetailsByIDPageRouteRoute, - projectGroupDetailsByIDPageRouteSshRoute: - projectGroupDetailsByIDPageRouteSshRoute, - projectIdentityDetailsByIDPageRouteSshRoute: - projectIdentityDetailsByIDPageRouteSshRoute, - projectMemberDetailsByIDPageRouteSshRoute: - projectMemberDetailsByIDPageRouteSshRoute, - projectRoleDetailsBySlugPageRouteSshRoute: - projectRoleDetailsBySlugPageRouteSshRoute, -} + sshSshHostGroupDetailsByIDPageRouteRoute: sshSshHostGroupDetailsByIDPageRouteRoute, + projectGroupDetailsByIDPageRouteSshRoute: projectGroupDetailsByIDPageRouteSshRoute, + projectIdentityDetailsByIDPageRouteSshRoute: projectIdentityDetailsByIDPageRouteSshRoute, + projectMemberDetailsByIDPageRouteSshRoute: projectMemberDetailsByIDPageRouteSshRoute, + projectRoleDetailsBySlugPageRouteSshRoute: projectRoleDetailsBySlugPageRouteSshRoute +}; -const sshLayoutRouteWithChildren = sshLayoutRoute._addFileChildren( - sshLayoutRouteChildren, -) +const sshLayoutRouteWithChildren = sshLayoutRoute._addFileChildren(sshLayoutRouteChildren); interface AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteChildren { - sshLayoutRoute: typeof sshLayoutRouteWithChildren + sshLayoutRoute: typeof sshLayoutRouteWithChildren; } const AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteChildren = { - sshLayoutRoute: sshLayoutRouteWithChildren, - } + sshLayoutRoute: sshLayoutRouteWithChildren + }; const AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteWithChildren = AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRoute._addFileChildren( - AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteChildren, - ) + AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteChildren + ); interface organizationLayoutRouteChildren { - AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteWithChildren - AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteWithChildren + AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteWithChildren; + AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteWithChildren; } const organizationLayoutRouteChildren: organizationLayoutRouteChildren = { @@ -4430,1526 +4277,1494 @@ const organizationLayoutRouteChildren: organizationLayoutRouteChildren = { AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRoute: AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteWithChildren, AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRoute: - AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteWithChildren, -} + AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteWithChildren +}; -const organizationLayoutRouteWithChildren = - organizationLayoutRoute._addFileChildren(organizationLayoutRouteChildren) +const organizationLayoutRouteWithChildren = organizationLayoutRoute._addFileChildren( + organizationLayoutRouteChildren +); interface adminLayoutRouteChildren { - adminGeneralPageRouteRoute: typeof adminGeneralPageRouteRoute - adminAuthenticationPageRouteRoute: typeof adminAuthenticationPageRouteRoute - adminCachingPageRouteRoute: typeof adminCachingPageRouteRoute - adminEncryptionPageRouteRoute: typeof adminEncryptionPageRouteRoute - adminEnvironmentPageRouteRoute: typeof adminEnvironmentPageRouteRoute - adminIntegrationsPageRouteRoute: typeof adminIntegrationsPageRouteRoute - adminMachineIdentitiesResourcesPageRouteRoute: typeof adminMachineIdentitiesResourcesPageRouteRoute - adminOrganizationResourcesPageRouteRoute: typeof adminOrganizationResourcesPageRouteRoute - adminUserIdentitiesResourcesPageRouteRoute: typeof adminUserIdentitiesResourcesPageRouteRoute + adminGeneralPageRouteRoute: typeof adminGeneralPageRouteRoute; + adminAccessManagementPageRouteRoute: typeof adminAccessManagementPageRouteRoute; + adminAuthenticationPageRouteRoute: typeof adminAuthenticationPageRouteRoute; + adminCachingPageRouteRoute: typeof adminCachingPageRouteRoute; + adminEncryptionPageRouteRoute: typeof adminEncryptionPageRouteRoute; + adminEnvironmentPageRouteRoute: typeof adminEnvironmentPageRouteRoute; + adminIntegrationsPageRouteRoute: typeof adminIntegrationsPageRouteRoute; + adminResourceOverviewPageRouteRoute: typeof adminResourceOverviewPageRouteRoute; } const adminLayoutRouteChildren: adminLayoutRouteChildren = { adminGeneralPageRouteRoute: adminGeneralPageRouteRoute, + adminAccessManagementPageRouteRoute: adminAccessManagementPageRouteRoute, adminAuthenticationPageRouteRoute: adminAuthenticationPageRouteRoute, adminCachingPageRouteRoute: adminCachingPageRouteRoute, adminEncryptionPageRouteRoute: adminEncryptionPageRouteRoute, adminEnvironmentPageRouteRoute: adminEnvironmentPageRouteRoute, adminIntegrationsPageRouteRoute: adminIntegrationsPageRouteRoute, - adminMachineIdentitiesResourcesPageRouteRoute: - adminMachineIdentitiesResourcesPageRouteRoute, - adminOrganizationResourcesPageRouteRoute: - adminOrganizationResourcesPageRouteRoute, - adminUserIdentitiesResourcesPageRouteRoute: - adminUserIdentitiesResourcesPageRouteRoute, -} + adminResourceOverviewPageRouteRoute: adminResourceOverviewPageRouteRoute +}; -const adminLayoutRouteWithChildren = adminLayoutRoute._addFileChildren( - adminLayoutRouteChildren, -) +const adminLayoutRouteWithChildren = adminLayoutRoute._addFileChildren(adminLayoutRouteChildren); interface AuthenticateInjectOrgDetailsAdminRouteChildren { - adminLayoutRoute: typeof adminLayoutRouteWithChildren + adminLayoutRoute: typeof adminLayoutRouteWithChildren; } const AuthenticateInjectOrgDetailsAdminRouteChildren: AuthenticateInjectOrgDetailsAdminRouteChildren = { - adminLayoutRoute: adminLayoutRouteWithChildren, - } + adminLayoutRoute: adminLayoutRouteWithChildren + }; const AuthenticateInjectOrgDetailsAdminRouteWithChildren = AuthenticateInjectOrgDetailsAdminRoute._addFileChildren( - AuthenticateInjectOrgDetailsAdminRouteChildren, - ) + AuthenticateInjectOrgDetailsAdminRouteChildren + ); interface middlewaresInjectOrgDetailsRouteChildren { - organizationLayoutRoute: typeof organizationLayoutRouteWithChildren - AuthenticateInjectOrgDetailsAdminRoute: typeof AuthenticateInjectOrgDetailsAdminRouteWithChildren + organizationLayoutRoute: typeof organizationLayoutRouteWithChildren; + AuthenticateInjectOrgDetailsAdminRoute: typeof AuthenticateInjectOrgDetailsAdminRouteWithChildren; } -const middlewaresInjectOrgDetailsRouteChildren: middlewaresInjectOrgDetailsRouteChildren = - { - organizationLayoutRoute: organizationLayoutRouteWithChildren, - AuthenticateInjectOrgDetailsAdminRoute: - AuthenticateInjectOrgDetailsAdminRouteWithChildren, - } +const middlewaresInjectOrgDetailsRouteChildren: middlewaresInjectOrgDetailsRouteChildren = { + organizationLayoutRoute: organizationLayoutRouteWithChildren, + AuthenticateInjectOrgDetailsAdminRoute: AuthenticateInjectOrgDetailsAdminRouteWithChildren +}; const middlewaresInjectOrgDetailsRouteWithChildren = - middlewaresInjectOrgDetailsRoute._addFileChildren( - middlewaresInjectOrgDetailsRouteChildren, - ) + middlewaresInjectOrgDetailsRoute._addFileChildren(middlewaresInjectOrgDetailsRouteChildren); interface userLayoutRouteChildren { - userPersonalSettingsPageRouteRoute: typeof userPersonalSettingsPageRouteRoute + userPersonalSettingsPageRouteRoute: typeof userPersonalSettingsPageRouteRoute; } const userLayoutRouteChildren: userLayoutRouteChildren = { - userPersonalSettingsPageRouteRoute: userPersonalSettingsPageRouteRoute, -} + userPersonalSettingsPageRouteRoute: userPersonalSettingsPageRouteRoute +}; -const userLayoutRouteWithChildren = userLayoutRoute._addFileChildren( - userLayoutRouteChildren, -) +const userLayoutRouteWithChildren = userLayoutRoute._addFileChildren(userLayoutRouteChildren); interface AuthenticatePersonalSettingsRouteChildren { - userLayoutRoute: typeof userLayoutRouteWithChildren + userLayoutRoute: typeof userLayoutRouteWithChildren; } -const AuthenticatePersonalSettingsRouteChildren: AuthenticatePersonalSettingsRouteChildren = - { - userLayoutRoute: userLayoutRouteWithChildren, - } +const AuthenticatePersonalSettingsRouteChildren: AuthenticatePersonalSettingsRouteChildren = { + userLayoutRoute: userLayoutRouteWithChildren +}; const AuthenticatePersonalSettingsRouteWithChildren = - AuthenticatePersonalSettingsRoute._addFileChildren( - AuthenticatePersonalSettingsRouteChildren, - ) + AuthenticatePersonalSettingsRoute._addFileChildren(AuthenticatePersonalSettingsRouteChildren); interface middlewaresAuthenticateRouteChildren { - authPasswordSetupPageRouteRoute: typeof authPasswordSetupPageRouteRoute - middlewaresInjectOrgDetailsRoute: typeof middlewaresInjectOrgDetailsRouteWithChildren - AuthenticatePersonalSettingsRoute: typeof AuthenticatePersonalSettingsRouteWithChildren - organizationNoOrgPageRouteRoute: typeof organizationNoOrgPageRouteRoute + authPasswordSetupPageRouteRoute: typeof authPasswordSetupPageRouteRoute; + middlewaresInjectOrgDetailsRoute: typeof middlewaresInjectOrgDetailsRouteWithChildren; + AuthenticatePersonalSettingsRoute: typeof AuthenticatePersonalSettingsRouteWithChildren; + organizationNoOrgPageRouteRoute: typeof organizationNoOrgPageRouteRoute; } -const middlewaresAuthenticateRouteChildren: middlewaresAuthenticateRouteChildren = - { - authPasswordSetupPageRouteRoute: authPasswordSetupPageRouteRoute, - middlewaresInjectOrgDetailsRoute: - middlewaresInjectOrgDetailsRouteWithChildren, - AuthenticatePersonalSettingsRoute: - AuthenticatePersonalSettingsRouteWithChildren, - organizationNoOrgPageRouteRoute: organizationNoOrgPageRouteRoute, - } +const middlewaresAuthenticateRouteChildren: middlewaresAuthenticateRouteChildren = { + authPasswordSetupPageRouteRoute: authPasswordSetupPageRouteRoute, + middlewaresInjectOrgDetailsRoute: middlewaresInjectOrgDetailsRouteWithChildren, + AuthenticatePersonalSettingsRoute: AuthenticatePersonalSettingsRouteWithChildren, + organizationNoOrgPageRouteRoute: organizationNoOrgPageRouteRoute +}; -const middlewaresAuthenticateRouteWithChildren = - middlewaresAuthenticateRoute._addFileChildren( - middlewaresAuthenticateRouteChildren, - ) +const middlewaresAuthenticateRouteWithChildren = middlewaresAuthenticateRoute._addFileChildren( + middlewaresAuthenticateRouteChildren +); interface RestrictLoginSignupLoginRouteChildren { - authLoginPageRouteRoute: typeof authLoginPageRouteRoute - authAdminLoginPageRouteRoute: typeof authAdminLoginPageRouteRoute - authLoginLdapPageRouteRoute: typeof authLoginLdapPageRouteRoute - authSelectOrgPageRouteRoute: typeof authSelectOrgPageRouteRoute - authLoginSsoPageRouteRoute: typeof authLoginSsoPageRouteRoute - authProviderErrorPageRouteRoute: typeof authProviderErrorPageRouteRoute - authProviderSuccessPageRouteRoute: typeof authProviderSuccessPageRouteRoute + authLoginPageRouteRoute: typeof authLoginPageRouteRoute; + authAdminLoginPageRouteRoute: typeof authAdminLoginPageRouteRoute; + authLoginLdapPageRouteRoute: typeof authLoginLdapPageRouteRoute; + authSelectOrgPageRouteRoute: typeof authSelectOrgPageRouteRoute; + authLoginSsoPageRouteRoute: typeof authLoginSsoPageRouteRoute; + authProviderErrorPageRouteRoute: typeof authProviderErrorPageRouteRoute; + authProviderSuccessPageRouteRoute: typeof authProviderSuccessPageRouteRoute; } -const RestrictLoginSignupLoginRouteChildren: RestrictLoginSignupLoginRouteChildren = - { - authLoginPageRouteRoute: authLoginPageRouteRoute, - authAdminLoginPageRouteRoute: authAdminLoginPageRouteRoute, - authLoginLdapPageRouteRoute: authLoginLdapPageRouteRoute, - authSelectOrgPageRouteRoute: authSelectOrgPageRouteRoute, - authLoginSsoPageRouteRoute: authLoginSsoPageRouteRoute, - authProviderErrorPageRouteRoute: authProviderErrorPageRouteRoute, - authProviderSuccessPageRouteRoute: authProviderSuccessPageRouteRoute, - } +const RestrictLoginSignupLoginRouteChildren: RestrictLoginSignupLoginRouteChildren = { + authLoginPageRouteRoute: authLoginPageRouteRoute, + authAdminLoginPageRouteRoute: authAdminLoginPageRouteRoute, + authLoginLdapPageRouteRoute: authLoginLdapPageRouteRoute, + authSelectOrgPageRouteRoute: authSelectOrgPageRouteRoute, + authLoginSsoPageRouteRoute: authLoginSsoPageRouteRoute, + authProviderErrorPageRouteRoute: authProviderErrorPageRouteRoute, + authProviderSuccessPageRouteRoute: authProviderSuccessPageRouteRoute +}; -const RestrictLoginSignupLoginRouteWithChildren = - RestrictLoginSignupLoginRoute._addFileChildren( - RestrictLoginSignupLoginRouteChildren, - ) +const RestrictLoginSignupLoginRouteWithChildren = RestrictLoginSignupLoginRoute._addFileChildren( + RestrictLoginSignupLoginRouteChildren +); interface RestrictLoginSignupSignupRouteChildren { - authSignUpPageRouteRoute: typeof authSignUpPageRouteRoute - authSignUpSsoPageRouteRoute: typeof authSignUpSsoPageRouteRoute + authSignUpPageRouteRoute: typeof authSignUpPageRouteRoute; + authSignUpSsoPageRouteRoute: typeof authSignUpSsoPageRouteRoute; } -const RestrictLoginSignupSignupRouteChildren: RestrictLoginSignupSignupRouteChildren = - { - authSignUpPageRouteRoute: authSignUpPageRouteRoute, - authSignUpSsoPageRouteRoute: authSignUpSsoPageRouteRoute, - } +const RestrictLoginSignupSignupRouteChildren: RestrictLoginSignupSignupRouteChildren = { + authSignUpPageRouteRoute: authSignUpPageRouteRoute, + authSignUpSsoPageRouteRoute: authSignUpSsoPageRouteRoute +}; -const RestrictLoginSignupSignupRouteWithChildren = - RestrictLoginSignupSignupRoute._addFileChildren( - RestrictLoginSignupSignupRouteChildren, - ) +const RestrictLoginSignupSignupRouteWithChildren = RestrictLoginSignupSignupRoute._addFileChildren( + RestrictLoginSignupSignupRouteChildren +); interface middlewaresRestrictLoginSignupRouteChildren { - authEmailNotVerifiedPageRouteRoute: typeof authEmailNotVerifiedPageRouteRoute - authPasswordResetPageRouteRoute: typeof authPasswordResetPageRouteRoute - authRequestNewInvitePageRouteRoute: typeof authRequestNewInvitePageRouteRoute - authSignUpInvitePageRouteRoute: typeof authSignUpInvitePageRouteRoute - authVerifyEmailPageRouteRoute: typeof authVerifyEmailPageRouteRoute - RestrictLoginSignupLoginRoute: typeof RestrictLoginSignupLoginRouteWithChildren - RestrictLoginSignupSignupRoute: typeof RestrictLoginSignupSignupRouteWithChildren - adminSignUpPageRouteRoute: typeof adminSignUpPageRouteRoute + authEmailNotVerifiedPageRouteRoute: typeof authEmailNotVerifiedPageRouteRoute; + authPasswordResetPageRouteRoute: typeof authPasswordResetPageRouteRoute; + authRequestNewInvitePageRouteRoute: typeof authRequestNewInvitePageRouteRoute; + authSignUpInvitePageRouteRoute: typeof authSignUpInvitePageRouteRoute; + authVerifyEmailPageRouteRoute: typeof authVerifyEmailPageRouteRoute; + RestrictLoginSignupLoginRoute: typeof RestrictLoginSignupLoginRouteWithChildren; + RestrictLoginSignupSignupRoute: typeof RestrictLoginSignupSignupRouteWithChildren; + adminSignUpPageRouteRoute: typeof adminSignUpPageRouteRoute; } -const middlewaresRestrictLoginSignupRouteChildren: middlewaresRestrictLoginSignupRouteChildren = - { - authEmailNotVerifiedPageRouteRoute: authEmailNotVerifiedPageRouteRoute, - authPasswordResetPageRouteRoute: authPasswordResetPageRouteRoute, - authRequestNewInvitePageRouteRoute: authRequestNewInvitePageRouteRoute, - authSignUpInvitePageRouteRoute: authSignUpInvitePageRouteRoute, - authVerifyEmailPageRouteRoute: authVerifyEmailPageRouteRoute, - RestrictLoginSignupLoginRoute: RestrictLoginSignupLoginRouteWithChildren, - RestrictLoginSignupSignupRoute: RestrictLoginSignupSignupRouteWithChildren, - adminSignUpPageRouteRoute: adminSignUpPageRouteRoute, - } +const middlewaresRestrictLoginSignupRouteChildren: middlewaresRestrictLoginSignupRouteChildren = { + authEmailNotVerifiedPageRouteRoute: authEmailNotVerifiedPageRouteRoute, + authPasswordResetPageRouteRoute: authPasswordResetPageRouteRoute, + authRequestNewInvitePageRouteRoute: authRequestNewInvitePageRouteRoute, + authSignUpInvitePageRouteRoute: authSignUpInvitePageRouteRoute, + authVerifyEmailPageRouteRoute: authVerifyEmailPageRouteRoute, + RestrictLoginSignupLoginRoute: RestrictLoginSignupLoginRouteWithChildren, + RestrictLoginSignupSignupRoute: RestrictLoginSignupSignupRouteWithChildren, + adminSignUpPageRouteRoute: adminSignUpPageRouteRoute +}; const middlewaresRestrictLoginSignupRouteWithChildren = - middlewaresRestrictLoginSignupRoute._addFileChildren( - middlewaresRestrictLoginSignupRouteChildren, - ) + middlewaresRestrictLoginSignupRoute._addFileChildren(middlewaresRestrictLoginSignupRouteChildren); export interface FileRoutesByFullPath { - '/': typeof indexRoute - '/cli-redirect': typeof authCliRedirectPageRouteRoute - '/share-secret': typeof publicShareSecretPageRouteRoute - '': typeof organizationLayoutRouteWithChildren - '/password-setup': typeof authPasswordSetupPageRouteRoute - '/email-not-verified': typeof authEmailNotVerifiedPageRouteRoute - '/password-reset': typeof authPasswordResetPageRouteRoute - '/requestnewinvite': typeof authRequestNewInvitePageRouteRoute - '/signupinvite': typeof authSignUpInvitePageRouteRoute - '/verify-email': typeof authVerifyEmailPageRouteRoute - '/personal-settings': typeof userLayoutRouteWithChildren - '/login': typeof RestrictLoginSignupLoginRouteWithChildren - '/signup': typeof RestrictLoginSignupSignupRouteWithChildren - '/login/': typeof authLoginPageRouteRoute - '/signup/': typeof authSignUpPageRouteRoute - '/organization/none': typeof organizationNoOrgPageRouteRoute - '/admin/signup': typeof adminSignUpPageRouteRoute - '/login/admin': typeof authAdminLoginPageRouteRoute - '/login/ldap': typeof authLoginLdapPageRouteRoute - '/login/select-organization': typeof authSelectOrgPageRouteRoute - '/login/sso': typeof authLoginSsoPageRouteRoute - '/signup/sso': typeof authSignUpSsoPageRouteRoute - '/secret-request/secret/$secretRequestId': typeof publicViewSecretRequestByIDPageRouteRoute - '/shared/secret/$secretId': typeof publicViewSharedSecretByIDPageRouteRoute - '/admin': typeof adminLayoutRouteWithChildren - '/personal-settings/': typeof userPersonalSettingsPageRouteRoute - '/login/provider/error': typeof authProviderErrorPageRouteRoute - '/login/provider/success': typeof authProviderSuccessPageRouteRoute - '/integrations': typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren - '/organization': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren - '/admin/': typeof adminGeneralPageRouteRoute - '/organization/access-management': typeof organizationAccessManagementPageRouteRoute - '/organization/audit-logs': typeof organizationAuditLogsPageRouteRoute - '/organization/billing': typeof organizationBillingPageRouteRoute - '/organization/projects': typeof organizationProjectsPageRouteRoute - '/admin/authentication': typeof adminAuthenticationPageRouteRoute - '/admin/caching': typeof adminCachingPageRouteRoute - '/admin/encryption': typeof adminEncryptionPageRouteRoute - '/admin/environment': typeof adminEnvironmentPageRouteRoute - '/admin/integrations': typeof adminIntegrationsPageRouteRoute - '/organization/app-connections': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren - '/organization/gateways': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren - '/organization/secret-sharing': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren - '/organization/settings': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren - '/secret-manager/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren - '/organization/app-connections/': typeof organizationAppConnectionsAppConnectionsPageRouteRoute - '/organization/gateways/': typeof organizationGatewaysGatewayListPageRouteRoute - '/organization/secret-sharing/': typeof organizationSecretSharingPageRouteRoute - '/organization/settings/': typeof organizationSettingsPageRouteRoute - '/organization/groups/$groupId': typeof organizationGroupDetailsByIDPageRouteRoute - '/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute - '/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute - '/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute - '/organization/secret-sharing/settings': typeof organizationSecretSharingSettingsPageRouteRoute - '/admin/resources/machine-identities': typeof adminMachineIdentitiesResourcesPageRouteRoute - '/admin/resources/organizations': typeof adminOrganizationResourcesPageRouteRoute - '/admin/resources/user-identities': typeof adminUserIdentitiesResourcesPageRouteRoute - '/projects/cert-management/$projectId': typeof certManagerLayoutRouteWithChildren - '/projects/kms/$projectId': typeof kmsLayoutRouteWithChildren - '/projects/secret-management/$projectId': typeof secretManagerLayoutRouteWithChildren - '/projects/secret-scanning/$projectId': typeof secretScanningLayoutRouteWithChildren - '/projects/ssh/$projectId': typeof sshLayoutRouteWithChildren - '/secret-manager/$projectId/approval': typeof secretManagerRedirectsRedirectApprovalPageRoute - '/organization/settings/oauth/callback': typeof organizationSettingsPageOauthCallbackPageRouteRoute - '/integrations/azure-app-configuration/oauth2/callback': typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute - '/integrations/azure-key-vault/oauth2/callback': typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute - '/integrations/bitbucket/oauth2/callback': typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute - '/integrations/gcp-secret-manager/oauth2/callback': typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute - '/integrations/github/oauth2/callback': typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute - '/integrations/gitlab/oauth2/callback': typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute - '/integrations/heroku/oauth2/callback': typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute - '/integrations/netlify/oauth2/callback': typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute - '/integrations/vercel/oauth2/callback': typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute - '/organization/app-connections/$appConnection/oauth/callback': typeof organizationAppConnectionsOauthCallbackPageRouteRoute - '/projects/cert-management/$projectId/alerting': typeof certManagerAlertingPageRouteRoute - '/projects/cert-management/$projectId/certificate-authorities': typeof certManagerCertificateAuthoritiesPageRouteRoute - '/projects/cert-management/$projectId/certificates': typeof certManagerCertificatesPageRouteRoute - '/projects/cert-management/$projectId/settings': typeof certManagerSettingsPageRouteRoute - '/projects/kms/$projectId/kmip': typeof kmsKmipPageRouteRoute - '/projects/kms/$projectId/overview': typeof kmsOverviewPageRouteRoute - '/projects/kms/$projectId/settings': typeof kmsSettingsPageRouteRoute - '/projects/secret-management/$projectId/allowlist': typeof secretManagerIPAllowlistPageRouteRoute - '/projects/secret-management/$projectId/approval': typeof secretManagerSecretApprovalsPageRouteRoute - '/projects/secret-management/$projectId/overview': typeof secretManagerOverviewPageRouteRoute - '/projects/secret-management/$projectId/secret-rotation': typeof secretManagerSecretRotationPageRouteRoute - '/projects/secret-management/$projectId/settings': typeof secretManagerSettingsPageRouteRoute - '/projects/secret-scanning/$projectId/findings': typeof secretScanningSecretScanningFindingsPageRouteRoute - '/projects/secret-scanning/$projectId/settings': typeof secretScanningSettingsPageRouteRoute - '/projects/ssh/$projectId/cas': typeof sshSshCasPageRouteRoute - '/projects/ssh/$projectId/certificates': typeof sshSshCertsPageRouteRoute - '/projects/ssh/$projectId/overview': typeof sshSshHostsPageRouteRoute - '/projects/ssh/$projectId/settings': typeof sshSettingsPageRouteRoute - '/projects/cert-management/$projectId/access-management': typeof projectAccessControlPageRouteCertManagerRoute - '/projects/cert-management/$projectId/audit-logs': typeof projectAuditLogsPageRouteCertManagerRoute - '/projects/cert-management/$projectId/certificate-templates': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren - '/projects/cert-management/$projectId/subscribers': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren - '/projects/kms/$projectId/access-management': typeof projectAccessControlPageRouteKmsRoute - '/projects/kms/$projectId/audit-logs': typeof projectAuditLogsPageRouteKmsRoute - '/projects/secret-management/$projectId/access-management': typeof projectAccessControlPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/audit-logs': typeof projectAuditLogsPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/integrations': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren - '/projects/secret-scanning/$projectId/access-management': typeof projectAccessControlPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/audit-logs': typeof projectAuditLogsPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/data-sources': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren - '/projects/ssh/$projectId/access-management': typeof projectAccessControlPageRouteSshRoute - '/projects/ssh/$projectId/audit-logs': typeof projectAuditLogsPageRouteSshRoute - '/projects/cert-management/$projectId/certificate-templates/': typeof certManagerPkiTemplateListPageRouteRoute - '/projects/cert-management/$projectId/subscribers/': typeof certManagerPkiSubscribersPageRouteRoute - '/projects/secret-management/$projectId/integrations/': typeof secretManagerIntegrationsListPageRouteRoute - '/projects/secret-scanning/$projectId/data-sources/': typeof secretScanningSecretScanningDataSourcesPageRouteRoute - '/projects/cert-management/$projectId/ca/$caName': typeof certManagerCertAuthDetailsByIDPageRouteRoute - '/projects/cert-management/$projectId/subscribers/$subscriberName': typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute - '/projects/secret-management/$projectId/integrations/$integrationId': typeof secretManagerIntegrationsDetailsByIDPageRouteRoute - '/projects/secret-management/$projectId/integrations/select-integration-auth': typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute - '/projects/secret-management/$projectId/secrets/$envSlug': typeof secretManagerSecretDashboardPageRouteRoute - '/projects/ssh/$projectId/ca/$caId': typeof sshSshCaByIDPageRouteRoute - '/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId': typeof sshSshHostGroupDetailsByIDPageRouteRoute - '/projects/cert-management/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteCertManagerRoute - '/projects/cert-management/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteCertManagerRoute - '/projects/cert-management/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteCertManagerRoute - '/projects/cert-management/$projectId/pki-collections/$collectionId': typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute - '/projects/cert-management/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteCertManagerRoute - '/projects/kms/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteKmsRoute - '/projects/kms/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteKmsRoute - '/projects/kms/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteKmsRoute - '/projects/kms/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteKmsRoute - '/projects/secret-management/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute - '/projects/secret-scanning/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute - '/projects/ssh/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSshRoute - '/projects/ssh/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSshRoute - '/projects/ssh/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSshRoute - '/projects/ssh/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSshRoute - '/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize': typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/aws-parameter-store/create': typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize': typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/aws-secret-manager/create': typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-app-configuration/create': typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-devops/authorize': typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-devops/create': typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-key-vault/authorize': typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-key-vault/create': typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/bitbucket/create': typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/checkly/authorize': typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/checkly/create': typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/circleci/authorize': typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/circleci/create': typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloud-66/authorize': typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloud-66/create': typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize': typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-pages/create': typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize': typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-workers/create': typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/codefresh/authorize': typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/codefresh/create': typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/databricks/authorize': typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/databricks/create': typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize': typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create': typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/flyio/authorize': typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/flyio/create': typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize': typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/gcp-secret-manager/create': typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/github/auth-mode-selection': typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/github/create': typeof secretManagerIntegrationsGithubConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/gitlab/authorize': typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/gitlab/create': typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize': typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/hashicorp-vault/create': typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/hasura-cloud/authorize': typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/hasura-cloud/create': typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/heroku/create': typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/laravel-forge/authorize': typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/laravel-forge/create': typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/netlify/create': typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/northflank/authorize': typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/northflank/create': typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/octopus-deploy/authorize': typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/octopus-deploy/create': typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/qovery/authorize': typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/qovery/create': typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/railway/authorize': typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/railway/create': typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/render/authorize': typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/render/create': typeof secretManagerIntegrationsRenderConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/rundeck/authorize': typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/rundeck/create': typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/supabase/authorize': typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/supabase/create': typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/teamcity/authorize': typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/teamcity/create': typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/terraform-cloud/authorize': typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/terraform-cloud/create': typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/travisci/authorize': typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/travisci/create': typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/vercel/create': typeof secretManagerIntegrationsVercelConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/windmill/authorize': typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/windmill/create': typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute - '/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId': typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute - '/projects/secret-management/$projectId/commits/$environment/$folderId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren - '/projects/secret-management/$projectId/commits/$environment/$folderId/': typeof secretManagerCommitsPageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback': typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback': typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback': typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback': typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/github/oauth2/callback': typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback': typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/heroku/oauth2/callback': typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/netlify/oauth2/callback': typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId': typeof secretManagerSecretSyncDetailsByIDPageRouteRoute - '/projects/secret-management/$projectId/integrations/vercel/oauth2/callback': typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren - '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/': typeof secretManagerCommitDetailsPageRouteRoute - '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore': typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute + "/": typeof indexRoute; + "/cli-redirect": typeof authCliRedirectPageRouteRoute; + "/share-secret": typeof publicShareSecretPageRouteRoute; + "": typeof organizationLayoutRouteWithChildren; + "/password-setup": typeof authPasswordSetupPageRouteRoute; + "/email-not-verified": typeof authEmailNotVerifiedPageRouteRoute; + "/password-reset": typeof authPasswordResetPageRouteRoute; + "/requestnewinvite": typeof authRequestNewInvitePageRouteRoute; + "/signupinvite": typeof authSignUpInvitePageRouteRoute; + "/verify-email": typeof authVerifyEmailPageRouteRoute; + "/personal-settings": typeof userLayoutRouteWithChildren; + "/login": typeof RestrictLoginSignupLoginRouteWithChildren; + "/signup": typeof RestrictLoginSignupSignupRouteWithChildren; + "/login/": typeof authLoginPageRouteRoute; + "/signup/": typeof authSignUpPageRouteRoute; + "/organization/none": typeof organizationNoOrgPageRouteRoute; + "/admin/signup": typeof adminSignUpPageRouteRoute; + "/login/admin": typeof authAdminLoginPageRouteRoute; + "/login/ldap": typeof authLoginLdapPageRouteRoute; + "/login/select-organization": typeof authSelectOrgPageRouteRoute; + "/login/sso": typeof authLoginSsoPageRouteRoute; + "/signup/sso": typeof authSignUpSsoPageRouteRoute; + "/secret-request/secret/$secretRequestId": typeof publicViewSecretRequestByIDPageRouteRoute; + "/shared/secret/$secretId": typeof publicViewSharedSecretByIDPageRouteRoute; + "/admin": typeof adminLayoutRouteWithChildren; + "/personal-settings/": typeof userPersonalSettingsPageRouteRoute; + "/login/provider/error": typeof authProviderErrorPageRouteRoute; + "/login/provider/success": typeof authProviderSuccessPageRouteRoute; + "/integrations": typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren; + "/organization": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren; + "/admin/": typeof adminGeneralPageRouteRoute; + "/organization/access-management": typeof organizationAccessManagementPageRouteRoute; + "/organization/audit-logs": typeof organizationAuditLogsPageRouteRoute; + "/organization/billing": typeof organizationBillingPageRouteRoute; + "/organization/projects": typeof organizationProjectsPageRouteRoute; + "/admin/access-management": typeof adminAccessManagementPageRouteRoute; + "/admin/authentication": typeof adminAuthenticationPageRouteRoute; + "/admin/caching": typeof adminCachingPageRouteRoute; + "/admin/encryption": typeof adminEncryptionPageRouteRoute; + "/admin/environment": typeof adminEnvironmentPageRouteRoute; + "/admin/integrations": typeof adminIntegrationsPageRouteRoute; + "/organization/app-connections": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren; + "/organization/gateways": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren; + "/organization/secret-sharing": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren; + "/organization/settings": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren; + "/secret-manager/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren; + "/organization/app-connections/": typeof organizationAppConnectionsAppConnectionsPageRouteRoute; + "/organization/gateways/": typeof organizationGatewaysGatewayListPageRouteRoute; + "/organization/secret-sharing/": typeof organizationSecretSharingPageRouteRoute; + "/organization/settings/": typeof organizationSettingsPageRouteRoute; + "/organization/groups/$groupId": typeof organizationGroupDetailsByIDPageRouteRoute; + "/organization/identities/$identityId": typeof organizationIdentityDetailsByIDPageRouteRoute; + "/organization/members/$membershipId": typeof organizationUserDetailsByIDPageRouteRoute; + "/organization/roles/$roleId": typeof organizationRoleByIDPageRouteRoute; + "/organization/secret-sharing/settings": typeof organizationSecretSharingSettingsPageRouteRoute; + "/admin/resources/overview": typeof adminResourceOverviewPageRouteRoute; + "/projects/cert-management/$projectId": typeof certManagerLayoutRouteWithChildren; + "/projects/kms/$projectId": typeof kmsLayoutRouteWithChildren; + "/projects/secret-management/$projectId": typeof secretManagerLayoutRouteWithChildren; + "/projects/secret-scanning/$projectId": typeof secretScanningLayoutRouteWithChildren; + "/projects/ssh/$projectId": typeof sshLayoutRouteWithChildren; + "/secret-manager/$projectId/approval": typeof secretManagerRedirectsRedirectApprovalPageRoute; + "/organization/settings/oauth/callback": typeof organizationSettingsPageOauthCallbackPageRouteRoute; + "/integrations/azure-app-configuration/oauth2/callback": typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute; + "/integrations/azure-key-vault/oauth2/callback": typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute; + "/integrations/bitbucket/oauth2/callback": typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute; + "/integrations/gcp-secret-manager/oauth2/callback": typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute; + "/integrations/github/oauth2/callback": typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute; + "/integrations/gitlab/oauth2/callback": typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute; + "/integrations/heroku/oauth2/callback": typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute; + "/integrations/netlify/oauth2/callback": typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute; + "/integrations/vercel/oauth2/callback": typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute; + "/organization/app-connections/$appConnection/oauth/callback": typeof organizationAppConnectionsOauthCallbackPageRouteRoute; + "/projects/cert-management/$projectId/alerting": typeof certManagerAlertingPageRouteRoute; + "/projects/cert-management/$projectId/certificate-authorities": typeof certManagerCertificateAuthoritiesPageRouteRoute; + "/projects/cert-management/$projectId/certificates": typeof certManagerCertificatesPageRouteRoute; + "/projects/cert-management/$projectId/settings": typeof certManagerSettingsPageRouteRoute; + "/projects/kms/$projectId/kmip": typeof kmsKmipPageRouteRoute; + "/projects/kms/$projectId/overview": typeof kmsOverviewPageRouteRoute; + "/projects/kms/$projectId/settings": typeof kmsSettingsPageRouteRoute; + "/projects/secret-management/$projectId/allowlist": typeof secretManagerIPAllowlistPageRouteRoute; + "/projects/secret-management/$projectId/approval": typeof secretManagerSecretApprovalsPageRouteRoute; + "/projects/secret-management/$projectId/overview": typeof secretManagerOverviewPageRouteRoute; + "/projects/secret-management/$projectId/secret-rotation": typeof secretManagerSecretRotationPageRouteRoute; + "/projects/secret-management/$projectId/settings": typeof secretManagerSettingsPageRouteRoute; + "/projects/secret-scanning/$projectId/findings": typeof secretScanningSecretScanningFindingsPageRouteRoute; + "/projects/secret-scanning/$projectId/settings": typeof secretScanningSettingsPageRouteRoute; + "/projects/ssh/$projectId/cas": typeof sshSshCasPageRouteRoute; + "/projects/ssh/$projectId/certificates": typeof sshSshCertsPageRouteRoute; + "/projects/ssh/$projectId/overview": typeof sshSshHostsPageRouteRoute; + "/projects/ssh/$projectId/settings": typeof sshSettingsPageRouteRoute; + "/projects/cert-management/$projectId/access-management": typeof projectAccessControlPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/audit-logs": typeof projectAuditLogsPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/certificate-templates": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren; + "/projects/cert-management/$projectId/subscribers": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren; + "/projects/kms/$projectId/access-management": typeof projectAccessControlPageRouteKmsRoute; + "/projects/kms/$projectId/audit-logs": typeof projectAuditLogsPageRouteKmsRoute; + "/projects/secret-management/$projectId/access-management": typeof projectAccessControlPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/audit-logs": typeof projectAuditLogsPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/integrations": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren; + "/projects/secret-scanning/$projectId/access-management": typeof projectAccessControlPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/audit-logs": typeof projectAuditLogsPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/data-sources": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren; + "/projects/ssh/$projectId/access-management": typeof projectAccessControlPageRouteSshRoute; + "/projects/ssh/$projectId/audit-logs": typeof projectAuditLogsPageRouteSshRoute; + "/projects/cert-management/$projectId/certificate-templates/": typeof certManagerPkiTemplateListPageRouteRoute; + "/projects/cert-management/$projectId/subscribers/": typeof certManagerPkiSubscribersPageRouteRoute; + "/projects/secret-management/$projectId/integrations/": typeof secretManagerIntegrationsListPageRouteRoute; + "/projects/secret-scanning/$projectId/data-sources/": typeof secretScanningSecretScanningDataSourcesPageRouteRoute; + "/projects/cert-management/$projectId/ca/$caName": typeof certManagerCertAuthDetailsByIDPageRouteRoute; + "/projects/cert-management/$projectId/subscribers/$subscriberName": typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute; + "/projects/secret-management/$projectId/integrations/$integrationId": typeof secretManagerIntegrationsDetailsByIDPageRouteRoute; + "/projects/secret-management/$projectId/integrations/select-integration-auth": typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute; + "/projects/secret-management/$projectId/secrets/$envSlug": typeof secretManagerSecretDashboardPageRouteRoute; + "/projects/ssh/$projectId/ca/$caId": typeof sshSshCaByIDPageRouteRoute; + "/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId": typeof sshSshHostGroupDetailsByIDPageRouteRoute; + "/projects/cert-management/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/pki-collections/$collectionId": typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute; + "/projects/cert-management/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteCertManagerRoute; + "/projects/kms/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteKmsRoute; + "/projects/kms/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteKmsRoute; + "/projects/kms/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteKmsRoute; + "/projects/kms/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteKmsRoute; + "/projects/secret-management/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute; + "/projects/secret-scanning/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute; + "/projects/ssh/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSshRoute; + "/projects/ssh/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSshRoute; + "/projects/ssh/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSshRoute; + "/projects/ssh/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSshRoute; + "/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize": typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/aws-parameter-store/create": typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize": typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/aws-secret-manager/create": typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-app-configuration/create": typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-devops/authorize": typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-devops/create": typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize": typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-key-vault/create": typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/bitbucket/create": typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/checkly/authorize": typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/checkly/create": typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/circleci/authorize": typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/circleci/create": typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloud-66/authorize": typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloud-66/create": typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize": typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-pages/create": typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize": typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-workers/create": typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/codefresh/authorize": typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/codefresh/create": typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/databricks/authorize": typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/databricks/create": typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize": typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create": typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/flyio/authorize": typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/flyio/create": typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize": typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gcp-secret-manager/create": typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/github/auth-mode-selection": typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/github/create": typeof secretManagerIntegrationsGithubConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gitlab/authorize": typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gitlab/create": typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize": typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hashicorp-vault/create": typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hasura-cloud/authorize": typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hasura-cloud/create": typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/heroku/create": typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/laravel-forge/authorize": typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/laravel-forge/create": typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/netlify/create": typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/northflank/authorize": typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/northflank/create": typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/octopus-deploy/authorize": typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/octopus-deploy/create": typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/qovery/authorize": typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/qovery/create": typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/railway/authorize": typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/railway/create": typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/render/authorize": typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/render/create": typeof secretManagerIntegrationsRenderConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/rundeck/authorize": typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/rundeck/create": typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/supabase/authorize": typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/supabase/create": typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/teamcity/authorize": typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/teamcity/create": typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/terraform-cloud/authorize": typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/terraform-cloud/create": typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/travisci/authorize": typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/travisci/create": typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/vercel/create": typeof secretManagerIntegrationsVercelConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/windmill/authorize": typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/windmill/create": typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute; + "/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId": typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute; + "/projects/secret-management/$projectId/commits/$environment/$folderId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren; + "/projects/secret-management/$projectId/commits/$environment/$folderId/": typeof secretManagerCommitsPageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback": typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback": typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback": typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback": typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/github/oauth2/callback": typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback": typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/heroku/oauth2/callback": typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/netlify/oauth2/callback": typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId": typeof secretManagerSecretSyncDetailsByIDPageRouteRoute; + "/projects/secret-management/$projectId/integrations/vercel/oauth2/callback": typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren; + "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/": typeof secretManagerCommitDetailsPageRouteRoute; + "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore": typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute; } export interface FileRoutesByTo { - '/': typeof indexRoute - '/cli-redirect': typeof authCliRedirectPageRouteRoute - '/share-secret': typeof publicShareSecretPageRouteRoute - '': typeof organizationLayoutRouteWithChildren - '/password-setup': typeof authPasswordSetupPageRouteRoute - '/email-not-verified': typeof authEmailNotVerifiedPageRouteRoute - '/password-reset': typeof authPasswordResetPageRouteRoute - '/requestnewinvite': typeof authRequestNewInvitePageRouteRoute - '/signupinvite': typeof authSignUpInvitePageRouteRoute - '/verify-email': typeof authVerifyEmailPageRouteRoute - '/personal-settings': typeof userPersonalSettingsPageRouteRoute - '/login': typeof authLoginPageRouteRoute - '/signup': typeof authSignUpPageRouteRoute - '/organization/none': typeof organizationNoOrgPageRouteRoute - '/admin/signup': typeof adminSignUpPageRouteRoute - '/login/admin': typeof authAdminLoginPageRouteRoute - '/login/ldap': typeof authLoginLdapPageRouteRoute - '/login/select-organization': typeof authSelectOrgPageRouteRoute - '/login/sso': typeof authLoginSsoPageRouteRoute - '/signup/sso': typeof authSignUpSsoPageRouteRoute - '/secret-request/secret/$secretRequestId': typeof publicViewSecretRequestByIDPageRouteRoute - '/shared/secret/$secretId': typeof publicViewSharedSecretByIDPageRouteRoute - '/admin': typeof adminGeneralPageRouteRoute - '/login/provider/error': typeof authProviderErrorPageRouteRoute - '/login/provider/success': typeof authProviderSuccessPageRouteRoute - '/integrations': typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren - '/organization': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren - '/organization/access-management': typeof organizationAccessManagementPageRouteRoute - '/organization/audit-logs': typeof organizationAuditLogsPageRouteRoute - '/organization/billing': typeof organizationBillingPageRouteRoute - '/organization/projects': typeof organizationProjectsPageRouteRoute - '/admin/authentication': typeof adminAuthenticationPageRouteRoute - '/admin/caching': typeof adminCachingPageRouteRoute - '/admin/encryption': typeof adminEncryptionPageRouteRoute - '/admin/environment': typeof adminEnvironmentPageRouteRoute - '/admin/integrations': typeof adminIntegrationsPageRouteRoute - '/secret-manager/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren - '/organization/app-connections': typeof organizationAppConnectionsAppConnectionsPageRouteRoute - '/organization/gateways': typeof organizationGatewaysGatewayListPageRouteRoute - '/organization/secret-sharing': typeof organizationSecretSharingPageRouteRoute - '/organization/settings': typeof organizationSettingsPageRouteRoute - '/organization/groups/$groupId': typeof organizationGroupDetailsByIDPageRouteRoute - '/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute - '/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute - '/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute - '/organization/secret-sharing/settings': typeof organizationSecretSharingSettingsPageRouteRoute - '/admin/resources/machine-identities': typeof adminMachineIdentitiesResourcesPageRouteRoute - '/admin/resources/organizations': typeof adminOrganizationResourcesPageRouteRoute - '/admin/resources/user-identities': typeof adminUserIdentitiesResourcesPageRouteRoute - '/projects/cert-management/$projectId': typeof certManagerLayoutRouteWithChildren - '/projects/kms/$projectId': typeof kmsLayoutRouteWithChildren - '/projects/secret-management/$projectId': typeof secretManagerLayoutRouteWithChildren - '/projects/secret-scanning/$projectId': typeof secretScanningLayoutRouteWithChildren - '/projects/ssh/$projectId': typeof sshLayoutRouteWithChildren - '/secret-manager/$projectId/approval': typeof secretManagerRedirectsRedirectApprovalPageRoute - '/organization/settings/oauth/callback': typeof organizationSettingsPageOauthCallbackPageRouteRoute - '/integrations/azure-app-configuration/oauth2/callback': typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute - '/integrations/azure-key-vault/oauth2/callback': typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute - '/integrations/bitbucket/oauth2/callback': typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute - '/integrations/gcp-secret-manager/oauth2/callback': typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute - '/integrations/github/oauth2/callback': typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute - '/integrations/gitlab/oauth2/callback': typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute - '/integrations/heroku/oauth2/callback': typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute - '/integrations/netlify/oauth2/callback': typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute - '/integrations/vercel/oauth2/callback': typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute - '/organization/app-connections/$appConnection/oauth/callback': typeof organizationAppConnectionsOauthCallbackPageRouteRoute - '/projects/cert-management/$projectId/alerting': typeof certManagerAlertingPageRouteRoute - '/projects/cert-management/$projectId/certificate-authorities': typeof certManagerCertificateAuthoritiesPageRouteRoute - '/projects/cert-management/$projectId/certificates': typeof certManagerCertificatesPageRouteRoute - '/projects/cert-management/$projectId/settings': typeof certManagerSettingsPageRouteRoute - '/projects/kms/$projectId/kmip': typeof kmsKmipPageRouteRoute - '/projects/kms/$projectId/overview': typeof kmsOverviewPageRouteRoute - '/projects/kms/$projectId/settings': typeof kmsSettingsPageRouteRoute - '/projects/secret-management/$projectId/allowlist': typeof secretManagerIPAllowlistPageRouteRoute - '/projects/secret-management/$projectId/approval': typeof secretManagerSecretApprovalsPageRouteRoute - '/projects/secret-management/$projectId/overview': typeof secretManagerOverviewPageRouteRoute - '/projects/secret-management/$projectId/secret-rotation': typeof secretManagerSecretRotationPageRouteRoute - '/projects/secret-management/$projectId/settings': typeof secretManagerSettingsPageRouteRoute - '/projects/secret-scanning/$projectId/findings': typeof secretScanningSecretScanningFindingsPageRouteRoute - '/projects/secret-scanning/$projectId/settings': typeof secretScanningSettingsPageRouteRoute - '/projects/ssh/$projectId/cas': typeof sshSshCasPageRouteRoute - '/projects/ssh/$projectId/certificates': typeof sshSshCertsPageRouteRoute - '/projects/ssh/$projectId/overview': typeof sshSshHostsPageRouteRoute - '/projects/ssh/$projectId/settings': typeof sshSettingsPageRouteRoute - '/projects/cert-management/$projectId/access-management': typeof projectAccessControlPageRouteCertManagerRoute - '/projects/cert-management/$projectId/audit-logs': typeof projectAuditLogsPageRouteCertManagerRoute - '/projects/kms/$projectId/access-management': typeof projectAccessControlPageRouteKmsRoute - '/projects/kms/$projectId/audit-logs': typeof projectAuditLogsPageRouteKmsRoute - '/projects/secret-management/$projectId/access-management': typeof projectAccessControlPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/audit-logs': typeof projectAuditLogsPageRouteSecretManagerRoute - '/projects/secret-scanning/$projectId/access-management': typeof projectAccessControlPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/audit-logs': typeof projectAuditLogsPageRouteSecretScanningRoute - '/projects/ssh/$projectId/access-management': typeof projectAccessControlPageRouteSshRoute - '/projects/ssh/$projectId/audit-logs': typeof projectAuditLogsPageRouteSshRoute - '/projects/cert-management/$projectId/certificate-templates': typeof certManagerPkiTemplateListPageRouteRoute - '/projects/cert-management/$projectId/subscribers': typeof certManagerPkiSubscribersPageRouteRoute - '/projects/secret-management/$projectId/integrations': typeof secretManagerIntegrationsListPageRouteRoute - '/projects/secret-scanning/$projectId/data-sources': typeof secretScanningSecretScanningDataSourcesPageRouteRoute - '/projects/cert-management/$projectId/ca/$caName': typeof certManagerCertAuthDetailsByIDPageRouteRoute - '/projects/cert-management/$projectId/subscribers/$subscriberName': typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute - '/projects/secret-management/$projectId/integrations/$integrationId': typeof secretManagerIntegrationsDetailsByIDPageRouteRoute - '/projects/secret-management/$projectId/integrations/select-integration-auth': typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute - '/projects/secret-management/$projectId/secrets/$envSlug': typeof secretManagerSecretDashboardPageRouteRoute - '/projects/ssh/$projectId/ca/$caId': typeof sshSshCaByIDPageRouteRoute - '/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId': typeof sshSshHostGroupDetailsByIDPageRouteRoute - '/projects/cert-management/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteCertManagerRoute - '/projects/cert-management/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteCertManagerRoute - '/projects/cert-management/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteCertManagerRoute - '/projects/cert-management/$projectId/pki-collections/$collectionId': typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute - '/projects/cert-management/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteCertManagerRoute - '/projects/kms/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteKmsRoute - '/projects/kms/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteKmsRoute - '/projects/kms/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteKmsRoute - '/projects/kms/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteKmsRoute - '/projects/secret-management/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSecretManagerRoute - '/projects/secret-management/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute - '/projects/secret-scanning/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSecretScanningRoute - '/projects/secret-scanning/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute - '/projects/ssh/$projectId/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSshRoute - '/projects/ssh/$projectId/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSshRoute - '/projects/ssh/$projectId/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSshRoute - '/projects/ssh/$projectId/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSshRoute - '/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize': typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/aws-parameter-store/create': typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize': typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/aws-secret-manager/create': typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-app-configuration/create': typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-devops/authorize': typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-devops/create': typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-key-vault/authorize': typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-key-vault/create': typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/bitbucket/create': typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/checkly/authorize': typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/checkly/create': typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/circleci/authorize': typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/circleci/create': typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloud-66/authorize': typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloud-66/create': typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize': typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-pages/create': typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize': typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/cloudflare-workers/create': typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/codefresh/authorize': typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/codefresh/create': typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/databricks/authorize': typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/databricks/create': typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize': typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create': typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/flyio/authorize': typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/flyio/create': typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize': typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/gcp-secret-manager/create': typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/github/auth-mode-selection': typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/github/create': typeof secretManagerIntegrationsGithubConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/gitlab/authorize': typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/gitlab/create': typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize': typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/hashicorp-vault/create': typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/hasura-cloud/authorize': typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/hasura-cloud/create': typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/heroku/create': typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/laravel-forge/authorize': typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/laravel-forge/create': typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/netlify/create': typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/northflank/authorize': typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/northflank/create': typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/octopus-deploy/authorize': typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/octopus-deploy/create': typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/qovery/authorize': typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/qovery/create': typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/railway/authorize': typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/railway/create': typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/render/authorize': typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/render/create': typeof secretManagerIntegrationsRenderConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/rundeck/authorize': typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/rundeck/create': typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/supabase/authorize': typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/supabase/create': typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/teamcity/authorize': typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/teamcity/create': typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/terraform-cloud/authorize': typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/terraform-cloud/create': typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/travisci/authorize': typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/travisci/create': typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/vercel/create': typeof secretManagerIntegrationsVercelConfigurePageRouteRoute - '/projects/secret-management/$projectId/integrations/windmill/authorize': typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute - '/projects/secret-management/$projectId/integrations/windmill/create': typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute - '/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId': typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute - '/projects/secret-management/$projectId/commits/$environment/$folderId': typeof secretManagerCommitsPageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback': typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback': typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback': typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback': typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/github/oauth2/callback': typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback': typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/heroku/oauth2/callback': typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/netlify/oauth2/callback': typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId': typeof secretManagerSecretSyncDetailsByIDPageRouteRoute - '/projects/secret-management/$projectId/integrations/vercel/oauth2/callback': typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute - '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId': typeof secretManagerCommitDetailsPageRouteRoute - '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore': typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute + "/": typeof indexRoute; + "/cli-redirect": typeof authCliRedirectPageRouteRoute; + "/share-secret": typeof publicShareSecretPageRouteRoute; + "": typeof organizationLayoutRouteWithChildren; + "/password-setup": typeof authPasswordSetupPageRouteRoute; + "/email-not-verified": typeof authEmailNotVerifiedPageRouteRoute; + "/password-reset": typeof authPasswordResetPageRouteRoute; + "/requestnewinvite": typeof authRequestNewInvitePageRouteRoute; + "/signupinvite": typeof authSignUpInvitePageRouteRoute; + "/verify-email": typeof authVerifyEmailPageRouteRoute; + "/personal-settings": typeof userPersonalSettingsPageRouteRoute; + "/login": typeof authLoginPageRouteRoute; + "/signup": typeof authSignUpPageRouteRoute; + "/organization/none": typeof organizationNoOrgPageRouteRoute; + "/admin/signup": typeof adminSignUpPageRouteRoute; + "/login/admin": typeof authAdminLoginPageRouteRoute; + "/login/ldap": typeof authLoginLdapPageRouteRoute; + "/login/select-organization": typeof authSelectOrgPageRouteRoute; + "/login/sso": typeof authLoginSsoPageRouteRoute; + "/signup/sso": typeof authSignUpSsoPageRouteRoute; + "/secret-request/secret/$secretRequestId": typeof publicViewSecretRequestByIDPageRouteRoute; + "/shared/secret/$secretId": typeof publicViewSharedSecretByIDPageRouteRoute; + "/admin": typeof adminGeneralPageRouteRoute; + "/login/provider/error": typeof authProviderErrorPageRouteRoute; + "/login/provider/success": typeof authProviderSuccessPageRouteRoute; + "/integrations": typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren; + "/organization": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren; + "/organization/access-management": typeof organizationAccessManagementPageRouteRoute; + "/organization/audit-logs": typeof organizationAuditLogsPageRouteRoute; + "/organization/billing": typeof organizationBillingPageRouteRoute; + "/organization/projects": typeof organizationProjectsPageRouteRoute; + "/admin/access-management": typeof adminAccessManagementPageRouteRoute; + "/admin/authentication": typeof adminAuthenticationPageRouteRoute; + "/admin/caching": typeof adminCachingPageRouteRoute; + "/admin/encryption": typeof adminEncryptionPageRouteRoute; + "/admin/environment": typeof adminEnvironmentPageRouteRoute; + "/admin/integrations": typeof adminIntegrationsPageRouteRoute; + "/secret-manager/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren; + "/organization/app-connections": typeof organizationAppConnectionsAppConnectionsPageRouteRoute; + "/organization/gateways": typeof organizationGatewaysGatewayListPageRouteRoute; + "/organization/secret-sharing": typeof organizationSecretSharingPageRouteRoute; + "/organization/settings": typeof organizationSettingsPageRouteRoute; + "/organization/groups/$groupId": typeof organizationGroupDetailsByIDPageRouteRoute; + "/organization/identities/$identityId": typeof organizationIdentityDetailsByIDPageRouteRoute; + "/organization/members/$membershipId": typeof organizationUserDetailsByIDPageRouteRoute; + "/organization/roles/$roleId": typeof organizationRoleByIDPageRouteRoute; + "/organization/secret-sharing/settings": typeof organizationSecretSharingSettingsPageRouteRoute; + "/admin/resources/overview": typeof adminResourceOverviewPageRouteRoute; + "/projects/cert-management/$projectId": typeof certManagerLayoutRouteWithChildren; + "/projects/kms/$projectId": typeof kmsLayoutRouteWithChildren; + "/projects/secret-management/$projectId": typeof secretManagerLayoutRouteWithChildren; + "/projects/secret-scanning/$projectId": typeof secretScanningLayoutRouteWithChildren; + "/projects/ssh/$projectId": typeof sshLayoutRouteWithChildren; + "/secret-manager/$projectId/approval": typeof secretManagerRedirectsRedirectApprovalPageRoute; + "/organization/settings/oauth/callback": typeof organizationSettingsPageOauthCallbackPageRouteRoute; + "/integrations/azure-app-configuration/oauth2/callback": typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute; + "/integrations/azure-key-vault/oauth2/callback": typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute; + "/integrations/bitbucket/oauth2/callback": typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute; + "/integrations/gcp-secret-manager/oauth2/callback": typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute; + "/integrations/github/oauth2/callback": typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute; + "/integrations/gitlab/oauth2/callback": typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute; + "/integrations/heroku/oauth2/callback": typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute; + "/integrations/netlify/oauth2/callback": typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute; + "/integrations/vercel/oauth2/callback": typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute; + "/organization/app-connections/$appConnection/oauth/callback": typeof organizationAppConnectionsOauthCallbackPageRouteRoute; + "/projects/cert-management/$projectId/alerting": typeof certManagerAlertingPageRouteRoute; + "/projects/cert-management/$projectId/certificate-authorities": typeof certManagerCertificateAuthoritiesPageRouteRoute; + "/projects/cert-management/$projectId/certificates": typeof certManagerCertificatesPageRouteRoute; + "/projects/cert-management/$projectId/settings": typeof certManagerSettingsPageRouteRoute; + "/projects/kms/$projectId/kmip": typeof kmsKmipPageRouteRoute; + "/projects/kms/$projectId/overview": typeof kmsOverviewPageRouteRoute; + "/projects/kms/$projectId/settings": typeof kmsSettingsPageRouteRoute; + "/projects/secret-management/$projectId/allowlist": typeof secretManagerIPAllowlistPageRouteRoute; + "/projects/secret-management/$projectId/approval": typeof secretManagerSecretApprovalsPageRouteRoute; + "/projects/secret-management/$projectId/overview": typeof secretManagerOverviewPageRouteRoute; + "/projects/secret-management/$projectId/secret-rotation": typeof secretManagerSecretRotationPageRouteRoute; + "/projects/secret-management/$projectId/settings": typeof secretManagerSettingsPageRouteRoute; + "/projects/secret-scanning/$projectId/findings": typeof secretScanningSecretScanningFindingsPageRouteRoute; + "/projects/secret-scanning/$projectId/settings": typeof secretScanningSettingsPageRouteRoute; + "/projects/ssh/$projectId/cas": typeof sshSshCasPageRouteRoute; + "/projects/ssh/$projectId/certificates": typeof sshSshCertsPageRouteRoute; + "/projects/ssh/$projectId/overview": typeof sshSshHostsPageRouteRoute; + "/projects/ssh/$projectId/settings": typeof sshSettingsPageRouteRoute; + "/projects/cert-management/$projectId/access-management": typeof projectAccessControlPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/audit-logs": typeof projectAuditLogsPageRouteCertManagerRoute; + "/projects/kms/$projectId/access-management": typeof projectAccessControlPageRouteKmsRoute; + "/projects/kms/$projectId/audit-logs": typeof projectAuditLogsPageRouteKmsRoute; + "/projects/secret-management/$projectId/access-management": typeof projectAccessControlPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/audit-logs": typeof projectAuditLogsPageRouteSecretManagerRoute; + "/projects/secret-scanning/$projectId/access-management": typeof projectAccessControlPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/audit-logs": typeof projectAuditLogsPageRouteSecretScanningRoute; + "/projects/ssh/$projectId/access-management": typeof projectAccessControlPageRouteSshRoute; + "/projects/ssh/$projectId/audit-logs": typeof projectAuditLogsPageRouteSshRoute; + "/projects/cert-management/$projectId/certificate-templates": typeof certManagerPkiTemplateListPageRouteRoute; + "/projects/cert-management/$projectId/subscribers": typeof certManagerPkiSubscribersPageRouteRoute; + "/projects/secret-management/$projectId/integrations": typeof secretManagerIntegrationsListPageRouteRoute; + "/projects/secret-scanning/$projectId/data-sources": typeof secretScanningSecretScanningDataSourcesPageRouteRoute; + "/projects/cert-management/$projectId/ca/$caName": typeof certManagerCertAuthDetailsByIDPageRouteRoute; + "/projects/cert-management/$projectId/subscribers/$subscriberName": typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute; + "/projects/secret-management/$projectId/integrations/$integrationId": typeof secretManagerIntegrationsDetailsByIDPageRouteRoute; + "/projects/secret-management/$projectId/integrations/select-integration-auth": typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute; + "/projects/secret-management/$projectId/secrets/$envSlug": typeof secretManagerSecretDashboardPageRouteRoute; + "/projects/ssh/$projectId/ca/$caId": typeof sshSshCaByIDPageRouteRoute; + "/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId": typeof sshSshHostGroupDetailsByIDPageRouteRoute; + "/projects/cert-management/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteCertManagerRoute; + "/projects/cert-management/$projectId/pki-collections/$collectionId": typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute; + "/projects/cert-management/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteCertManagerRoute; + "/projects/kms/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteKmsRoute; + "/projects/kms/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteKmsRoute; + "/projects/kms/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteKmsRoute; + "/projects/kms/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteKmsRoute; + "/projects/secret-management/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSecretManagerRoute; + "/projects/secret-management/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute; + "/projects/secret-scanning/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSecretScanningRoute; + "/projects/secret-scanning/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute; + "/projects/ssh/$projectId/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSshRoute; + "/projects/ssh/$projectId/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSshRoute; + "/projects/ssh/$projectId/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSshRoute; + "/projects/ssh/$projectId/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSshRoute; + "/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize": typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/aws-parameter-store/create": typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize": typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/aws-secret-manager/create": typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-app-configuration/create": typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-devops/authorize": typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-devops/create": typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize": typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-key-vault/create": typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/bitbucket/create": typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/checkly/authorize": typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/checkly/create": typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/circleci/authorize": typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/circleci/create": typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloud-66/authorize": typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloud-66/create": typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize": typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-pages/create": typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize": typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/cloudflare-workers/create": typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/codefresh/authorize": typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/codefresh/create": typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/databricks/authorize": typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/databricks/create": typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize": typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create": typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/flyio/authorize": typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/flyio/create": typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize": typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gcp-secret-manager/create": typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/github/auth-mode-selection": typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/github/create": typeof secretManagerIntegrationsGithubConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gitlab/authorize": typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/gitlab/create": typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize": typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hashicorp-vault/create": typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hasura-cloud/authorize": typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/hasura-cloud/create": typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/heroku/create": typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/laravel-forge/authorize": typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/laravel-forge/create": typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/netlify/create": typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/northflank/authorize": typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/northflank/create": typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/octopus-deploy/authorize": typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/octopus-deploy/create": typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/qovery/authorize": typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/qovery/create": typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/railway/authorize": typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/railway/create": typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/render/authorize": typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/render/create": typeof secretManagerIntegrationsRenderConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/rundeck/authorize": typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/rundeck/create": typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/supabase/authorize": typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/supabase/create": typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/teamcity/authorize": typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/teamcity/create": typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/terraform-cloud/authorize": typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/terraform-cloud/create": typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/travisci/authorize": typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/travisci/create": typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/vercel/create": typeof secretManagerIntegrationsVercelConfigurePageRouteRoute; + "/projects/secret-management/$projectId/integrations/windmill/authorize": typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute; + "/projects/secret-management/$projectId/integrations/windmill/create": typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute; + "/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId": typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute; + "/projects/secret-management/$projectId/commits/$environment/$folderId": typeof secretManagerCommitsPageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback": typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback": typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback": typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback": typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/github/oauth2/callback": typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback": typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/heroku/oauth2/callback": typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/netlify/oauth2/callback": typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId": typeof secretManagerSecretSyncDetailsByIDPageRouteRoute; + "/projects/secret-management/$projectId/integrations/vercel/oauth2/callback": typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute; + "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId": typeof secretManagerCommitDetailsPageRouteRoute; + "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore": typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute; } export interface FileRoutesById { - __root__: typeof rootRoute - '/': typeof indexRoute - '/cli-redirect': typeof authCliRedirectPageRouteRoute - '/share-secret': typeof publicShareSecretPageRouteRoute - '/_authenticate': typeof middlewaresAuthenticateRouteWithChildren - '/_restrict-login-signup': typeof middlewaresRestrictLoginSignupRouteWithChildren - '/_authenticate/password-setup': typeof authPasswordSetupPageRouteRoute - '/_restrict-login-signup/email-not-verified': typeof authEmailNotVerifiedPageRouteRoute - '/_restrict-login-signup/password-reset': typeof authPasswordResetPageRouteRoute - '/_restrict-login-signup/requestnewinvite': typeof authRequestNewInvitePageRouteRoute - '/_restrict-login-signup/signupinvite': typeof authSignUpInvitePageRouteRoute - '/_restrict-login-signup/verify-email': typeof authVerifyEmailPageRouteRoute - '/_authenticate/_inject-org-details': typeof middlewaresInjectOrgDetailsRouteWithChildren - '/_authenticate/personal-settings': typeof AuthenticatePersonalSettingsRouteWithChildren - '/_restrict-login-signup/login': typeof RestrictLoginSignupLoginRouteWithChildren - '/_restrict-login-signup/signup': typeof RestrictLoginSignupSignupRouteWithChildren - '/_restrict-login-signup/login/': typeof authLoginPageRouteRoute - '/_restrict-login-signup/signup/': typeof authSignUpPageRouteRoute - '/_authenticate/organization/none': typeof organizationNoOrgPageRouteRoute - '/_restrict-login-signup/admin/signup': typeof adminSignUpPageRouteRoute - '/_restrict-login-signup/login/admin': typeof authAdminLoginPageRouteRoute - '/_restrict-login-signup/login/ldap': typeof authLoginLdapPageRouteRoute - '/_restrict-login-signup/login/select-organization': typeof authSelectOrgPageRouteRoute - '/_restrict-login-signup/login/sso': typeof authLoginSsoPageRouteRoute - '/_restrict-login-signup/signup/sso': typeof authSignUpSsoPageRouteRoute - '/secret-request/secret/$secretRequestId': typeof publicViewSecretRequestByIDPageRouteRoute - '/shared/secret/$secretId': typeof publicViewSharedSecretByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout': typeof organizationLayoutRouteWithChildren - '/_authenticate/_inject-org-details/admin': typeof AuthenticateInjectOrgDetailsAdminRouteWithChildren - '/_authenticate/personal-settings/_layout': typeof userLayoutRouteWithChildren - '/_authenticate/personal-settings/_layout/': typeof userPersonalSettingsPageRouteRoute - '/_restrict-login-signup/login/provider/error': typeof authProviderErrorPageRouteRoute - '/_restrict-login-signup/login/provider/success': typeof authProviderSuccessPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/integrations': typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/organization': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren - '/_authenticate/_inject-org-details/admin/_admin-layout': typeof adminLayoutRouteWithChildren - '/_authenticate/_inject-org-details/admin/_admin-layout/': typeof adminGeneralPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/access-management': typeof organizationAccessManagementPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs': typeof organizationAuditLogsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/billing': typeof organizationBillingPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/projects': typeof organizationProjectsPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/authentication': typeof adminAuthenticationPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/caching': typeof adminCachingPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/encryption': typeof adminEncryptionPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/environment': typeof adminEnvironmentPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/integrations': typeof adminIntegrationsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/app-connections': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/organization/gateways': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/organization/settings': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/': typeof organizationAppConnectionsAppConnectionsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/gateways/': typeof organizationGatewaysGatewayListPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/': typeof organizationSecretSharingPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/settings/': typeof organizationSettingsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId': typeof organizationGroupDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings': typeof organizationSecretSharingSettingsPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/resources/machine-identities': typeof adminMachineIdentitiesResourcesPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/resources/organizations': typeof adminOrganizationResourcesPageRouteRoute - '/_authenticate/_inject-org-details/admin/_admin-layout/resources/user-identities': typeof adminUserIdentitiesResourcesPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval': typeof secretManagerRedirectsRedirectApprovalPageRoute - '/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback': typeof organizationSettingsPageOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback': typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback': typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback': typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback': typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback': typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback': typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback': typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback': typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback': typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout': typeof certManagerLayoutRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout': typeof kmsLayoutRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout': typeof secretManagerLayoutRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout': typeof secretScanningLayoutRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout': typeof sshLayoutRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback': typeof organizationAppConnectionsOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting': typeof certManagerAlertingPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities': typeof certManagerCertificateAuthoritiesPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates': typeof certManagerCertificatesPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings': typeof certManagerSettingsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip': typeof kmsKmipPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview': typeof kmsOverviewPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings': typeof kmsSettingsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist': typeof secretManagerIPAllowlistPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval': typeof secretManagerSecretApprovalsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview': typeof secretManagerOverviewPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation': typeof secretManagerSecretRotationPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings': typeof secretManagerSettingsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings': typeof secretScanningSecretScanningFindingsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings': typeof secretScanningSettingsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas': typeof sshSshCasPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates': typeof sshSshCertsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview': typeof sshSshHostsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings': typeof sshSettingsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management': typeof projectAccessControlPageRouteCertManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs': typeof projectAuditLogsPageRouteCertManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management': typeof projectAccessControlPageRouteKmsRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs': typeof projectAuditLogsPageRouteKmsRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management': typeof projectAccessControlPageRouteSecretManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs': typeof projectAuditLogsPageRouteSecretManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management': typeof projectAccessControlPageRouteSecretScanningRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs': typeof projectAuditLogsPageRouteSecretScanningRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management': typeof projectAccessControlPageRouteSshRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs': typeof projectAuditLogsPageRouteSshRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/': typeof certManagerPkiTemplateListPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/': typeof certManagerPkiSubscribersPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/': typeof secretManagerIntegrationsListPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/': typeof secretScanningSecretScanningDataSourcesPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName': typeof certManagerCertAuthDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName': typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId': typeof secretManagerIntegrationsDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth': typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug': typeof secretManagerSecretDashboardPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId': typeof sshSshCaByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId': typeof sshSshHostGroupDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId': typeof projectGroupDetailsByIDPageRouteCertManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteCertManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId': typeof projectMemberDetailsByIDPageRouteCertManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId': typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute - '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteCertManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId': typeof projectGroupDetailsByIDPageRouteKmsRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteKmsRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId': typeof projectMemberDetailsByIDPageRouteKmsRoute - '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteKmsRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSecretManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSecretManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSecretScanningRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSecretScanningRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId': typeof projectGroupDetailsByIDPageRouteSshRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId': typeof projectIdentityDetailsByIDPageRouteSshRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId': typeof projectMemberDetailsByIDPageRouteSshRoute - '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug': typeof projectRoleDetailsBySlugPageRouteSshRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize': typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create': typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize': typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create': typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create': typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize': typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create': typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize': typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create': typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create': typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize': typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create': typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize': typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create': typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize': typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create': typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize': typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create': typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize': typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create': typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize': typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create': typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize': typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create': typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize': typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create': typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize': typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create': typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize': typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create': typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection': typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create': typeof secretManagerIntegrationsGithubConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize': typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create': typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize': typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create': typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize': typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create': typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create': typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize': typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create': typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create': typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize': typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create': typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize': typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create': typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize': typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create': typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize': typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create': typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize': typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create': typeof secretManagerIntegrationsRenderConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize': typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create': typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize': typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create': typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize': typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create': typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize': typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create': typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize': typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create': typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create': typeof secretManagerIntegrationsVercelConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize': typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create': typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId': typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/': typeof secretManagerCommitsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback': typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback': typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback': typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback': typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback': typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback': typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback': typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback': typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId': typeof secretManagerSecretSyncDetailsByIDPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback': typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/': typeof secretManagerCommitDetailsPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore': typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute + __root__: typeof rootRoute; + "/": typeof indexRoute; + "/cli-redirect": typeof authCliRedirectPageRouteRoute; + "/share-secret": typeof publicShareSecretPageRouteRoute; + "/_authenticate": typeof middlewaresAuthenticateRouteWithChildren; + "/_restrict-login-signup": typeof middlewaresRestrictLoginSignupRouteWithChildren; + "/_authenticate/password-setup": typeof authPasswordSetupPageRouteRoute; + "/_restrict-login-signup/email-not-verified": typeof authEmailNotVerifiedPageRouteRoute; + "/_restrict-login-signup/password-reset": typeof authPasswordResetPageRouteRoute; + "/_restrict-login-signup/requestnewinvite": typeof authRequestNewInvitePageRouteRoute; + "/_restrict-login-signup/signupinvite": typeof authSignUpInvitePageRouteRoute; + "/_restrict-login-signup/verify-email": typeof authVerifyEmailPageRouteRoute; + "/_authenticate/_inject-org-details": typeof middlewaresInjectOrgDetailsRouteWithChildren; + "/_authenticate/personal-settings": typeof AuthenticatePersonalSettingsRouteWithChildren; + "/_restrict-login-signup/login": typeof RestrictLoginSignupLoginRouteWithChildren; + "/_restrict-login-signup/signup": typeof RestrictLoginSignupSignupRouteWithChildren; + "/_restrict-login-signup/login/": typeof authLoginPageRouteRoute; + "/_restrict-login-signup/signup/": typeof authSignUpPageRouteRoute; + "/_authenticate/organization/none": typeof organizationNoOrgPageRouteRoute; + "/_restrict-login-signup/admin/signup": typeof adminSignUpPageRouteRoute; + "/_restrict-login-signup/login/admin": typeof authAdminLoginPageRouteRoute; + "/_restrict-login-signup/login/ldap": typeof authLoginLdapPageRouteRoute; + "/_restrict-login-signup/login/select-organization": typeof authSelectOrgPageRouteRoute; + "/_restrict-login-signup/login/sso": typeof authLoginSsoPageRouteRoute; + "/_restrict-login-signup/signup/sso": typeof authSignUpSsoPageRouteRoute; + "/secret-request/secret/$secretRequestId": typeof publicViewSecretRequestByIDPageRouteRoute; + "/shared/secret/$secretId": typeof publicViewSharedSecretByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout": typeof organizationLayoutRouteWithChildren; + "/_authenticate/_inject-org-details/admin": typeof AuthenticateInjectOrgDetailsAdminRouteWithChildren; + "/_authenticate/personal-settings/_layout": typeof userLayoutRouteWithChildren; + "/_authenticate/personal-settings/_layout/": typeof userPersonalSettingsPageRouteRoute; + "/_restrict-login-signup/login/provider/error": typeof authProviderErrorPageRouteRoute; + "/_restrict-login-signup/login/provider/success": typeof authProviderSuccessPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations": typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/organization": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren; + "/_authenticate/_inject-org-details/admin/_admin-layout": typeof adminLayoutRouteWithChildren; + "/_authenticate/_inject-org-details/admin/_admin-layout/": typeof adminGeneralPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/access-management": typeof organizationAccessManagementPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/audit-logs": typeof organizationAuditLogsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/billing": typeof organizationBillingPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/projects": typeof organizationProjectsPageRouteRoute; + "/_authenticate/_inject-org-details/admin/_admin-layout/access-management": typeof adminAccessManagementPageRouteRoute; + "/_authenticate/_inject-org-details/admin/_admin-layout/authentication": typeof adminAuthenticationPageRouteRoute; + "/_authenticate/_inject-org-details/admin/_admin-layout/caching": typeof adminCachingPageRouteRoute; + "/_authenticate/_inject-org-details/admin/_admin-layout/encryption": typeof adminEncryptionPageRouteRoute; + "/_authenticate/_inject-org-details/admin/_admin-layout/environment": typeof adminEnvironmentPageRouteRoute; + "/_authenticate/_inject-org-details/admin/_admin-layout/integrations": typeof adminIntegrationsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/app-connections": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/organization/gateways": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/organization/settings": typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/": typeof organizationAppConnectionsAppConnectionsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/gateways/": typeof organizationGatewaysGatewayListPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/": typeof organizationSecretSharingPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/settings/": typeof organizationSettingsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId": typeof organizationGroupDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId": typeof organizationIdentityDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId": typeof organizationUserDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId": typeof organizationRoleByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings": typeof organizationSecretSharingSettingsPageRouteRoute; + "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview": typeof adminResourceOverviewPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSshProjectIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval": typeof secretManagerRedirectsRedirectApprovalPageRoute; + "/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback": typeof organizationSettingsPageOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback": typeof secretManagerIntegrationsRouteAzureAppConfigurationsOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback": typeof secretManagerIntegrationsRouteAzureKeyVaultOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback": typeof secretManagerIntegrationsRouteBitbucketOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback": typeof secretManagerIntegrationsRouteGcpOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback": typeof secretManagerIntegrationsRouteGithubOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback": typeof secretManagerIntegrationsRouteGitlabOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback": typeof secretManagerIntegrationsRouteHerokuOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback": typeof secretManagerIntegrationsRouteNetlifyOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback": typeof secretManagerIntegrationsRouteVercelOauthRedirectRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout": typeof certManagerLayoutRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout": typeof kmsLayoutRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout": typeof secretManagerLayoutRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout": typeof secretScanningLayoutRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout": typeof sshLayoutRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback": typeof organizationAppConnectionsOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting": typeof certManagerAlertingPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities": typeof certManagerCertificateAuthoritiesPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates": typeof certManagerCertificatesPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings": typeof certManagerSettingsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip": typeof kmsKmipPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview": typeof kmsOverviewPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings": typeof kmsSettingsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist": typeof secretManagerIPAllowlistPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval": typeof secretManagerSecretApprovalsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview": typeof secretManagerOverviewPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation": typeof secretManagerSecretRotationPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings": typeof secretManagerSettingsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings": typeof secretScanningSecretScanningFindingsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings": typeof secretScanningSettingsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas": typeof sshSshCasPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates": typeof sshSshCertsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview": typeof sshSshHostsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings": typeof sshSettingsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management": typeof projectAccessControlPageRouteCertManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs": typeof projectAuditLogsPageRouteCertManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutCertificateTemplatesRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdCertManagerLayoutSubscribersRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management": typeof projectAccessControlPageRouteKmsRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs": typeof projectAuditLogsPageRouteKmsRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management": typeof projectAccessControlPageRouteSecretManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs": typeof projectAuditLogsPageRouteSecretManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutIntegrationsRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management": typeof projectAccessControlPageRouteSecretScanningRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs": typeof projectAuditLogsPageRouteSecretScanningRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretScanningProjectIdSecretScanningLayoutDataSourcesRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management": typeof projectAccessControlPageRouteSshRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs": typeof projectAuditLogsPageRouteSshRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/": typeof certManagerPkiTemplateListPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/": typeof certManagerPkiSubscribersPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/": typeof secretManagerIntegrationsListPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/": typeof secretScanningSecretScanningDataSourcesPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName": typeof certManagerCertAuthDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName": typeof certManagerPkiSubscriberDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId": typeof secretManagerIntegrationsDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth": typeof secretManagerIntegrationsSelectIntegrationAuthPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug": typeof secretManagerSecretDashboardPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId": typeof sshSshCaByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId": typeof sshSshHostGroupDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId": typeof projectGroupDetailsByIDPageRouteCertManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteCertManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId": typeof projectMemberDetailsByIDPageRouteCertManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId": typeof certManagerPkiCollectionDetailsByIDPageRoutesRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteCertManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId": typeof projectGroupDetailsByIDPageRouteKmsRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteKmsRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId": typeof projectMemberDetailsByIDPageRouteKmsRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteKmsRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSecretManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSecretManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSecretManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSecretManagerRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSecretScanningRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSecretScanningRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSecretScanningRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSecretScanningRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId": typeof projectGroupDetailsByIDPageRouteSshRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId": typeof projectIdentityDetailsByIDPageRouteSshRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId": typeof projectMemberDetailsByIDPageRouteSshRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug": typeof projectRoleDetailsBySlugPageRouteSshRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize": typeof secretManagerIntegrationsAwsParameterStoreAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create": typeof secretManagerIntegrationsAwsParameterStoreConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize": typeof secretManagerIntegrationsAwsSecretManagerAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create": typeof secretManagerIntegrationsAwsSecretManagerConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create": typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize": typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create": typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize": typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create": typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create": typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize": typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create": typeof secretManagerIntegrationsChecklyConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize": typeof secretManagerIntegrationsCircleCIAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create": typeof secretManagerIntegrationsCircleCIConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize": typeof secretManagerIntegrationsCloud66AuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create": typeof secretManagerIntegrationsCloud66ConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize": typeof secretManagerIntegrationsCloudflarePagesAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create": typeof secretManagerIntegrationsCloudflarePagesConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize": typeof secretManagerIntegrationsCloudflareWorkersAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create": typeof secretManagerIntegrationsCloudflareWorkersConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize": typeof secretManagerIntegrationsCodefreshAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create": typeof secretManagerIntegrationsCodefreshConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize": typeof secretManagerIntegrationsDatabricksAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create": typeof secretManagerIntegrationsDatabricksConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize": typeof secretManagerIntegrationsDigitalOceanAppPlatformAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create": typeof secretManagerIntegrationsDigitalOceanAppPlatformConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize": typeof secretManagerIntegrationsFlyioAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create": typeof secretManagerIntegrationsFlyioConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize": typeof secretManagerIntegrationsGcpSecretManagerAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create": typeof secretManagerIntegrationsGcpSecretManagerConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection": typeof secretManagerIntegrationsGithubAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create": typeof secretManagerIntegrationsGithubConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize": typeof secretManagerIntegrationsGitlabAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create": typeof secretManagerIntegrationsGitlabConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize": typeof secretManagerIntegrationsHashicorpVaultAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create": typeof secretManagerIntegrationsHashicorpVaultConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize": typeof secretManagerIntegrationsHasuraCloudAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create": typeof secretManagerIntegrationsHasuraCloudConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create": typeof secretManagerIntegrationsHerokuConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize": typeof secretManagerIntegrationsLaravelForgeAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create": typeof secretManagerIntegrationsLaravelForgeConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create": typeof secretManagerIntegrationsNetlifyConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize": typeof secretManagerIntegrationsNorthflankAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create": typeof secretManagerIntegrationsNorthflankConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize": typeof secretManagerIntegrationsOctopusDeployAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create": typeof secretManagerIntegrationsOctopusDeployConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize": typeof secretManagerIntegrationsQoveryAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create": typeof secretManagerIntegrationsQoveryConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize": typeof secretManagerIntegrationsRailwayAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create": typeof secretManagerIntegrationsRailwayConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize": typeof secretManagerIntegrationsRenderAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create": typeof secretManagerIntegrationsRenderConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize": typeof secretManagerIntegrationsRundeckAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create": typeof secretManagerIntegrationsRundeckConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize": typeof secretManagerIntegrationsSupabaseAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create": typeof secretManagerIntegrationsSupabaseConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize": typeof secretManagerIntegrationsTeamcityAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create": typeof secretManagerIntegrationsTeamcityConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize": typeof secretManagerIntegrationsTerraformCloudAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create": typeof secretManagerIntegrationsTerraformCloudConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize": typeof secretManagerIntegrationsTravisCIAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create": typeof secretManagerIntegrationsTravisCIConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create": typeof secretManagerIntegrationsVercelConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize": typeof secretManagerIntegrationsWindmillAuthorizePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create": typeof secretManagerIntegrationsWindmillConfigurePageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId": typeof secretScanningSecretScanningDataSourceByIdPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/": typeof secretManagerCommitsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback": typeof secretManagerIntegrationsAzureAppConfigurationOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback": typeof secretManagerIntegrationsAzureKeyVaultOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback": typeof secretManagerIntegrationsBitbucketOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback": typeof secretManagerIntegrationsGcpSecretManagerOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback": typeof secretManagerIntegrationsGithubOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback": typeof secretManagerIntegrationsGitlabOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback": typeof secretManagerIntegrationsHerokuOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback": typeof secretManagerIntegrationsNetlifyOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId": typeof secretManagerSecretSyncDetailsByIDPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback": typeof secretManagerIntegrationsVercelOauthCallbackPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId": typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsSecretManagementProjectIdSecretManagerLayoutCommitsEnvironmentFolderIdCommitIdRouteWithChildren; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/": typeof secretManagerCommitDetailsPageRouteRoute; + "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore": typeof secretManagerCommitDetailsPageComponentsRollbackPreviewTabRouteRoute; } export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath + fileRoutesByFullPath: FileRoutesByFullPath; fullPaths: - | '/' - | '/cli-redirect' - | '/share-secret' - | '' - | '/password-setup' - | '/email-not-verified' - | '/password-reset' - | '/requestnewinvite' - | '/signupinvite' - | '/verify-email' - | '/personal-settings' - | '/login' - | '/signup' - | '/login/' - | '/signup/' - | '/organization/none' - | '/admin/signup' - | '/login/admin' - | '/login/ldap' - | '/login/select-organization' - | '/login/sso' - | '/signup/sso' - | '/secret-request/secret/$secretRequestId' - | '/shared/secret/$secretId' - | '/admin' - | '/personal-settings/' - | '/login/provider/error' - | '/login/provider/success' - | '/integrations' - | '/organization' - | '/admin/' - | '/organization/access-management' - | '/organization/audit-logs' - | '/organization/billing' - | '/organization/projects' - | '/admin/authentication' - | '/admin/caching' - | '/admin/encryption' - | '/admin/environment' - | '/admin/integrations' - | '/organization/app-connections' - | '/organization/gateways' - | '/organization/secret-sharing' - | '/organization/settings' - | '/secret-manager/$projectId' - | '/organization/app-connections/' - | '/organization/gateways/' - | '/organization/secret-sharing/' - | '/organization/settings/' - | '/organization/groups/$groupId' - | '/organization/identities/$identityId' - | '/organization/members/$membershipId' - | '/organization/roles/$roleId' - | '/organization/secret-sharing/settings' - | '/admin/resources/machine-identities' - | '/admin/resources/organizations' - | '/admin/resources/user-identities' - | '/projects/cert-management/$projectId' - | '/projects/kms/$projectId' - | '/projects/secret-management/$projectId' - | '/projects/secret-scanning/$projectId' - | '/projects/ssh/$projectId' - | '/secret-manager/$projectId/approval' - | '/organization/settings/oauth/callback' - | '/integrations/azure-app-configuration/oauth2/callback' - | '/integrations/azure-key-vault/oauth2/callback' - | '/integrations/bitbucket/oauth2/callback' - | '/integrations/gcp-secret-manager/oauth2/callback' - | '/integrations/github/oauth2/callback' - | '/integrations/gitlab/oauth2/callback' - | '/integrations/heroku/oauth2/callback' - | '/integrations/netlify/oauth2/callback' - | '/integrations/vercel/oauth2/callback' - | '/organization/app-connections/$appConnection/oauth/callback' - | '/projects/cert-management/$projectId/alerting' - | '/projects/cert-management/$projectId/certificate-authorities' - | '/projects/cert-management/$projectId/certificates' - | '/projects/cert-management/$projectId/settings' - | '/projects/kms/$projectId/kmip' - | '/projects/kms/$projectId/overview' - | '/projects/kms/$projectId/settings' - | '/projects/secret-management/$projectId/allowlist' - | '/projects/secret-management/$projectId/approval' - | '/projects/secret-management/$projectId/overview' - | '/projects/secret-management/$projectId/secret-rotation' - | '/projects/secret-management/$projectId/settings' - | '/projects/secret-scanning/$projectId/findings' - | '/projects/secret-scanning/$projectId/settings' - | '/projects/ssh/$projectId/cas' - | '/projects/ssh/$projectId/certificates' - | '/projects/ssh/$projectId/overview' - | '/projects/ssh/$projectId/settings' - | '/projects/cert-management/$projectId/access-management' - | '/projects/cert-management/$projectId/audit-logs' - | '/projects/cert-management/$projectId/certificate-templates' - | '/projects/cert-management/$projectId/subscribers' - | '/projects/kms/$projectId/access-management' - | '/projects/kms/$projectId/audit-logs' - | '/projects/secret-management/$projectId/access-management' - | '/projects/secret-management/$projectId/audit-logs' - | '/projects/secret-management/$projectId/integrations' - | '/projects/secret-scanning/$projectId/access-management' - | '/projects/secret-scanning/$projectId/audit-logs' - | '/projects/secret-scanning/$projectId/data-sources' - | '/projects/ssh/$projectId/access-management' - | '/projects/ssh/$projectId/audit-logs' - | '/projects/cert-management/$projectId/certificate-templates/' - | '/projects/cert-management/$projectId/subscribers/' - | '/projects/secret-management/$projectId/integrations/' - | '/projects/secret-scanning/$projectId/data-sources/' - | '/projects/cert-management/$projectId/ca/$caName' - | '/projects/cert-management/$projectId/subscribers/$subscriberName' - | '/projects/secret-management/$projectId/integrations/$integrationId' - | '/projects/secret-management/$projectId/integrations/select-integration-auth' - | '/projects/secret-management/$projectId/secrets/$envSlug' - | '/projects/ssh/$projectId/ca/$caId' - | '/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId' - | '/projects/cert-management/$projectId/groups/$groupId' - | '/projects/cert-management/$projectId/identities/$identityId' - | '/projects/cert-management/$projectId/members/$membershipId' - | '/projects/cert-management/$projectId/pki-collections/$collectionId' - | '/projects/cert-management/$projectId/roles/$roleSlug' - | '/projects/kms/$projectId/groups/$groupId' - | '/projects/kms/$projectId/identities/$identityId' - | '/projects/kms/$projectId/members/$membershipId' - | '/projects/kms/$projectId/roles/$roleSlug' - | '/projects/secret-management/$projectId/groups/$groupId' - | '/projects/secret-management/$projectId/identities/$identityId' - | '/projects/secret-management/$projectId/members/$membershipId' - | '/projects/secret-management/$projectId/roles/$roleSlug' - | '/projects/secret-scanning/$projectId/groups/$groupId' - | '/projects/secret-scanning/$projectId/identities/$identityId' - | '/projects/secret-scanning/$projectId/members/$membershipId' - | '/projects/secret-scanning/$projectId/roles/$roleSlug' - | '/projects/ssh/$projectId/groups/$groupId' - | '/projects/ssh/$projectId/identities/$identityId' - | '/projects/ssh/$projectId/members/$membershipId' - | '/projects/ssh/$projectId/roles/$roleSlug' - | '/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize' - | '/projects/secret-management/$projectId/integrations/aws-parameter-store/create' - | '/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize' - | '/projects/secret-management/$projectId/integrations/aws-secret-manager/create' - | '/projects/secret-management/$projectId/integrations/azure-app-configuration/create' - | '/projects/secret-management/$projectId/integrations/azure-devops/authorize' - | '/projects/secret-management/$projectId/integrations/azure-devops/create' - | '/projects/secret-management/$projectId/integrations/azure-key-vault/authorize' - | '/projects/secret-management/$projectId/integrations/azure-key-vault/create' - | '/projects/secret-management/$projectId/integrations/bitbucket/create' - | '/projects/secret-management/$projectId/integrations/checkly/authorize' - | '/projects/secret-management/$projectId/integrations/checkly/create' - | '/projects/secret-management/$projectId/integrations/circleci/authorize' - | '/projects/secret-management/$projectId/integrations/circleci/create' - | '/projects/secret-management/$projectId/integrations/cloud-66/authorize' - | '/projects/secret-management/$projectId/integrations/cloud-66/create' - | '/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize' - | '/projects/secret-management/$projectId/integrations/cloudflare-pages/create' - | '/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize' - | '/projects/secret-management/$projectId/integrations/cloudflare-workers/create' - | '/projects/secret-management/$projectId/integrations/codefresh/authorize' - | '/projects/secret-management/$projectId/integrations/codefresh/create' - | '/projects/secret-management/$projectId/integrations/databricks/authorize' - | '/projects/secret-management/$projectId/integrations/databricks/create' - | '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize' - | '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create' - | '/projects/secret-management/$projectId/integrations/flyio/authorize' - | '/projects/secret-management/$projectId/integrations/flyio/create' - | '/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize' - | '/projects/secret-management/$projectId/integrations/gcp-secret-manager/create' - | '/projects/secret-management/$projectId/integrations/github/auth-mode-selection' - | '/projects/secret-management/$projectId/integrations/github/create' - | '/projects/secret-management/$projectId/integrations/gitlab/authorize' - | '/projects/secret-management/$projectId/integrations/gitlab/create' - | '/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize' - | '/projects/secret-management/$projectId/integrations/hashicorp-vault/create' - | '/projects/secret-management/$projectId/integrations/hasura-cloud/authorize' - | '/projects/secret-management/$projectId/integrations/hasura-cloud/create' - | '/projects/secret-management/$projectId/integrations/heroku/create' - | '/projects/secret-management/$projectId/integrations/laravel-forge/authorize' - | '/projects/secret-management/$projectId/integrations/laravel-forge/create' - | '/projects/secret-management/$projectId/integrations/netlify/create' - | '/projects/secret-management/$projectId/integrations/northflank/authorize' - | '/projects/secret-management/$projectId/integrations/northflank/create' - | '/projects/secret-management/$projectId/integrations/octopus-deploy/authorize' - | '/projects/secret-management/$projectId/integrations/octopus-deploy/create' - | '/projects/secret-management/$projectId/integrations/qovery/authorize' - | '/projects/secret-management/$projectId/integrations/qovery/create' - | '/projects/secret-management/$projectId/integrations/railway/authorize' - | '/projects/secret-management/$projectId/integrations/railway/create' - | '/projects/secret-management/$projectId/integrations/render/authorize' - | '/projects/secret-management/$projectId/integrations/render/create' - | '/projects/secret-management/$projectId/integrations/rundeck/authorize' - | '/projects/secret-management/$projectId/integrations/rundeck/create' - | '/projects/secret-management/$projectId/integrations/supabase/authorize' - | '/projects/secret-management/$projectId/integrations/supabase/create' - | '/projects/secret-management/$projectId/integrations/teamcity/authorize' - | '/projects/secret-management/$projectId/integrations/teamcity/create' - | '/projects/secret-management/$projectId/integrations/terraform-cloud/authorize' - | '/projects/secret-management/$projectId/integrations/terraform-cloud/create' - | '/projects/secret-management/$projectId/integrations/travisci/authorize' - | '/projects/secret-management/$projectId/integrations/travisci/create' - | '/projects/secret-management/$projectId/integrations/vercel/create' - | '/projects/secret-management/$projectId/integrations/windmill/authorize' - | '/projects/secret-management/$projectId/integrations/windmill/create' - | '/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId' - | '/projects/secret-management/$projectId/commits/$environment/$folderId' - | '/projects/secret-management/$projectId/commits/$environment/$folderId/' - | '/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/github/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/heroku/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/netlify/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId' - | '/projects/secret-management/$projectId/integrations/vercel/oauth2/callback' - | '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId' - | '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/' - | '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore' - fileRoutesByTo: FileRoutesByTo + | "/" + | "/cli-redirect" + | "/share-secret" + | "" + | "/password-setup" + | "/email-not-verified" + | "/password-reset" + | "/requestnewinvite" + | "/signupinvite" + | "/verify-email" + | "/personal-settings" + | "/login" + | "/signup" + | "/login/" + | "/signup/" + | "/organization/none" + | "/admin/signup" + | "/login/admin" + | "/login/ldap" + | "/login/select-organization" + | "/login/sso" + | "/signup/sso" + | "/secret-request/secret/$secretRequestId" + | "/shared/secret/$secretId" + | "/admin" + | "/personal-settings/" + | "/login/provider/error" + | "/login/provider/success" + | "/integrations" + | "/organization" + | "/admin/" + | "/organization/access-management" + | "/organization/audit-logs" + | "/organization/billing" + | "/organization/projects" + | "/admin/access-management" + | "/admin/authentication" + | "/admin/caching" + | "/admin/encryption" + | "/admin/environment" + | "/admin/integrations" + | "/organization/app-connections" + | "/organization/gateways" + | "/organization/secret-sharing" + | "/organization/settings" + | "/secret-manager/$projectId" + | "/organization/app-connections/" + | "/organization/gateways/" + | "/organization/secret-sharing/" + | "/organization/settings/" + | "/organization/groups/$groupId" + | "/organization/identities/$identityId" + | "/organization/members/$membershipId" + | "/organization/roles/$roleId" + | "/organization/secret-sharing/settings" + | "/admin/resources/overview" + | "/projects/cert-management/$projectId" + | "/projects/kms/$projectId" + | "/projects/secret-management/$projectId" + | "/projects/secret-scanning/$projectId" + | "/projects/ssh/$projectId" + | "/secret-manager/$projectId/approval" + | "/organization/settings/oauth/callback" + | "/integrations/azure-app-configuration/oauth2/callback" + | "/integrations/azure-key-vault/oauth2/callback" + | "/integrations/bitbucket/oauth2/callback" + | "/integrations/gcp-secret-manager/oauth2/callback" + | "/integrations/github/oauth2/callback" + | "/integrations/gitlab/oauth2/callback" + | "/integrations/heroku/oauth2/callback" + | "/integrations/netlify/oauth2/callback" + | "/integrations/vercel/oauth2/callback" + | "/organization/app-connections/$appConnection/oauth/callback" + | "/projects/cert-management/$projectId/alerting" + | "/projects/cert-management/$projectId/certificate-authorities" + | "/projects/cert-management/$projectId/certificates" + | "/projects/cert-management/$projectId/settings" + | "/projects/kms/$projectId/kmip" + | "/projects/kms/$projectId/overview" + | "/projects/kms/$projectId/settings" + | "/projects/secret-management/$projectId/allowlist" + | "/projects/secret-management/$projectId/approval" + | "/projects/secret-management/$projectId/overview" + | "/projects/secret-management/$projectId/secret-rotation" + | "/projects/secret-management/$projectId/settings" + | "/projects/secret-scanning/$projectId/findings" + | "/projects/secret-scanning/$projectId/settings" + | "/projects/ssh/$projectId/cas" + | "/projects/ssh/$projectId/certificates" + | "/projects/ssh/$projectId/overview" + | "/projects/ssh/$projectId/settings" + | "/projects/cert-management/$projectId/access-management" + | "/projects/cert-management/$projectId/audit-logs" + | "/projects/cert-management/$projectId/certificate-templates" + | "/projects/cert-management/$projectId/subscribers" + | "/projects/kms/$projectId/access-management" + | "/projects/kms/$projectId/audit-logs" + | "/projects/secret-management/$projectId/access-management" + | "/projects/secret-management/$projectId/audit-logs" + | "/projects/secret-management/$projectId/integrations" + | "/projects/secret-scanning/$projectId/access-management" + | "/projects/secret-scanning/$projectId/audit-logs" + | "/projects/secret-scanning/$projectId/data-sources" + | "/projects/ssh/$projectId/access-management" + | "/projects/ssh/$projectId/audit-logs" + | "/projects/cert-management/$projectId/certificate-templates/" + | "/projects/cert-management/$projectId/subscribers/" + | "/projects/secret-management/$projectId/integrations/" + | "/projects/secret-scanning/$projectId/data-sources/" + | "/projects/cert-management/$projectId/ca/$caName" + | "/projects/cert-management/$projectId/subscribers/$subscriberName" + | "/projects/secret-management/$projectId/integrations/$integrationId" + | "/projects/secret-management/$projectId/integrations/select-integration-auth" + | "/projects/secret-management/$projectId/secrets/$envSlug" + | "/projects/ssh/$projectId/ca/$caId" + | "/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId" + | "/projects/cert-management/$projectId/groups/$groupId" + | "/projects/cert-management/$projectId/identities/$identityId" + | "/projects/cert-management/$projectId/members/$membershipId" + | "/projects/cert-management/$projectId/pki-collections/$collectionId" + | "/projects/cert-management/$projectId/roles/$roleSlug" + | "/projects/kms/$projectId/groups/$groupId" + | "/projects/kms/$projectId/identities/$identityId" + | "/projects/kms/$projectId/members/$membershipId" + | "/projects/kms/$projectId/roles/$roleSlug" + | "/projects/secret-management/$projectId/groups/$groupId" + | "/projects/secret-management/$projectId/identities/$identityId" + | "/projects/secret-management/$projectId/members/$membershipId" + | "/projects/secret-management/$projectId/roles/$roleSlug" + | "/projects/secret-scanning/$projectId/groups/$groupId" + | "/projects/secret-scanning/$projectId/identities/$identityId" + | "/projects/secret-scanning/$projectId/members/$membershipId" + | "/projects/secret-scanning/$projectId/roles/$roleSlug" + | "/projects/ssh/$projectId/groups/$groupId" + | "/projects/ssh/$projectId/identities/$identityId" + | "/projects/ssh/$projectId/members/$membershipId" + | "/projects/ssh/$projectId/roles/$roleSlug" + | "/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize" + | "/projects/secret-management/$projectId/integrations/aws-parameter-store/create" + | "/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize" + | "/projects/secret-management/$projectId/integrations/aws-secret-manager/create" + | "/projects/secret-management/$projectId/integrations/azure-app-configuration/create" + | "/projects/secret-management/$projectId/integrations/azure-devops/authorize" + | "/projects/secret-management/$projectId/integrations/azure-devops/create" + | "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize" + | "/projects/secret-management/$projectId/integrations/azure-key-vault/create" + | "/projects/secret-management/$projectId/integrations/bitbucket/create" + | "/projects/secret-management/$projectId/integrations/checkly/authorize" + | "/projects/secret-management/$projectId/integrations/checkly/create" + | "/projects/secret-management/$projectId/integrations/circleci/authorize" + | "/projects/secret-management/$projectId/integrations/circleci/create" + | "/projects/secret-management/$projectId/integrations/cloud-66/authorize" + | "/projects/secret-management/$projectId/integrations/cloud-66/create" + | "/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize" + | "/projects/secret-management/$projectId/integrations/cloudflare-pages/create" + | "/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize" + | "/projects/secret-management/$projectId/integrations/cloudflare-workers/create" + | "/projects/secret-management/$projectId/integrations/codefresh/authorize" + | "/projects/secret-management/$projectId/integrations/codefresh/create" + | "/projects/secret-management/$projectId/integrations/databricks/authorize" + | "/projects/secret-management/$projectId/integrations/databricks/create" + | "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize" + | "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create" + | "/projects/secret-management/$projectId/integrations/flyio/authorize" + | "/projects/secret-management/$projectId/integrations/flyio/create" + | "/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize" + | "/projects/secret-management/$projectId/integrations/gcp-secret-manager/create" + | "/projects/secret-management/$projectId/integrations/github/auth-mode-selection" + | "/projects/secret-management/$projectId/integrations/github/create" + | "/projects/secret-management/$projectId/integrations/gitlab/authorize" + | "/projects/secret-management/$projectId/integrations/gitlab/create" + | "/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize" + | "/projects/secret-management/$projectId/integrations/hashicorp-vault/create" + | "/projects/secret-management/$projectId/integrations/hasura-cloud/authorize" + | "/projects/secret-management/$projectId/integrations/hasura-cloud/create" + | "/projects/secret-management/$projectId/integrations/heroku/create" + | "/projects/secret-management/$projectId/integrations/laravel-forge/authorize" + | "/projects/secret-management/$projectId/integrations/laravel-forge/create" + | "/projects/secret-management/$projectId/integrations/netlify/create" + | "/projects/secret-management/$projectId/integrations/northflank/authorize" + | "/projects/secret-management/$projectId/integrations/northflank/create" + | "/projects/secret-management/$projectId/integrations/octopus-deploy/authorize" + | "/projects/secret-management/$projectId/integrations/octopus-deploy/create" + | "/projects/secret-management/$projectId/integrations/qovery/authorize" + | "/projects/secret-management/$projectId/integrations/qovery/create" + | "/projects/secret-management/$projectId/integrations/railway/authorize" + | "/projects/secret-management/$projectId/integrations/railway/create" + | "/projects/secret-management/$projectId/integrations/render/authorize" + | "/projects/secret-management/$projectId/integrations/render/create" + | "/projects/secret-management/$projectId/integrations/rundeck/authorize" + | "/projects/secret-management/$projectId/integrations/rundeck/create" + | "/projects/secret-management/$projectId/integrations/supabase/authorize" + | "/projects/secret-management/$projectId/integrations/supabase/create" + | "/projects/secret-management/$projectId/integrations/teamcity/authorize" + | "/projects/secret-management/$projectId/integrations/teamcity/create" + | "/projects/secret-management/$projectId/integrations/terraform-cloud/authorize" + | "/projects/secret-management/$projectId/integrations/terraform-cloud/create" + | "/projects/secret-management/$projectId/integrations/travisci/authorize" + | "/projects/secret-management/$projectId/integrations/travisci/create" + | "/projects/secret-management/$projectId/integrations/vercel/create" + | "/projects/secret-management/$projectId/integrations/windmill/authorize" + | "/projects/secret-management/$projectId/integrations/windmill/create" + | "/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId" + | "/projects/secret-management/$projectId/commits/$environment/$folderId" + | "/projects/secret-management/$projectId/commits/$environment/$folderId/" + | "/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/github/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/heroku/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/netlify/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId" + | "/projects/secret-management/$projectId/integrations/vercel/oauth2/callback" + | "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId" + | "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/" + | "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore"; + fileRoutesByTo: FileRoutesByTo; to: - | '/' - | '/cli-redirect' - | '/share-secret' - | '' - | '/password-setup' - | '/email-not-verified' - | '/password-reset' - | '/requestnewinvite' - | '/signupinvite' - | '/verify-email' - | '/personal-settings' - | '/login' - | '/signup' - | '/organization/none' - | '/admin/signup' - | '/login/admin' - | '/login/ldap' - | '/login/select-organization' - | '/login/sso' - | '/signup/sso' - | '/secret-request/secret/$secretRequestId' - | '/shared/secret/$secretId' - | '/admin' - | '/login/provider/error' - | '/login/provider/success' - | '/integrations' - | '/organization' - | '/organization/access-management' - | '/organization/audit-logs' - | '/organization/billing' - | '/organization/projects' - | '/admin/authentication' - | '/admin/caching' - | '/admin/encryption' - | '/admin/environment' - | '/admin/integrations' - | '/secret-manager/$projectId' - | '/organization/app-connections' - | '/organization/gateways' - | '/organization/secret-sharing' - | '/organization/settings' - | '/organization/groups/$groupId' - | '/organization/identities/$identityId' - | '/organization/members/$membershipId' - | '/organization/roles/$roleId' - | '/organization/secret-sharing/settings' - | '/admin/resources/machine-identities' - | '/admin/resources/organizations' - | '/admin/resources/user-identities' - | '/projects/cert-management/$projectId' - | '/projects/kms/$projectId' - | '/projects/secret-management/$projectId' - | '/projects/secret-scanning/$projectId' - | '/projects/ssh/$projectId' - | '/secret-manager/$projectId/approval' - | '/organization/settings/oauth/callback' - | '/integrations/azure-app-configuration/oauth2/callback' - | '/integrations/azure-key-vault/oauth2/callback' - | '/integrations/bitbucket/oauth2/callback' - | '/integrations/gcp-secret-manager/oauth2/callback' - | '/integrations/github/oauth2/callback' - | '/integrations/gitlab/oauth2/callback' - | '/integrations/heroku/oauth2/callback' - | '/integrations/netlify/oauth2/callback' - | '/integrations/vercel/oauth2/callback' - | '/organization/app-connections/$appConnection/oauth/callback' - | '/projects/cert-management/$projectId/alerting' - | '/projects/cert-management/$projectId/certificate-authorities' - | '/projects/cert-management/$projectId/certificates' - | '/projects/cert-management/$projectId/settings' - | '/projects/kms/$projectId/kmip' - | '/projects/kms/$projectId/overview' - | '/projects/kms/$projectId/settings' - | '/projects/secret-management/$projectId/allowlist' - | '/projects/secret-management/$projectId/approval' - | '/projects/secret-management/$projectId/overview' - | '/projects/secret-management/$projectId/secret-rotation' - | '/projects/secret-management/$projectId/settings' - | '/projects/secret-scanning/$projectId/findings' - | '/projects/secret-scanning/$projectId/settings' - | '/projects/ssh/$projectId/cas' - | '/projects/ssh/$projectId/certificates' - | '/projects/ssh/$projectId/overview' - | '/projects/ssh/$projectId/settings' - | '/projects/cert-management/$projectId/access-management' - | '/projects/cert-management/$projectId/audit-logs' - | '/projects/kms/$projectId/access-management' - | '/projects/kms/$projectId/audit-logs' - | '/projects/secret-management/$projectId/access-management' - | '/projects/secret-management/$projectId/audit-logs' - | '/projects/secret-scanning/$projectId/access-management' - | '/projects/secret-scanning/$projectId/audit-logs' - | '/projects/ssh/$projectId/access-management' - | '/projects/ssh/$projectId/audit-logs' - | '/projects/cert-management/$projectId/certificate-templates' - | '/projects/cert-management/$projectId/subscribers' - | '/projects/secret-management/$projectId/integrations' - | '/projects/secret-scanning/$projectId/data-sources' - | '/projects/cert-management/$projectId/ca/$caName' - | '/projects/cert-management/$projectId/subscribers/$subscriberName' - | '/projects/secret-management/$projectId/integrations/$integrationId' - | '/projects/secret-management/$projectId/integrations/select-integration-auth' - | '/projects/secret-management/$projectId/secrets/$envSlug' - | '/projects/ssh/$projectId/ca/$caId' - | '/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId' - | '/projects/cert-management/$projectId/groups/$groupId' - | '/projects/cert-management/$projectId/identities/$identityId' - | '/projects/cert-management/$projectId/members/$membershipId' - | '/projects/cert-management/$projectId/pki-collections/$collectionId' - | '/projects/cert-management/$projectId/roles/$roleSlug' - | '/projects/kms/$projectId/groups/$groupId' - | '/projects/kms/$projectId/identities/$identityId' - | '/projects/kms/$projectId/members/$membershipId' - | '/projects/kms/$projectId/roles/$roleSlug' - | '/projects/secret-management/$projectId/groups/$groupId' - | '/projects/secret-management/$projectId/identities/$identityId' - | '/projects/secret-management/$projectId/members/$membershipId' - | '/projects/secret-management/$projectId/roles/$roleSlug' - | '/projects/secret-scanning/$projectId/groups/$groupId' - | '/projects/secret-scanning/$projectId/identities/$identityId' - | '/projects/secret-scanning/$projectId/members/$membershipId' - | '/projects/secret-scanning/$projectId/roles/$roleSlug' - | '/projects/ssh/$projectId/groups/$groupId' - | '/projects/ssh/$projectId/identities/$identityId' - | '/projects/ssh/$projectId/members/$membershipId' - | '/projects/ssh/$projectId/roles/$roleSlug' - | '/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize' - | '/projects/secret-management/$projectId/integrations/aws-parameter-store/create' - | '/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize' - | '/projects/secret-management/$projectId/integrations/aws-secret-manager/create' - | '/projects/secret-management/$projectId/integrations/azure-app-configuration/create' - | '/projects/secret-management/$projectId/integrations/azure-devops/authorize' - | '/projects/secret-management/$projectId/integrations/azure-devops/create' - | '/projects/secret-management/$projectId/integrations/azure-key-vault/authorize' - | '/projects/secret-management/$projectId/integrations/azure-key-vault/create' - | '/projects/secret-management/$projectId/integrations/bitbucket/create' - | '/projects/secret-management/$projectId/integrations/checkly/authorize' - | '/projects/secret-management/$projectId/integrations/checkly/create' - | '/projects/secret-management/$projectId/integrations/circleci/authorize' - | '/projects/secret-management/$projectId/integrations/circleci/create' - | '/projects/secret-management/$projectId/integrations/cloud-66/authorize' - | '/projects/secret-management/$projectId/integrations/cloud-66/create' - | '/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize' - | '/projects/secret-management/$projectId/integrations/cloudflare-pages/create' - | '/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize' - | '/projects/secret-management/$projectId/integrations/cloudflare-workers/create' - | '/projects/secret-management/$projectId/integrations/codefresh/authorize' - | '/projects/secret-management/$projectId/integrations/codefresh/create' - | '/projects/secret-management/$projectId/integrations/databricks/authorize' - | '/projects/secret-management/$projectId/integrations/databricks/create' - | '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize' - | '/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create' - | '/projects/secret-management/$projectId/integrations/flyio/authorize' - | '/projects/secret-management/$projectId/integrations/flyio/create' - | '/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize' - | '/projects/secret-management/$projectId/integrations/gcp-secret-manager/create' - | '/projects/secret-management/$projectId/integrations/github/auth-mode-selection' - | '/projects/secret-management/$projectId/integrations/github/create' - | '/projects/secret-management/$projectId/integrations/gitlab/authorize' - | '/projects/secret-management/$projectId/integrations/gitlab/create' - | '/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize' - | '/projects/secret-management/$projectId/integrations/hashicorp-vault/create' - | '/projects/secret-management/$projectId/integrations/hasura-cloud/authorize' - | '/projects/secret-management/$projectId/integrations/hasura-cloud/create' - | '/projects/secret-management/$projectId/integrations/heroku/create' - | '/projects/secret-management/$projectId/integrations/laravel-forge/authorize' - | '/projects/secret-management/$projectId/integrations/laravel-forge/create' - | '/projects/secret-management/$projectId/integrations/netlify/create' - | '/projects/secret-management/$projectId/integrations/northflank/authorize' - | '/projects/secret-management/$projectId/integrations/northflank/create' - | '/projects/secret-management/$projectId/integrations/octopus-deploy/authorize' - | '/projects/secret-management/$projectId/integrations/octopus-deploy/create' - | '/projects/secret-management/$projectId/integrations/qovery/authorize' - | '/projects/secret-management/$projectId/integrations/qovery/create' - | '/projects/secret-management/$projectId/integrations/railway/authorize' - | '/projects/secret-management/$projectId/integrations/railway/create' - | '/projects/secret-management/$projectId/integrations/render/authorize' - | '/projects/secret-management/$projectId/integrations/render/create' - | '/projects/secret-management/$projectId/integrations/rundeck/authorize' - | '/projects/secret-management/$projectId/integrations/rundeck/create' - | '/projects/secret-management/$projectId/integrations/supabase/authorize' - | '/projects/secret-management/$projectId/integrations/supabase/create' - | '/projects/secret-management/$projectId/integrations/teamcity/authorize' - | '/projects/secret-management/$projectId/integrations/teamcity/create' - | '/projects/secret-management/$projectId/integrations/terraform-cloud/authorize' - | '/projects/secret-management/$projectId/integrations/terraform-cloud/create' - | '/projects/secret-management/$projectId/integrations/travisci/authorize' - | '/projects/secret-management/$projectId/integrations/travisci/create' - | '/projects/secret-management/$projectId/integrations/vercel/create' - | '/projects/secret-management/$projectId/integrations/windmill/authorize' - | '/projects/secret-management/$projectId/integrations/windmill/create' - | '/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId' - | '/projects/secret-management/$projectId/commits/$environment/$folderId' - | '/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/github/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/heroku/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/netlify/oauth2/callback' - | '/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId' - | '/projects/secret-management/$projectId/integrations/vercel/oauth2/callback' - | '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId' - | '/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore' + | "/" + | "/cli-redirect" + | "/share-secret" + | "" + | "/password-setup" + | "/email-not-verified" + | "/password-reset" + | "/requestnewinvite" + | "/signupinvite" + | "/verify-email" + | "/personal-settings" + | "/login" + | "/signup" + | "/organization/none" + | "/admin/signup" + | "/login/admin" + | "/login/ldap" + | "/login/select-organization" + | "/login/sso" + | "/signup/sso" + | "/secret-request/secret/$secretRequestId" + | "/shared/secret/$secretId" + | "/admin" + | "/login/provider/error" + | "/login/provider/success" + | "/integrations" + | "/organization" + | "/organization/access-management" + | "/organization/audit-logs" + | "/organization/billing" + | "/organization/projects" + | "/admin/access-management" + | "/admin/authentication" + | "/admin/caching" + | "/admin/encryption" + | "/admin/environment" + | "/admin/integrations" + | "/secret-manager/$projectId" + | "/organization/app-connections" + | "/organization/gateways" + | "/organization/secret-sharing" + | "/organization/settings" + | "/organization/groups/$groupId" + | "/organization/identities/$identityId" + | "/organization/members/$membershipId" + | "/organization/roles/$roleId" + | "/organization/secret-sharing/settings" + | "/admin/resources/overview" + | "/projects/cert-management/$projectId" + | "/projects/kms/$projectId" + | "/projects/secret-management/$projectId" + | "/projects/secret-scanning/$projectId" + | "/projects/ssh/$projectId" + | "/secret-manager/$projectId/approval" + | "/organization/settings/oauth/callback" + | "/integrations/azure-app-configuration/oauth2/callback" + | "/integrations/azure-key-vault/oauth2/callback" + | "/integrations/bitbucket/oauth2/callback" + | "/integrations/gcp-secret-manager/oauth2/callback" + | "/integrations/github/oauth2/callback" + | "/integrations/gitlab/oauth2/callback" + | "/integrations/heroku/oauth2/callback" + | "/integrations/netlify/oauth2/callback" + | "/integrations/vercel/oauth2/callback" + | "/organization/app-connections/$appConnection/oauth/callback" + | "/projects/cert-management/$projectId/alerting" + | "/projects/cert-management/$projectId/certificate-authorities" + | "/projects/cert-management/$projectId/certificates" + | "/projects/cert-management/$projectId/settings" + | "/projects/kms/$projectId/kmip" + | "/projects/kms/$projectId/overview" + | "/projects/kms/$projectId/settings" + | "/projects/secret-management/$projectId/allowlist" + | "/projects/secret-management/$projectId/approval" + | "/projects/secret-management/$projectId/overview" + | "/projects/secret-management/$projectId/secret-rotation" + | "/projects/secret-management/$projectId/settings" + | "/projects/secret-scanning/$projectId/findings" + | "/projects/secret-scanning/$projectId/settings" + | "/projects/ssh/$projectId/cas" + | "/projects/ssh/$projectId/certificates" + | "/projects/ssh/$projectId/overview" + | "/projects/ssh/$projectId/settings" + | "/projects/cert-management/$projectId/access-management" + | "/projects/cert-management/$projectId/audit-logs" + | "/projects/kms/$projectId/access-management" + | "/projects/kms/$projectId/audit-logs" + | "/projects/secret-management/$projectId/access-management" + | "/projects/secret-management/$projectId/audit-logs" + | "/projects/secret-scanning/$projectId/access-management" + | "/projects/secret-scanning/$projectId/audit-logs" + | "/projects/ssh/$projectId/access-management" + | "/projects/ssh/$projectId/audit-logs" + | "/projects/cert-management/$projectId/certificate-templates" + | "/projects/cert-management/$projectId/subscribers" + | "/projects/secret-management/$projectId/integrations" + | "/projects/secret-scanning/$projectId/data-sources" + | "/projects/cert-management/$projectId/ca/$caName" + | "/projects/cert-management/$projectId/subscribers/$subscriberName" + | "/projects/secret-management/$projectId/integrations/$integrationId" + | "/projects/secret-management/$projectId/integrations/select-integration-auth" + | "/projects/secret-management/$projectId/secrets/$envSlug" + | "/projects/ssh/$projectId/ca/$caId" + | "/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId" + | "/projects/cert-management/$projectId/groups/$groupId" + | "/projects/cert-management/$projectId/identities/$identityId" + | "/projects/cert-management/$projectId/members/$membershipId" + | "/projects/cert-management/$projectId/pki-collections/$collectionId" + | "/projects/cert-management/$projectId/roles/$roleSlug" + | "/projects/kms/$projectId/groups/$groupId" + | "/projects/kms/$projectId/identities/$identityId" + | "/projects/kms/$projectId/members/$membershipId" + | "/projects/kms/$projectId/roles/$roleSlug" + | "/projects/secret-management/$projectId/groups/$groupId" + | "/projects/secret-management/$projectId/identities/$identityId" + | "/projects/secret-management/$projectId/members/$membershipId" + | "/projects/secret-management/$projectId/roles/$roleSlug" + | "/projects/secret-scanning/$projectId/groups/$groupId" + | "/projects/secret-scanning/$projectId/identities/$identityId" + | "/projects/secret-scanning/$projectId/members/$membershipId" + | "/projects/secret-scanning/$projectId/roles/$roleSlug" + | "/projects/ssh/$projectId/groups/$groupId" + | "/projects/ssh/$projectId/identities/$identityId" + | "/projects/ssh/$projectId/members/$membershipId" + | "/projects/ssh/$projectId/roles/$roleSlug" + | "/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize" + | "/projects/secret-management/$projectId/integrations/aws-parameter-store/create" + | "/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize" + | "/projects/secret-management/$projectId/integrations/aws-secret-manager/create" + | "/projects/secret-management/$projectId/integrations/azure-app-configuration/create" + | "/projects/secret-management/$projectId/integrations/azure-devops/authorize" + | "/projects/secret-management/$projectId/integrations/azure-devops/create" + | "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize" + | "/projects/secret-management/$projectId/integrations/azure-key-vault/create" + | "/projects/secret-management/$projectId/integrations/bitbucket/create" + | "/projects/secret-management/$projectId/integrations/checkly/authorize" + | "/projects/secret-management/$projectId/integrations/checkly/create" + | "/projects/secret-management/$projectId/integrations/circleci/authorize" + | "/projects/secret-management/$projectId/integrations/circleci/create" + | "/projects/secret-management/$projectId/integrations/cloud-66/authorize" + | "/projects/secret-management/$projectId/integrations/cloud-66/create" + | "/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize" + | "/projects/secret-management/$projectId/integrations/cloudflare-pages/create" + | "/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize" + | "/projects/secret-management/$projectId/integrations/cloudflare-workers/create" + | "/projects/secret-management/$projectId/integrations/codefresh/authorize" + | "/projects/secret-management/$projectId/integrations/codefresh/create" + | "/projects/secret-management/$projectId/integrations/databricks/authorize" + | "/projects/secret-management/$projectId/integrations/databricks/create" + | "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize" + | "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create" + | "/projects/secret-management/$projectId/integrations/flyio/authorize" + | "/projects/secret-management/$projectId/integrations/flyio/create" + | "/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize" + | "/projects/secret-management/$projectId/integrations/gcp-secret-manager/create" + | "/projects/secret-management/$projectId/integrations/github/auth-mode-selection" + | "/projects/secret-management/$projectId/integrations/github/create" + | "/projects/secret-management/$projectId/integrations/gitlab/authorize" + | "/projects/secret-management/$projectId/integrations/gitlab/create" + | "/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize" + | "/projects/secret-management/$projectId/integrations/hashicorp-vault/create" + | "/projects/secret-management/$projectId/integrations/hasura-cloud/authorize" + | "/projects/secret-management/$projectId/integrations/hasura-cloud/create" + | "/projects/secret-management/$projectId/integrations/heroku/create" + | "/projects/secret-management/$projectId/integrations/laravel-forge/authorize" + | "/projects/secret-management/$projectId/integrations/laravel-forge/create" + | "/projects/secret-management/$projectId/integrations/netlify/create" + | "/projects/secret-management/$projectId/integrations/northflank/authorize" + | "/projects/secret-management/$projectId/integrations/northflank/create" + | "/projects/secret-management/$projectId/integrations/octopus-deploy/authorize" + | "/projects/secret-management/$projectId/integrations/octopus-deploy/create" + | "/projects/secret-management/$projectId/integrations/qovery/authorize" + | "/projects/secret-management/$projectId/integrations/qovery/create" + | "/projects/secret-management/$projectId/integrations/railway/authorize" + | "/projects/secret-management/$projectId/integrations/railway/create" + | "/projects/secret-management/$projectId/integrations/render/authorize" + | "/projects/secret-management/$projectId/integrations/render/create" + | "/projects/secret-management/$projectId/integrations/rundeck/authorize" + | "/projects/secret-management/$projectId/integrations/rundeck/create" + | "/projects/secret-management/$projectId/integrations/supabase/authorize" + | "/projects/secret-management/$projectId/integrations/supabase/create" + | "/projects/secret-management/$projectId/integrations/teamcity/authorize" + | "/projects/secret-management/$projectId/integrations/teamcity/create" + | "/projects/secret-management/$projectId/integrations/terraform-cloud/authorize" + | "/projects/secret-management/$projectId/integrations/terraform-cloud/create" + | "/projects/secret-management/$projectId/integrations/travisci/authorize" + | "/projects/secret-management/$projectId/integrations/travisci/create" + | "/projects/secret-management/$projectId/integrations/vercel/create" + | "/projects/secret-management/$projectId/integrations/windmill/authorize" + | "/projects/secret-management/$projectId/integrations/windmill/create" + | "/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId" + | "/projects/secret-management/$projectId/commits/$environment/$folderId" + | "/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/github/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/heroku/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/netlify/oauth2/callback" + | "/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId" + | "/projects/secret-management/$projectId/integrations/vercel/oauth2/callback" + | "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId" + | "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore"; id: - | '__root__' - | '/' - | '/cli-redirect' - | '/share-secret' - | '/_authenticate' - | '/_restrict-login-signup' - | '/_authenticate/password-setup' - | '/_restrict-login-signup/email-not-verified' - | '/_restrict-login-signup/password-reset' - | '/_restrict-login-signup/requestnewinvite' - | '/_restrict-login-signup/signupinvite' - | '/_restrict-login-signup/verify-email' - | '/_authenticate/_inject-org-details' - | '/_authenticate/personal-settings' - | '/_restrict-login-signup/login' - | '/_restrict-login-signup/signup' - | '/_restrict-login-signup/login/' - | '/_restrict-login-signup/signup/' - | '/_authenticate/organization/none' - | '/_restrict-login-signup/admin/signup' - | '/_restrict-login-signup/login/admin' - | '/_restrict-login-signup/login/ldap' - | '/_restrict-login-signup/login/select-organization' - | '/_restrict-login-signup/login/sso' - | '/_restrict-login-signup/signup/sso' - | '/secret-request/secret/$secretRequestId' - | '/shared/secret/$secretId' - | '/_authenticate/_inject-org-details/_org-layout' - | '/_authenticate/_inject-org-details/admin' - | '/_authenticate/personal-settings/_layout' - | '/_authenticate/personal-settings/_layout/' - | '/_restrict-login-signup/login/provider/error' - | '/_restrict-login-signup/login/provider/success' - | '/_authenticate/_inject-org-details/_org-layout/integrations' - | '/_authenticate/_inject-org-details/_org-layout/organization' - | '/_authenticate/_inject-org-details/admin/_admin-layout' - | '/_authenticate/_inject-org-details/admin/_admin-layout/' - | '/_authenticate/_inject-org-details/_org-layout/organization/access-management' - | '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs' - | '/_authenticate/_inject-org-details/_org-layout/organization/billing' - | '/_authenticate/_inject-org-details/_org-layout/organization/projects' - | '/_authenticate/_inject-org-details/admin/_admin-layout/authentication' - | '/_authenticate/_inject-org-details/admin/_admin-layout/caching' - | '/_authenticate/_inject-org-details/admin/_admin-layout/encryption' - | '/_authenticate/_inject-org-details/admin/_admin-layout/environment' - | '/_authenticate/_inject-org-details/admin/_admin-layout/integrations' - | '/_authenticate/_inject-org-details/_org-layout/organization/app-connections' - | '/_authenticate/_inject-org-details/_org-layout/organization/gateways' - | '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing' - | '/_authenticate/_inject-org-details/_org-layout/organization/settings' - | '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId' - | '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/' - | '/_authenticate/_inject-org-details/_org-layout/organization/gateways/' - | '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/' - | '/_authenticate/_inject-org-details/_org-layout/organization/settings/' - | '/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId' - | '/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId' - | '/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId' - | '/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId' - | '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings' - | '/_authenticate/_inject-org-details/admin/_admin-layout/resources/machine-identities' - | '/_authenticate/_inject-org-details/admin/_admin-layout/resources/organizations' - | '/_authenticate/_inject-org-details/admin/_admin-layout/resources/user-identities' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId' - | '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval' - | '/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout' - | '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId' - | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId' - | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId' - | '/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/' - | '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore' - fileRoutesById: FileRoutesById + | "__root__" + | "/" + | "/cli-redirect" + | "/share-secret" + | "/_authenticate" + | "/_restrict-login-signup" + | "/_authenticate/password-setup" + | "/_restrict-login-signup/email-not-verified" + | "/_restrict-login-signup/password-reset" + | "/_restrict-login-signup/requestnewinvite" + | "/_restrict-login-signup/signupinvite" + | "/_restrict-login-signup/verify-email" + | "/_authenticate/_inject-org-details" + | "/_authenticate/personal-settings" + | "/_restrict-login-signup/login" + | "/_restrict-login-signup/signup" + | "/_restrict-login-signup/login/" + | "/_restrict-login-signup/signup/" + | "/_authenticate/organization/none" + | "/_restrict-login-signup/admin/signup" + | "/_restrict-login-signup/login/admin" + | "/_restrict-login-signup/login/ldap" + | "/_restrict-login-signup/login/select-organization" + | "/_restrict-login-signup/login/sso" + | "/_restrict-login-signup/signup/sso" + | "/secret-request/secret/$secretRequestId" + | "/shared/secret/$secretId" + | "/_authenticate/_inject-org-details/_org-layout" + | "/_authenticate/_inject-org-details/admin" + | "/_authenticate/personal-settings/_layout" + | "/_authenticate/personal-settings/_layout/" + | "/_restrict-login-signup/login/provider/error" + | "/_restrict-login-signup/login/provider/success" + | "/_authenticate/_inject-org-details/_org-layout/integrations" + | "/_authenticate/_inject-org-details/_org-layout/organization" + | "/_authenticate/_inject-org-details/admin/_admin-layout" + | "/_authenticate/_inject-org-details/admin/_admin-layout/" + | "/_authenticate/_inject-org-details/_org-layout/organization/access-management" + | "/_authenticate/_inject-org-details/_org-layout/organization/audit-logs" + | "/_authenticate/_inject-org-details/_org-layout/organization/billing" + | "/_authenticate/_inject-org-details/_org-layout/organization/projects" + | "/_authenticate/_inject-org-details/admin/_admin-layout/access-management" + | "/_authenticate/_inject-org-details/admin/_admin-layout/authentication" + | "/_authenticate/_inject-org-details/admin/_admin-layout/caching" + | "/_authenticate/_inject-org-details/admin/_admin-layout/encryption" + | "/_authenticate/_inject-org-details/admin/_admin-layout/environment" + | "/_authenticate/_inject-org-details/admin/_admin-layout/integrations" + | "/_authenticate/_inject-org-details/_org-layout/organization/app-connections" + | "/_authenticate/_inject-org-details/_org-layout/organization/gateways" + | "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing" + | "/_authenticate/_inject-org-details/_org-layout/organization/settings" + | "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId" + | "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/" + | "/_authenticate/_inject-org-details/_org-layout/organization/gateways/" + | "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/" + | "/_authenticate/_inject-org-details/_org-layout/organization/settings/" + | "/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId" + | "/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId" + | "/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId" + | "/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId" + | "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings" + | "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId" + | "/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/approval" + | "/_authenticate/_inject-org-details/_org-layout/organization/settings/oauth/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/azure-app-configuration/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/azure-key-vault/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/bitbucket/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/gcp-secret-manager/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/github/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/gitlab/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/heroku/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/netlify/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/integrations/vercel/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout" + | "/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/settings" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/cas" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/certificates" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/overview" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/settings" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/audit-logs" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/audit-logs" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/audit-logs" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/audit-logs" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/audit-logs" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId" + | "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId" + | "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId" + | "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/auth-mode-selection" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/authorize" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/" + | "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore"; + fileRoutesById: FileRoutesById; } export interface RootRouteChildren { - indexRoute: typeof indexRoute - authCliRedirectPageRouteRoute: typeof authCliRedirectPageRouteRoute - publicShareSecretPageRouteRoute: typeof publicShareSecretPageRouteRoute - middlewaresAuthenticateRoute: typeof middlewaresAuthenticateRouteWithChildren - middlewaresRestrictLoginSignupRoute: typeof middlewaresRestrictLoginSignupRouteWithChildren - publicViewSecretRequestByIDPageRouteRoute: typeof publicViewSecretRequestByIDPageRouteRoute - publicViewSharedSecretByIDPageRouteRoute: typeof publicViewSharedSecretByIDPageRouteRoute + indexRoute: typeof indexRoute; + authCliRedirectPageRouteRoute: typeof authCliRedirectPageRouteRoute; + publicShareSecretPageRouteRoute: typeof publicShareSecretPageRouteRoute; + middlewaresAuthenticateRoute: typeof middlewaresAuthenticateRouteWithChildren; + middlewaresRestrictLoginSignupRoute: typeof middlewaresRestrictLoginSignupRouteWithChildren; + publicViewSecretRequestByIDPageRouteRoute: typeof publicViewSecretRequestByIDPageRouteRoute; + publicViewSharedSecretByIDPageRouteRoute: typeof publicViewSharedSecretByIDPageRouteRoute; } const rootRouteChildren: RootRouteChildren = { @@ -5957,17 +5772,14 @@ const rootRouteChildren: RootRouteChildren = { authCliRedirectPageRouteRoute: authCliRedirectPageRouteRoute, publicShareSecretPageRouteRoute: publicShareSecretPageRouteRoute, middlewaresAuthenticateRoute: middlewaresAuthenticateRouteWithChildren, - middlewaresRestrictLoginSignupRoute: - middlewaresRestrictLoginSignupRouteWithChildren, - publicViewSecretRequestByIDPageRouteRoute: - publicViewSecretRequestByIDPageRouteRoute, - publicViewSharedSecretByIDPageRouteRoute: - publicViewSharedSecretByIDPageRouteRoute, -} + middlewaresRestrictLoginSignupRoute: middlewaresRestrictLoginSignupRouteWithChildren, + publicViewSecretRequestByIDPageRouteRoute: publicViewSecretRequestByIDPageRouteRoute, + publicViewSharedSecretByIDPageRouteRoute: publicViewSharedSecretByIDPageRouteRoute +}; export const routeTree = rootRoute ._addFileChildren(rootRouteChildren) - ._addFileTypes() + ._addFileTypes(); /* ROUTE_MANIFEST_START { @@ -6195,14 +6007,13 @@ export const routeTree = rootRoute "parent": "/_authenticate/_inject-org-details/admin", "children": [ "/_authenticate/_inject-org-details/admin/_admin-layout/", + "/_authenticate/_inject-org-details/admin/_admin-layout/access-management", "/_authenticate/_inject-org-details/admin/_admin-layout/authentication", "/_authenticate/_inject-org-details/admin/_admin-layout/caching", "/_authenticate/_inject-org-details/admin/_admin-layout/encryption", "/_authenticate/_inject-org-details/admin/_admin-layout/environment", "/_authenticate/_inject-org-details/admin/_admin-layout/integrations", - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/machine-identities", - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/organizations", - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/user-identities" + "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview" ] }, "/_authenticate/_inject-org-details/admin/_admin-layout/": { @@ -6225,6 +6036,10 @@ export const routeTree = rootRoute "filePath": "organization/ProjectsPage/route.tsx", "parent": "/_authenticate/_inject-org-details/_org-layout/organization" }, + "/_authenticate/_inject-org-details/admin/_admin-layout/access-management": { + "filePath": "admin/AccessManagementPage/route.tsx", + "parent": "/_authenticate/_inject-org-details/admin/_admin-layout" + }, "/_authenticate/_inject-org-details/admin/_admin-layout/authentication": { "filePath": "admin/AuthenticationPage/route.tsx", "parent": "/_authenticate/_inject-org-details/admin/_admin-layout" @@ -6319,16 +6134,8 @@ export const routeTree = rootRoute "filePath": "organization/SecretSharingSettingsPage/route.tsx", "parent": "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing" }, - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/machine-identities": { - "filePath": "admin/MachineIdentitiesResourcesPage/route.tsx", - "parent": "/_authenticate/_inject-org-details/admin/_admin-layout" - }, - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/organizations": { - "filePath": "admin/OrganizationResourcesPage/route.tsx", - "parent": "/_authenticate/_inject-org-details/admin/_admin-layout" - }, - "/_authenticate/_inject-org-details/admin/_admin-layout/resources/user-identities": { - "filePath": "admin/UserIdentitiesResourcesPage/route.tsx", + "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview": { + "filePath": "admin/ResourceOverviewPage/route.tsx", "parent": "/_authenticate/_inject-org-details/admin/_admin-layout" }, "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId": { diff --git a/frontend/src/routes.ts b/frontend/src/routes.ts index cca823f21..70c34edc6 100644 --- a/frontend/src/routes.ts +++ b/frontend/src/routes.ts @@ -11,9 +11,8 @@ const adminRoute = route("/admin", [ route("/environment", "admin/EnvironmentPage/route.tsx"), route("/integrations", "admin/IntegrationsPage/route.tsx"), route("/caching", "admin/CachingPage/route.tsx"), - route("/resources/organizations", "admin/OrganizationResourcesPage/route.tsx"), - route("/resources/user-identities", "admin/UserIdentitiesResourcesPage/route.tsx"), - route("/resources/machine-identities", "admin/MachineIdentitiesResourcesPage/route.tsx") + route("/resources/overview", "admin/ResourceOverviewPage/route.tsx"), + route("/access-management", "admin/AccessManagementPage/route.tsx") ]) ]); diff --git a/sink/redis-cluster/README.md b/sink/redis-cluster/README.md new file mode 100644 index 000000000..6f4a40a80 --- /dev/null +++ b/sink/redis-cluster/README.md @@ -0,0 +1,42 @@ +# Redis Cluster Setup + +## Quick Start + +1. **Update IP Address**: Replace `192.168.1.33` with your system's IP address in `docker-compose.yml`: + ```bash + # Find your IP + ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | head -1 + ``` + +2. **Start Cluster**: + ```bash + docker compose up -d + ``` + +3. **Verify Cluster**: + ```bash + docker exec redis-node-1 redis-cli -p 7001 cluster info + ``` + +## Connection Details + +- **Redis Cluster**: `YOUR_IP:7001`, `YOUR_IP:7002`, `YOUR_IP:7003` +- **RedisInsight UI**: `localhost:5540` + +## Clean Restart + +To completely reset the cluster: +```bash +docker compose down -v +# Update IP in docker-compose.yml if needed +docker compose up -d +``` + +## External Docker Compose Usage + +```yaml +environment: + - REDIS_CLUSTER_URLS=redis://YOUR_IP:7001,redis://YOUR_IP:7002,redis://YOUR_IP:7003 +``` + +**Important**: Always replace `YOUR_IP` with your actual system IP address. \ No newline at end of file diff --git a/sink/redis-cluster/docker-compose.yml b/sink/redis-cluster/docker-compose.yml new file mode 100644 index 000000000..05c7f7cc7 --- /dev/null +++ b/sink/redis-cluster/docker-compose.yml @@ -0,0 +1,87 @@ +version: "3.8" + +services: + redis-node-1: + image: redis:7 + container_name: redis-node-1 + ports: + - "7001:7001" + - "17001:17001" + volumes: + - redis-node-1-data:/data + command: > + redis-server + --port 7001 + --cluster-enabled yes + --cluster-config-file nodes.conf + --cluster-node-timeout 5000 + --appendonly yes + --bind 0.0.0.0 + --cluster-announce-ip 192.168.1.33 + --cluster-announce-port 7001 + --cluster-announce-bus-port 17001 + + redis-node-2: + image: redis:7 + container_name: redis-node-2 + ports: + - "7002:7002" + - "17002:17002" + volumes: + - redis-node-2-data:/data + command: > + redis-server + --port 7002 + --cluster-enabled yes + --cluster-config-file nodes.conf + --cluster-node-timeout 5000 + --appendonly yes + --bind 0.0.0.0 + --cluster-announce-ip 192.168.1.33 + --cluster-announce-port 7002 + --cluster-announce-bus-port 17002 + + redis-node-3: + image: redis:7 + container_name: redis-node-3 + ports: + - "7003:7003" + - "17003:17003" + volumes: + - redis-node-3-data:/data + command: > + redis-server + --port 7003 + --cluster-enabled yes + --cluster-config-file nodes.conf + --cluster-node-timeout 5000 + --appendonly yes + --bind 0.0.0.0 + --cluster-announce-ip 192.168.1.33 + --cluster-announce-port 7003 + --cluster-announce-bus-port 17003 + + redis-insight: + container_name: redis-insight + image: redis/redisinsight + ports: + - "5540:5540" + + redis-cluster-init: + image: redis:7 + depends_on: + - redis-node-1 + - redis-node-2 + - redis-node-3 + restart: "no" + command: > + sh -c " + sleep 10 + redis-cli --cluster create 192.168.1.33:7001 192.168.1.33:7002 192.168.1.33:7003 --cluster-yes + echo 'Cluster initialized' + " + +volumes: + redis-node-1-data: + redis-node-2-data: + redis-node-3-data: \ No newline at end of file