Check license when creating profile

This commit is contained in:
Fang-Pen Lin
2025-11-12 10:47:53 -08:00
parent bb46eac8ea
commit 07cfb6dd54
2 changed files with 21 additions and 3 deletions
+1
View File
@@ -1185,6 +1185,7 @@ export const registerRoutes = async (
certificateAuthorityCertDAL, certificateAuthorityCertDAL,
permissionService, permissionService,
kmsService, kmsService,
licenseService,
projectDAL projectDAL
}); });
@@ -14,13 +14,14 @@ import { getConfig } from "@app/lib/config/env";
import { crypto } from "@app/lib/crypto/cryptography"; import { crypto } from "@app/lib/crypto/cryptography";
import { BadRequestError, ForbiddenRequestError, NotFoundError } from "@app/lib/errors"; import { BadRequestError, ForbiddenRequestError, NotFoundError } from "@app/lib/errors";
import { TLicenseServiceFactory } from "@app/ee/services/license/license-service";
import { ActorAuthMethod, ActorType } from "../auth/auth-type"; import { ActorAuthMethod, ActorType } from "../auth/auth-type";
import { TCertificateBodyDALFactory } from "../certificate/certificate-body-dal";
import { getCertificateCredentials, isCertChainValid } from "../certificate/certificate-fns";
import { TCertificateSecretDALFactory } from "../certificate/certificate-secret-dal";
import { TCertificateAuthorityCertDALFactory } from "../certificate-authority/certificate-authority-cert-dal"; import { TCertificateAuthorityCertDALFactory } from "../certificate-authority/certificate-authority-cert-dal";
import { TCertificateAuthorityDALFactory } from "../certificate-authority/certificate-authority-dal"; import { TCertificateAuthorityDALFactory } from "../certificate-authority/certificate-authority-dal";
import { TCertificateTemplateV2DALFactory } from "../certificate-template-v2/certificate-template-v2-dal"; import { TCertificateTemplateV2DALFactory } from "../certificate-template-v2/certificate-template-v2-dal";
import { TCertificateBodyDALFactory } from "../certificate/certificate-body-dal";
import { getCertificateCredentials, isCertChainValid } from "../certificate/certificate-fns";
import { TCertificateSecretDALFactory } from "../certificate/certificate-secret-dal";
import { TAcmeEnrollmentConfigDALFactory } from "../enrollment-config/acme-enrollment-config-dal"; import { TAcmeEnrollmentConfigDALFactory } from "../enrollment-config/acme-enrollment-config-dal";
import { TApiEnrollmentConfigDALFactory } from "../enrollment-config/api-enrollment-config-dal"; import { TApiEnrollmentConfigDALFactory } from "../enrollment-config/api-enrollment-config-dal";
import { TAcmeConfigData, TApiConfigData, TEstConfigData } from "../enrollment-config/enrollment-config-types"; import { TAcmeConfigData, TApiConfigData, TEstConfigData } from "../enrollment-config/enrollment-config-types";
@@ -153,6 +154,7 @@ type TCertificateProfileServiceFactoryDep = {
certificateAuthorityCertDAL: Pick<TCertificateAuthorityCertDALFactory, "findById">; certificateAuthorityCertDAL: Pick<TCertificateAuthorityCertDALFactory, "findById">;
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission">; permissionService: Pick<TPermissionServiceFactory, "getProjectPermission">;
kmsService: Pick<TKmsServiceFactory, "generateKmsKey" | "encryptWithKmsKey" | "decryptWithKmsKey">; kmsService: Pick<TKmsServiceFactory, "generateKmsKey" | "encryptWithKmsKey" | "decryptWithKmsKey">;
licenseService: Pick<TLicenseServiceFactory, "getPlan">;
projectDAL: Pick<TProjectDALFactory, "findProjectBySlug" | "findOne" | "updateById" | "findById" | "transaction">; projectDAL: Pick<TProjectDALFactory, "findProjectBySlug" | "findOne" | "updateById" | "findById" | "transaction">;
}; };
@@ -175,6 +177,7 @@ export const certificateProfileServiceFactory = ({
certificateSecretDAL, certificateSecretDAL,
permissionService, permissionService,
kmsService, kmsService,
licenseService,
projectDAL projectDAL
}: TCertificateProfileServiceFactoryDep) => { }: TCertificateProfileServiceFactoryDep) => {
const createProfile = async ({ const createProfile = async ({
@@ -237,6 +240,20 @@ export const certificateProfileServiceFactory = ({
message: "API enrollment requires API configuration" message: "API enrollment requires API configuration"
}); });
} }
if (data.enrollmentType === EnrollmentType.ACME) {
const orgLicensePlan = await licenseService.getPlan(actorOrgId);
if (!orgLicensePlan.pkiAcme) {
throw new BadRequestError({
message:
"Failed to create certificate profile due to plan restriction. Upgrade plan to create ACME certificate profile."
});
}
if (!data.acmeConfig) {
throw new ForbiddenRequestError({
message: "ACME enrollment requires ACME configuration"
});
}
}
// TODO: acme type currently doesn't require config obj, but add a check in the future if // TODO: acme type currently doesn't require config obj, but add a check in the future if
// we have options // we have options