Skip to content

Commit

Permalink
feat(schemas): add saml_application_configs table
Browse files Browse the repository at this point in the history
  • Loading branch information
darcyYe committed Nov 19, 2024
1 parent f3d1c51 commit 61399b8
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { sql } from '@silverhand/slonik';

import type { AlterationScript } from '../lib/types/alteration.js';

import { applyTableRls, dropTableRls } from './utils/1704934999-tables.js';

const alteration: AlterationScript = {
up: async (pool) => {
await pool.query(sql`
create table saml_application_configs (
application_id varchar(21) not null
references applications (id) on update cascade on delete cascade,
tenant_id varchar(21) not null
references tenants (id) on update cascade on delete cascade,
name varchar(256) not null,
description text,
attribute_mapping jsonb /* @use SamlAttributeMapping */ not null default '{}'::jsonb,
sp_metadata jsonb /* @use SamlSpMetadata */ not null,
primary key (tenant_id, application_id),
constraint application_type
check (check_application_type(application_id, 'SAML'))
);
`);
await applyTableRls(pool, 'saml_application_configs');
},
down: async (pool) => {
await dropTableRls(pool, 'saml_application_configs');
await pool.query(sql`
drop table saml_application_configs;
`);
},
};

export default alteration;
1 change: 1 addition & 0 deletions packages/schemas/src/foundations/jsonb-types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export * from './sso-connector.js';
export * from './applications.js';
export * from './verification-records.js';
export * from './account-centers.js';
export * from './saml-application-configs.js';

export {
configurableConnectorMetadataGuard,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { type ToZodObject } from '@logto/connector-kit';
import { z } from 'zod';

export type SamlAttributeMapping = Record<string, string>;

export const samlAttributeMappingGuard = z.record(
z.string()
) satisfies z.ZodType<SamlAttributeMapping>;

export enum BindingType {
POST = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
REDIRECT = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
}

export type SamlSpMetadata = {
entityID: string;
acsURL: {
binding: BindingType;
url: string;
};
};

export const samlSpMetadataGuard = z.object({
entityID: z.string(),
acsURL: z.object({
binding: z.nativeEnum(BindingType),
url: z.string(),
}),
}) satisfies ToZodObject<SamlSpMetadata>;
20 changes: 20 additions & 0 deletions packages/schemas/tables/saml_application_configs.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* init_order = 2 */

/**
* The SAML application config and SAML-type application have a one-to-one correspondence:
* - a SAML-type application can only have one SAML application config
* - a SAML application config can only configure one SAML-type application
*/
create table saml_application_configs (
application_id varchar(21) not null
references applications (id) on update cascade on delete cascade,
tenant_id varchar(21) not null
references tenants (id) on update cascade on delete cascade,
name varchar(256) not null,
description text,
attribute_mapping jsonb /* @use SamlAttributeMapping */ not null default '{}'::jsonb,
sp_metadata jsonb /* @use SamlSpMetadata */ not null,
primary key (tenant_id, application_id),
constraint application_type
check (check_application_type(application_id, 'SAML'))
);

0 comments on commit 61399b8

Please sign in to comment.