checkpoint

This commit is contained in:
Daniel Hougaard
2025-10-21 16:46:22 +04:00
parent 76aacaa627
commit c8a00e7e3f
5 changed files with 35 additions and 29 deletions

View File

@@ -1,6 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { crypto } from "@app/lib/crypto/cryptography"; import { crypto } from "@app/lib/crypto/cryptography";
import { removeTrailingSlash } from "@app/lib/fn";
import { zpStr } from "@app/lib/zod"; import { zpStr } from "@app/lib/zod";
import { TSuperAdminDALFactory } from "@app/services/super-admin/super-admin-dal"; import { TSuperAdminDALFactory } from "@app/services/super-admin/super-admin-dal";
@@ -22,13 +23,17 @@ const envSchema = z
HSM_LIB_PATH: zpStr(z.string().optional()), HSM_LIB_PATH: zpStr(z.string().optional()),
HSM_PIN: zpStr(z.string().optional()), HSM_PIN: zpStr(z.string().optional()),
HSM_KEY_LABEL: zpStr(z.string().optional()), HSM_KEY_LABEL: zpStr(z.string().optional()),
HSM_SLOT: z.coerce.number().optional().default(0) HSM_SLOT: z.coerce.number().optional().default(0),
LICENSE_SERVER_URL: zpStr(z.string().optional().default("https://portal.infisical.com")),
LICENSE_SERVER_KEY: zpStr(z.string().optional()),
LICENSE_KEY: zpStr(z.string().optional()),
LICENSE_KEY_OFFLINE: zpStr(z.string().optional()),
INTERNAL_REGION: zpStr(z.enum(["us", "eu"]).optional()),
SITE_URL: zpStr(z.string().transform((val) => (val ? removeTrailingSlash(val) : val))).optional()
}) })
// To ensure that basic encryption is always possible. // To ensure that basic encryption is always possible.
.refine(
(data) => Boolean(data.ENCRYPTION_KEY) || Boolean(data.ROOT_ENCRYPTION_KEY),
"Either ENCRYPTION_KEY or ROOT_ENCRYPTION_KEY must be defined."
)
.transform((data) => ({ .transform((data) => ({
...data, ...data,
isHsmConfigured: isHsmConfigured:

View File

@@ -61,7 +61,8 @@ export const getMigrationEncryptionServices = async ({ envConfig, db, keyStore }
licenseDAL, licenseDAL,
keyStore, keyStore,
identityOrgMembershipDAL, identityOrgMembershipDAL,
projectDAL projectDAL,
envConfig
}); });
// ----- HSM startup ----- // ----- HSM startup -----

View File

@@ -10,7 +10,7 @@ import { CronJob } from "cron";
import { Knex } from "knex"; import { Knex } from "knex";
import { TKeyStoreFactory } from "@app/keystore/keystore"; import { TKeyStoreFactory } from "@app/keystore/keystore";
import { getConfig } from "@app/lib/config/env"; import { TEnvConfig } from "@app/lib/config/env";
import { verifyOfflineLicense } from "@app/lib/crypto"; import { verifyOfflineLicense } from "@app/lib/crypto";
import { BadRequestError, NotFoundError } from "@app/lib/errors"; import { BadRequestError, NotFoundError } from "@app/lib/errors";
import { logger } from "@app/lib/logger"; import { logger } from "@app/lib/logger";
@@ -45,6 +45,10 @@ import {
} from "./license-types"; } from "./license-types";
type TLicenseServiceFactoryDep = { type TLicenseServiceFactoryDep = {
envConfig: Pick<
TEnvConfig,
"LICENSE_SERVER_URL" | "LICENSE_SERVER_KEY" | "LICENSE_KEY" | "LICENSE_KEY_OFFLINE" | "INTERNAL_REGION" | "SITE_URL"
>;
orgDAL: Pick<TOrgDALFactory, "findOrgById" | "countAllOrgMembers">; orgDAL: Pick<TOrgDALFactory, "findOrgById" | "countAllOrgMembers">;
permissionService: Pick<TPermissionServiceFactory, "getOrgPermission">; permissionService: Pick<TPermissionServiceFactory, "getOrgPermission">;
licenseDAL: TLicenseDALFactory; licenseDAL: TLicenseDALFactory;
@@ -67,26 +71,26 @@ export const licenseServiceFactory = ({
licenseDAL, licenseDAL,
keyStore, keyStore,
identityOrgMembershipDAL, identityOrgMembershipDAL,
projectDAL projectDAL,
envConfig
}: TLicenseServiceFactoryDep) => { }: TLicenseServiceFactoryDep) => {
let isValidLicense = false; let isValidLicense = false;
let instanceType = InstanceType.OnPrem; let instanceType = InstanceType.OnPrem;
let onPremFeatures: TFeatureSet = getDefaultOnPremFeatures(); let onPremFeatures: TFeatureSet = getDefaultOnPremFeatures();
let selfHostedLicense: TOfflineLicense | null = null; let selfHostedLicense: TOfflineLicense | null = null;
const appCfg = getConfig();
const licenseServerCloudApi = setupLicenseRequestWithStore( const licenseServerCloudApi = setupLicenseRequestWithStore(
appCfg.LICENSE_SERVER_URL || "", envConfig.LICENSE_SERVER_URL || "",
LICENSE_SERVER_CLOUD_LOGIN, LICENSE_SERVER_CLOUD_LOGIN,
appCfg.LICENSE_SERVER_KEY || "", envConfig.LICENSE_SERVER_KEY || "",
appCfg.INTERNAL_REGION envConfig.INTERNAL_REGION
); );
const licenseServerOnPremApi = setupLicenseRequestWithStore( const licenseServerOnPremApi = setupLicenseRequestWithStore(
appCfg.LICENSE_SERVER_URL || "", envConfig.LICENSE_SERVER_URL || "",
LICENSE_SERVER_ON_PREM_LOGIN, LICENSE_SERVER_ON_PREM_LOGIN,
appCfg.LICENSE_KEY || "", envConfig.LICENSE_KEY || "",
appCfg.INTERNAL_REGION envConfig.INTERNAL_REGION
); );
const syncLicenseKeyOnPremFeatures = async (shouldThrow: boolean = false) => { const syncLicenseKeyOnPremFeatures = async (shouldThrow: boolean = false) => {
@@ -120,7 +124,7 @@ export const licenseServiceFactory = ({
const init = async () => { const init = async () => {
try { try {
if (appCfg.LICENSE_SERVER_KEY) { if (envConfig.LICENSE_SERVER_KEY) {
const token = await licenseServerCloudApi.refreshLicense(); const token = await licenseServerCloudApi.refreshLicense();
if (token) instanceType = InstanceType.Cloud; if (token) instanceType = InstanceType.Cloud;
logger.info(`Instance type: ${InstanceType.Cloud}`); logger.info(`Instance type: ${InstanceType.Cloud}`);
@@ -128,7 +132,7 @@ export const licenseServiceFactory = ({
return; return;
} }
if (appCfg.LICENSE_KEY) { if (envConfig.LICENSE_KEY) {
const token = await licenseServerOnPremApi.refreshLicense(); const token = await licenseServerOnPremApi.refreshLicense();
if (token) { if (token) {
await syncLicenseKeyOnPremFeatures(true); await syncLicenseKeyOnPremFeatures(true);
@@ -139,10 +143,10 @@ export const licenseServiceFactory = ({
return; return;
} }
if (appCfg.LICENSE_KEY_OFFLINE) { if (envConfig.LICENSE_KEY_OFFLINE) {
let isValidOfflineLicense = true; let isValidOfflineLicense = true;
const contents: TOfflineLicenseContents = JSON.parse( const contents: TOfflineLicenseContents = JSON.parse(
Buffer.from(appCfg.LICENSE_KEY_OFFLINE, "base64").toString("utf8") Buffer.from(envConfig.LICENSE_KEY_OFFLINE, "base64").toString("utf8")
); );
const isVerified = await verifyOfflineLicense(JSON.stringify(contents.license), contents.signature); const isVerified = await verifyOfflineLicense(JSON.stringify(contents.license), contents.signature);
@@ -181,7 +185,7 @@ export const licenseServiceFactory = ({
}; };
const initializeBackgroundSync = async () => { const initializeBackgroundSync = async () => {
if (appCfg.LICENSE_KEY) { if (envConfig.LICENSE_KEY) {
logger.info("Setting up background sync process for refresh onPremFeatures"); logger.info("Setting up background sync process for refresh onPremFeatures");
const job = new CronJob("*/10 * * * *", syncLicenseKeyOnPremFeatures); const job = new CronJob("*/10 * * * *", syncLicenseKeyOnPremFeatures);
job.start(); job.start();
@@ -397,8 +401,8 @@ export const licenseServiceFactory = ({
} = await licenseServerCloudApi.request.post( } = await licenseServerCloudApi.request.post(
`/api/license-server/v1/customers/${organization.customerId}/billing-details/payment-methods`, `/api/license-server/v1/customers/${organization.customerId}/billing-details/payment-methods`,
{ {
success_url: `${appCfg.SITE_URL}/organization/billing`, success_url: `${envConfig.SITE_URL}/organization/billing`,
cancel_url: `${appCfg.SITE_URL}/organization/billing` cancel_url: `${envConfig.SITE_URL}/organization/billing`
} }
); );
@@ -411,7 +415,7 @@ export const licenseServiceFactory = ({
} = await licenseServerCloudApi.request.post( } = await licenseServerCloudApi.request.post(
`/api/license-server/v1/customers/${organization.customerId}/billing-details/billing-portal`, `/api/license-server/v1/customers/${organization.customerId}/billing-details/billing-portal`,
{ {
return_url: `${appCfg.SITE_URL}/organization/billing` return_url: `${envConfig.SITE_URL}/organization/billing`
} }
); );

View File

@@ -363,11 +363,6 @@ const envSchema = z
/* INTERNAL ----------------------------------------------------------------------------- */ /* INTERNAL ----------------------------------------------------------------------------- */
INTERNAL_REGION: zpStr(z.enum(["us", "eu"]).optional()) INTERNAL_REGION: zpStr(z.enum(["us", "eu"]).optional())
}) })
// To ensure that basic encryption is always possible.
.refine(
(data) => Boolean(data.ENCRYPTION_KEY) || Boolean(data.ROOT_ENCRYPTION_KEY),
"Either ENCRYPTION_KEY or ROOT_ENCRYPTION_KEY must be defined."
)
.refine( .refine(
(data) => Boolean(data.REDIS_URL) || Boolean(data.REDIS_SENTINEL_HOSTS) || Boolean(data.REDIS_CLUSTER_HOSTS), (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." "Either REDIS_URL, REDIS_SENTINEL_HOSTS or REDIS_CLUSTER_HOSTS must be defined."

View File

@@ -559,7 +559,8 @@ export const registerRoutes = async (
licenseDAL, licenseDAL,
keyStore, keyStore,
identityOrgMembershipDAL, identityOrgMembershipDAL,
projectDAL projectDAL,
envConfig
}); });
const tokenService = tokenServiceFactory({ tokenDAL: authTokenDAL, userDAL, membershipUserDAL }); const tokenService = tokenServiceFactory({ tokenDAL: authTokenDAL, userDAL, membershipUserDAL });