mocksaml/utils/index.ts

92 lines
2.3 KiB
TypeScript
Raw Normal View History

2022-01-14 19:55:28 +00:00
// @ts-ignore
import { promises as fs } from 'fs';
import path from 'path';
import xml2js from 'xml2js';
import { User } from '../types';
2022-02-18 05:51:30 +00:00
import {promisify} from 'util';
import zlib from 'zlib';
const inflateRawSync = promisify(zlib.inflateRawSync)
2022-01-14 19:55:28 +00:00
// Parse XML
const parseXML = (xml: string): Promise<Record<string, any>> => {
return new Promise((resolve, reject) => {
xml2js.parseString(xml, (err: Error, result: any) => {
2022-02-18 05:51:30 +00:00
if(err) {
reject(err);
}
2022-01-14 19:55:28 +00:00
resolve(result);
});
});
};
2022-02-17 16:13:25 +00:00
// Parse SAMLRequest attributes
const extractSAMLRequestAttributes = async (samlRequest: string) => {
2022-02-18 05:51:30 +00:00
// const request = await inflateRawSync(Buffer.from(samlRequest, 'base64')).toString();
// const result = await parseXML(request);
// const attributes = result['samlp:AuthnRequest']['$'];
2022-01-14 19:55:28 +00:00
return {
2022-02-18 05:51:30 +00:00
id: '123',
acsUrl: 'https://hookb.in/NOrYqkDLnXse8mNNlDXx',
providerName: 'BoxyHQ',
2022-01-14 19:55:28 +00:00
};
};
const createIdPMetadataXML = async ({
idpEntityId,
idpSsoUrl,
certificate,
}: {
idpEntityId: string;
idpSsoUrl: string;
certificate: string;
}): Promise<string> => {
const xmlPath = path.join('data', 'idp-metadata.xml');
const xml = await fs.readFile(xmlPath, 'utf8');
return xml
.replace('idp_entity_id', idpEntityId)
.replace('idp_certificate', extractCert(certificate))
.replace(/idp_sso_url/g, idpSsoUrl);
};
const createCertificate = async () => {
const certificateFilePath = path.join('data', 'x509cert.txt');
return await fs.readFile(certificateFilePath, 'utf8');
};
const extractCert = (certificate: string) => {
return certificate
.replace('-----BEGIN CERTIFICATE-----', '')
.replace('-----END CERTIFICATE-----', '')
.trim();
};
// Create SAML Response XML
const createSAMLResponseXML = async (user: User): Promise<string> => {
const xmlPath = path.join('data', 'saml-response.xml');
const xml = await fs.readFile(xmlPath, 'utf8');
return xml
.replace(
/idp_entity_id/g,
'https://accounts.google.com/o/saml2?idpid=C02frd9s1'
)
.replace('sp_acs_url', 'some-url')
.replace(/user_email/g, 'kiran@demo.com')
.replace('user_firstName', 'Kiran')
.replace('user_lastName', 'K');
};
export {
parseXML,
extractSAMLRequestAttributes,
createIdPMetadataXML,
createSAMLResponseXML,
createCertificate,
extractCert,
2022-02-17 16:13:25 +00:00
};