Skip to content

Commit 79b44dd

Browse files
PrestigePvPclaude
andcommitted
fix: build and address review feedback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e73f44c commit 79b44dd

File tree

17 files changed

+212
-177
lines changed

17 files changed

+212
-177
lines changed

backend/src/@types/fastify.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,13 @@ import { TIdentityAwsAuthServiceFactory } from "@app/services/identity-aws-auth/
9393
import { TIdentityAzureAuthServiceFactory } from "@app/services/identity-azure-auth/identity-azure-auth-service";
9494
import { TIdentityGcpAuthServiceFactory } from "@app/services/identity-gcp-auth/identity-gcp-auth-service";
9595
import { TIdentityJwtAuthServiceFactory } from "@app/services/identity-jwt-auth/identity-jwt-auth-service";
96-
import { TIdentitySpiffeAuthServiceFactory } from "@app/services/identity-spiffe-auth/identity-spiffe-auth-service";
9796
import { TIdentityKubernetesAuthServiceFactory } from "@app/services/identity-kubernetes-auth/identity-kubernetes-auth-service";
9897
import { TIdentityLdapAuthServiceFactory } from "@app/services/identity-ldap-auth/identity-ldap-auth-service";
9998
import { TAllowedFields } from "@app/services/identity-ldap-auth/identity-ldap-auth-types";
10099
import { TIdentityOciAuthServiceFactory } from "@app/services/identity-oci-auth/identity-oci-auth-service";
101100
import { TIdentityOidcAuthServiceFactory } from "@app/services/identity-oidc-auth/identity-oidc-auth-service";
102101
import { TIdentityProjectServiceFactory } from "@app/services/identity-project/identity-project-service";
102+
import { TIdentitySpiffeAuthServiceFactory } from "@app/services/identity-spiffe-auth/identity-spiffe-auth-service";
103103
import { TIdentityTlsCertAuthServiceFactory } from "@app/services/identity-tls-cert-auth/identity-tls-cert-auth-types";
104104
import { TIdentityTokenAuthServiceFactory } from "@app/services/identity-token-auth/identity-token-auth-service";
105105
import { TIdentityUaServiceFactory } from "@app/services/identity-ua/identity-ua-service";

backend/src/db/schemas/identity-spiffe-auths.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const IdentitySpiffeAuthsSchema = z.object({
2222
encryptedBundleEndpointCaCert: zodBuffer.nullable().optional(),
2323
encryptedCachedBundleJwks: zodBuffer.nullable().optional(),
2424
cachedBundleLastRefreshedAt: z.date().nullable().optional(),
25-
bundleRefreshHintSeconds: z.coerce.number().default(300),
25+
bundleRefreshHintSeconds: z.number().default(300),
2626
accessTokenTTL: z.coerce.number().default(7200),
2727
accessTokenMaxTTL: z.coerce.number().default(7200),
2828
accessTokenNumUsesLimit: z.coerce.number().default(0),

backend/src/db/schemas/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export * from "./identity-azure-auths";
6464
export * from "./identity-gcp-auths";
6565
export * from "./identity-group-membership";
6666
export * from "./identity-jwt-auths";
67-
export * from "./identity-spiffe-auths";
6867
export * from "./identity-kubernetes-auths";
6968
export * from "./identity-metadata";
7069
export * from "./identity-oci-auths";
@@ -73,6 +72,7 @@ export * from "./identity-org-memberships";
7372
export * from "./identity-project-additional-privilege";
7473
export * from "./identity-project-membership-role";
7574
export * from "./identity-project-memberships";
75+
export * from "./identity-spiffe-auths";
7676
export * from "./identity-tls-cert-auths";
7777
export * from "./identity-token-auths";
7878
export * from "./identity-ua-client-secrets";

backend/src/server/routes/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,6 @@ import { identityGcpAuthDALFactory } from "@app/services/identity-gcp-auth/ident
285285
import { identityGcpAuthServiceFactory } from "@app/services/identity-gcp-auth/identity-gcp-auth-service";
286286
import { identityJwtAuthDALFactory } from "@app/services/identity-jwt-auth/identity-jwt-auth-dal";
287287
import { identityJwtAuthServiceFactory } from "@app/services/identity-jwt-auth/identity-jwt-auth-service";
288-
import { identitySpiffeAuthDALFactory } from "@app/services/identity-spiffe-auth/identity-spiffe-auth-dal";
289-
import { identitySpiffeAuthServiceFactory } from "@app/services/identity-spiffe-auth/identity-spiffe-auth-service";
290288
import { identityKubernetesAuthDALFactory } from "@app/services/identity-kubernetes-auth/identity-kubernetes-auth-dal";
291289
import { identityKubernetesAuthServiceFactory } from "@app/services/identity-kubernetes-auth/identity-kubernetes-auth-service";
292290
import { identityLdapAuthDALFactory } from "@app/services/identity-ldap-auth/identity-ldap-auth-dal";
@@ -297,6 +295,8 @@ import { identityOidcAuthDALFactory } from "@app/services/identity-oidc-auth/ide
297295
import { identityOidcAuthServiceFactory } from "@app/services/identity-oidc-auth/identity-oidc-auth-service";
298296
import { identityProjectDALFactory } from "@app/services/identity-project/identity-project-dal";
299297
import { identityProjectServiceFactory } from "@app/services/identity-project/identity-project-service";
298+
import { identitySpiffeAuthDALFactory } from "@app/services/identity-spiffe-auth/identity-spiffe-auth-dal";
299+
import { identitySpiffeAuthServiceFactory } from "@app/services/identity-spiffe-auth/identity-spiffe-auth-service";
300300
import { identityTlsCertAuthDALFactory } from "@app/services/identity-tls-cert-auth/identity-tls-cert-auth-dal";
301301
import { identityTlsCertAuthServiceFactory } from "@app/services/identity-tls-cert-auth/identity-tls-cert-auth-service";
302302
import { identityTokenAuthDALFactory } from "@app/services/identity-token-auth/identity-token-auth-dal";
@@ -1972,7 +1972,6 @@ export const registerRoutes = async (
19721972
membershipIdentityDAL
19731973
});
19741974

1975-
19761975
const identityLdapAuthService = identityLdapAuthServiceFactory({
19771976
identityLdapAuthDAL,
19781977
orgDAL,

backend/src/server/routes/v1/identity-spiffe-auth-router.ts

Lines changed: 24 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,23 @@ import {
1919
} from "@app/services/identity-spiffe-auth/identity-spiffe-auth-validators";
2020
import { isSuperAdmin } from "@app/services/super-admin/super-admin-fns";
2121

22-
const IdentitySpiffeAuthResponseSchema = IdentitySpiffeAuthsSchema.omit({
23-
encryptedCaBundleJwks: true,
24-
encryptedBundleEndpointCaCert: true,
25-
encryptedCachedBundleJwks: true
22+
const IdentitySpiffeAuthResponseSchema = IdentitySpiffeAuthsSchema.pick({
23+
id: true,
24+
identityId: true,
25+
trustDomain: true,
26+
allowedSpiffeIds: true,
27+
allowedAudiences: true,
28+
configurationType: true,
29+
bundleEndpointUrl: true,
30+
bundleEndpointProfile: true,
31+
cachedBundleLastRefreshedAt: true,
32+
bundleRefreshHintSeconds: true,
33+
accessTokenTTL: true,
34+
accessTokenMaxTTL: true,
35+
accessTokenNumUsesLimit: true,
36+
accessTokenTrustedIps: true,
37+
createdAt: true,
38+
updatedAt: true
2639
}).extend({
2740
caBundleJwks: z.string(),
2841
bundleEndpointCaCert: z.string()
@@ -51,50 +64,15 @@ const CommonCreateFields = z.object({
5164
accessTokenNumUsesLimit: z.number().int().min(0).default(0).describe(SPIFFE_AUTH.ATTACH.accessTokenNumUsesLimit)
5265
});
5366

54-
const CommonUpdateFields = z
55-
.object({
56-
trustDomain: validateTrustDomain.describe(SPIFFE_AUTH.UPDATE.trustDomain),
57-
allowedSpiffeIds: validateSpiffeAllowedIdsField.describe(SPIFFE_AUTH.UPDATE.allowedSpiffeIds),
58-
allowedAudiences: validateSpiffeAllowedAudiencesField.describe(SPIFFE_AUTH.UPDATE.allowedAudiences),
59-
accessTokenTrustedIps: z
60-
.object({
61-
ipAddress: z.string().trim()
62-
})
63-
.array()
64-
.min(1)
65-
.describe(SPIFFE_AUTH.UPDATE.accessTokenTrustedIps),
66-
accessTokenTTL: z
67-
.number()
68-
.int()
69-
.min(0)
70-
.max(315360000)
71-
.describe(SPIFFE_AUTH.UPDATE.accessTokenTTL),
72-
accessTokenMaxTTL: z
73-
.number()
74-
.int()
75-
.min(0)
76-
.max(315360000)
77-
.describe(SPIFFE_AUTH.UPDATE.accessTokenMaxTTL),
78-
accessTokenNumUsesLimit: z.number().int().min(0).describe(SPIFFE_AUTH.UPDATE.accessTokenNumUsesLimit)
79-
})
80-
.partial();
67+
const CommonUpdateFields = CommonCreateFields.partial();
8168

8269
const StaticConfigurationSchema = z.object({
83-
configurationType: z
84-
.literal(SpiffeConfigurationType.STATIC)
85-
.describe(SPIFFE_AUTH.ATTACH.configurationType),
86-
caBundleJwks: z.string().min(1).describe(SPIFFE_AUTH.ATTACH.caBundleJwks),
87-
bundleEndpointUrl: z.string().optional().default(""),
88-
bundleEndpointProfile: z.nativeEnum(SpiffeBundleEndpointProfile).optional(),
89-
bundleEndpointCaCert: z.string().optional().default(""),
90-
bundleRefreshHintSeconds: z.number().int().min(0).optional().default(3600)
70+
configurationType: z.literal(SpiffeConfigurationType.STATIC).describe(SPIFFE_AUTH.ATTACH.configurationType),
71+
caBundleJwks: z.string().min(1).describe(SPIFFE_AUTH.ATTACH.caBundleJwks)
9172
});
9273

9374
const RemoteConfigurationSchema = z.object({
94-
configurationType: z
95-
.literal(SpiffeConfigurationType.REMOTE)
96-
.describe(SPIFFE_AUTH.ATTACH.configurationType),
97-
caBundleJwks: z.string().optional().default(""),
75+
configurationType: z.literal(SpiffeConfigurationType.REMOTE).describe(SPIFFE_AUTH.ATTACH.configurationType),
9876
bundleEndpointUrl: z
9977
.string()
10078
.trim()
@@ -105,13 +83,8 @@ const RemoteConfigurationSchema = z.object({
10583
.nativeEnum(SpiffeBundleEndpointProfile)
10684
.default(SpiffeBundleEndpointProfile.HTTPS_WEB)
10785
.describe(SPIFFE_AUTH.ATTACH.bundleEndpointProfile),
108-
bundleEndpointCaCert: z.string().optional().default("").describe(SPIFFE_AUTH.ATTACH.bundleEndpointCaCert),
109-
bundleRefreshHintSeconds: z
110-
.number()
111-
.int()
112-
.min(0)
113-
.default(3600)
114-
.describe(SPIFFE_AUTH.ATTACH.bundleRefreshHintSeconds)
86+
bundleEndpointCaCert: z.string().optional().describe(SPIFFE_AUTH.ATTACH.bundleEndpointCaCert),
87+
bundleRefreshHintSeconds: z.number().int().min(0).default(3600).describe(SPIFFE_AUTH.ATTACH.bundleRefreshHintSeconds)
11588
});
11689

11790
export const registerIdentitySpiffeAuthRouter = async (server: FastifyZodProvider) => {
@@ -416,10 +389,7 @@ export const registerIdentitySpiffeAuthRouter = async (server: FastifyZodProvide
416389
}),
417390
response: {
418391
200: z.object({
419-
identitySpiffeAuth: IdentitySpiffeAuthResponseSchema.omit({
420-
caBundleJwks: true,
421-
bundleEndpointCaCert: true
422-
})
392+
identitySpiffeAuth: IdentitySpiffeAuthResponseSchema
423393
})
424394
}
425395
},

backend/src/server/routes/v1/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ import { registerIdentityAwsAuthRouter } from "./identity-aws-iam-auth-router";
3838
import { registerIdentityAzureAuthRouter } from "./identity-azure-auth-router";
3939
import { registerIdentityGcpAuthRouter } from "./identity-gcp-auth-router";
4040
import { registerIdentityJwtAuthRouter } from "./identity-jwt-auth-router";
41-
import { registerIdentitySpiffeAuthRouter } from "./identity-spiffe-auth-router";
4241
import { registerIdentityKubernetesRouter } from "./identity-kubernetes-auth-router";
4342
import { registerIdentityLdapAuthRouter } from "./identity-ldap-auth-router";
4443
import { registerIdentityOciAuthRouter } from "./identity-oci-auth-router";
4544
import { registerIdentityOidcAuthRouter } from "./identity-oidc-auth-router";
4645
import { registerIdentityOrgMembershipRouter } from "./identity-org-membership-router";
4746
import { registerIdentityProjectMembershipRouter } from "./identity-project-membership-router";
4847
import { registerIdentityRouter } from "./identity-router";
48+
import { registerIdentitySpiffeAuthRouter } from "./identity-spiffe-auth-router";
4949
import { registerIdentityTlsCertAuthRouter } from "./identity-tls-cert-auth-router";
5050
import { registerIdentityTokenAuthRouter } from "./identity-token-auth-router";
5151
import { registerIdentityUaRouter } from "./identity-universal-auth-router";

backend/src/services/identity-spiffe-auth/identity-spiffe-auth-fns.ts

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import https from "https";
2-
32
import picomatch from "picomatch";
3+
import RE2 from "re2";
44

5-
const SPIFFE_ID_REGEX = /^spiffe:\/\/([^/]+)(\/.*)?$/;
5+
const SPIFFE_ID_REGEX = new RE2("^spiffe:\\/\\/([^/]+)(\\/.*)?");
66

77
export const isValidSpiffeId = (value: string): boolean => {
88
return SPIFFE_ID_REGEX.test(value);
99
};
1010

1111
export const extractTrustDomainFromSpiffeId = (spiffeId: string): string => {
12-
const match = spiffeId.match(SPIFFE_ID_REGEX);
12+
const match = SPIFFE_ID_REGEX.exec(spiffeId);
1313
if (!match) {
1414
throw new Error(`Invalid SPIFFE ID: ${spiffeId}`);
1515
}
@@ -25,22 +25,6 @@ export const doesSpiffeIdMatchPattern = (spiffeId: string, patterns: string): bo
2525
return patternList.some((pattern) => picomatch.isMatch(spiffeId, pattern));
2626
};
2727

28-
export const findSigningKeyInJwks = (jwksJson: string, kid: string) => {
29-
const jwks = JSON.parse(jwksJson) as { keys: Array<{ kid?: string; use?: string; kty: string; [key: string]: unknown }> };
30-
31-
if (!jwks.keys || !Array.isArray(jwks.keys)) {
32-
throw new Error("Invalid JWKS: missing keys array");
33-
}
34-
35-
const matchingKey = jwks.keys.find((key) => key.kid === kid);
36-
37-
if (!matchingKey) {
38-
throw new Error(`No key found in JWKS matching kid: ${kid}`);
39-
}
40-
41-
return matchingKey;
42-
};
43-
4428
const BUNDLE_FETCH_TIMEOUT_MS = 10_000;
4529
const MAX_BUNDLE_SIZE_BYTES = 1_048_576; // 1 MB
4630

0 commit comments

Comments
 (0)