diff --git a/package-lock.json b/package-lock.json index d63f0c9..4a59d64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,12 @@ "version": "1.3.6", "license": "Apache 2.0", "dependencies": { - "@boxyhq/saml20": "1.4.13", + "@boxyhq/saml20": "1.4.14", "daisyui": "4.7.2", "next": "14.1.3", "react": "18.2.0", "react-dom": "18.2.0", - "react-gtm-module": "2.0.11", - "xmlbuilder": "15.1.1" + "react-gtm-module": "2.0.11" }, "devDependencies": { "@types/node": "20.11.25", @@ -248,9 +247,9 @@ } }, "node_modules/@boxyhq/saml20": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@boxyhq/saml20/-/saml20-1.4.13.tgz", - "integrity": "sha512-ypj3/0pQqLGJxWtXjAr+sXcCNQz0DnMK00FTb3RUyTxFyksr8gVTO66cd+Qlu3rDzYLSEp+d6PLAGTb4ThTwkA==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@boxyhq/saml20/-/saml20-1.4.14.tgz", + "integrity": "sha512-aLoCe6MTxoA65GXAXCZ+2bmZbb+9OZVUp7w0VbWlpFTcQpBOpKjkFnYqEfh3tkPZqDsFgjIESnBYfYDqbtPOvQ==", "dependencies": { "@xmldom/xmldom": "0.8.10", "xml-crypto": "6.0.0", diff --git a/package.json b/package.json index 6e760ad..c50994f 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,12 @@ "release": "git checkout release && git merge origin/main && release-it && git checkout main && git merge origin/release && git push origin main" }, "dependencies": { - "@boxyhq/saml20": "1.4.13", + "@boxyhq/saml20": "1.4.14", "daisyui": "4.7.2", "next": "14.1.3", "react": "18.2.0", "react-dom": "18.2.0", - "react-gtm-module": "2.0.11", - "xmlbuilder": "15.1.1" + "react-gtm-module": "2.0.11" }, "devDependencies": { "@types/node": "20.11.25", diff --git a/pages/api/saml/metadata.ts b/pages/api/saml/metadata.ts index 91e5e83..e789443 100644 --- a/pages/api/saml/metadata.ts +++ b/pages/api/saml/metadata.ts @@ -3,7 +3,6 @@ import saml from '@boxyhq/saml20'; import config from 'lib/env'; import type { IdPMetadata } from 'types'; -import { createIdPMetadataXML } from 'utils'; import stream from 'stream'; import { promisify } from 'util'; import { getEntityId, getSSOUrl } from 'lib/entity-id'; @@ -24,10 +23,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< const filename = 'mock-saml-metadata' + (req.query.namespace ? `-${req.query.namespace}` : '') + '.xml'; - const xml = await createIdPMetadataXML({ - idpEntityId: getEntityId(config.entityId, req.query.namespace as any), - idpSsoUrl: getSSOUrl(config.appUrl, req.query.namespace as any), - certificate: saml.stripCertHeaderAndFooter(config.publicKey), + const xml = saml.createIdPMetadataXML({ + entityId: getEntityId(config.entityId, req.query.namespace as any), + ssoUrl: getSSOUrl(config.appUrl, req.query.namespace as any), + x509cert: saml.stripCertHeaderAndFooter(config.publicKey), + wantAuthnRequestsSigned: true, }); res.setHeader('Content-type', 'text/xml'); diff --git a/utils/idp.ts b/utils/idp.ts deleted file mode 100644 index 78b2fbc..0000000 --- a/utils/idp.ts +++ /dev/null @@ -1,55 +0,0 @@ -import xmlbuilder from 'xmlbuilder'; -import saml from '@boxyhq/saml20'; - -const createIdPMetadataXML = async ({ - idpEntityId, - idpSsoUrl, - certificate, -}: { - idpEntityId: string; - idpSsoUrl: string; - certificate: string; -}): Promise => { - certificate = saml.stripCertHeaderAndFooter(certificate); - - const today = new Date(); - const nodes = { - 'md:EntityDescriptor': { - '@xmlns:md': 'urn:oasis:names:tc:SAML:2.0:metadata', - '@entityID': idpEntityId, - '@validUntil': new Date(today.setFullYear(today.getFullYear() + 10)).toISOString(), - 'md:IDPSSODescriptor': { - '@WantAuthnRequestsSigned': true, - '@protocolSupportEnumeration': 'urn:oasis:names:tc:SAML:2.0:protocol', - 'md:KeyDescriptor': { - '@use': 'signing', - 'ds:KeyInfo': { - '@xmlns:ds': 'http://www.w3.org/2000/09/xmldsig#', - 'ds:X509Data': { - 'ds:X509Certificate': { - '#text': certificate, - }, - }, - }, - }, - 'md:NameIDFormat': { - '#text': 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', - }, - 'md:SingleSignOnService': [ - { - '@Binding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', - '@Location': idpSsoUrl, - }, - { - '@Binding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - '@Location': idpSsoUrl, - }, - ], - }, - }, - }; - - return xmlbuilder.create(nodes, { encoding: 'UTF-8', standalone: false }).end({ pretty: true }); -}; - -export { createIdPMetadataXML }; diff --git a/utils/index.ts b/utils/index.ts index 572dc75..cea7596 100644 --- a/utils/index.ts +++ b/utils/index.ts @@ -1,2 +1 @@ export * from './certificate'; -export * from './idp';