Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/shared/auth.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { describe, it, expect } from '@jest/globals';
import { SafeUrlSchema, OAuthMetadataSchema, OpenIdProviderMetadataSchema, OAuthClientMetadataSchema } from './auth.js';
import {
SafeUrlSchema,
OAuthMetadataSchema,
OpenIdProviderMetadataSchema,
OAuthClientMetadataSchema,
OptionalSafeUrlSchema
} from './auth.js';

describe('SafeUrlSchema', () => {
it('accepts valid HTTPS URLs', () => {
Expand All @@ -26,6 +32,12 @@ describe('SafeUrlSchema', () => {
});
});

describe('OptionalSafeUrlSchema', () => {
it('accepts empty string and transforms it to undefined', () => {
expect(OptionalSafeUrlSchema.parse('')).toBe(undefined);
});
});

describe('OAuthMetadataSchema', () => {
it('validates complete OAuth metadata', () => {
const metadata = {
Expand Down
9 changes: 7 additions & 2 deletions src/shared/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,11 @@ export const OAuthErrorResponseSchema = z.object({
error_uri: z.string().optional()
});

/**
* Optional version of SafeUrlSchema that allows empty string for retrocompatibility on tos_uri and logo_uri
*/
export const OptionalSafeUrlSchema = SafeUrlSchema.optional().or(z.literal('').transform(() => undefined));

/**
* RFC 7591 OAuth 2.0 Dynamic Client Registration metadata
*/
Expand All @@ -162,10 +167,10 @@ export const OAuthClientMetadataSchema = z
response_types: z.array(z.string()).optional(),
client_name: z.string().optional(),
client_uri: SafeUrlSchema.optional(),
logo_uri: SafeUrlSchema.optional(),
logo_uri: OptionalSafeUrlSchema,
scope: z.string().optional(),
contacts: z.array(z.string()).optional(),
tos_uri: SafeUrlSchema.optional(),
tos_uri: OptionalSafeUrlSchema,
policy_uri: z.string().optional(),
jwks_uri: SafeUrlSchema.optional(),
jwks: z.any().optional(),
Expand Down