@dgac/nmb2b-client
Version:
EUROCONTROL Network Manager B2B SOAP client
1 lines • 7.19 kB
Source Map (JSON)
{"version":3,"sources":["../src/security.ts","../src/utils/debug.ts"],"sourcesContent":["import invariant from 'invariant';\nimport d from './utils/debug';\nconst debug = d('security');\nimport type { Config } from './config';\nimport type { ISecurity } from 'soap';\nimport {\n ClientSSLSecurity,\n ClientSSLSecurityPFX,\n BasicAuthSecurity,\n} from 'soap';\nimport fs from 'fs';\n\ninterface PfxSecurity {\n pfx: Buffer;\n passphrase: string;\n}\n\ninterface PemSecurity {\n cert: Buffer;\n key: Buffer;\n passphrase?: string;\n}\n\ninterface ApiGwSecurity {\n apiKeyId: string;\n apiSecretKey: string;\n}\n\nexport type Security = PfxSecurity | PemSecurity | ApiGwSecurity;\n\nexport function isValidSecurity(obj: unknown): obj is Security {\n invariant(!!obj && typeof obj === 'object', 'Must be an object');\n\n if ('apiKeyId' in obj) {\n invariant(\n !!obj.apiKeyId &&\n typeof obj.apiKeyId === 'string' &&\n obj.apiKeyId.length > 0,\n 'security.apiKeyId must be a string with a length > 0',\n );\n\n invariant(\n 'apiSecretKey' in obj &&\n typeof obj.apiSecretKey === 'string' &&\n obj.apiSecretKey.length > 0,\n 'security.apiSecretKey must be defined when using security.apiKeyId',\n );\n\n return true;\n }\n\n invariant(\n ('pfx' in obj && Buffer.isBuffer(obj.pfx)) ||\n ('cert' in obj && Buffer.isBuffer(obj.cert)),\n 'security.pfx or security.cert must be buffers',\n );\n\n if ('cert' in obj && obj.cert) {\n invariant(\n 'key' in obj && obj.key && Buffer.isBuffer(obj.key),\n 'security.key must be a buffer if security.pem is defined',\n );\n }\n\n return true;\n}\n\nexport function prepareSecurity(config: Config): ISecurity {\n const { security } = config;\n\n if ('apiKeyId' in security) {\n const { apiKeyId, apiSecretKey } = security;\n debug('Using ApiGateway security');\n return new BasicAuthSecurity(apiKeyId, apiSecretKey);\n } else if ('pfx' in security) {\n const { pfx, passphrase } = security;\n debug('Using PFX certificates');\n return new ClientSSLSecurityPFX(pfx, passphrase);\n } else if ('cert' in security) {\n debug('Using PEM certificates');\n const { key, cert, passphrase } = security;\n return new ClientSSLSecurity(\n key,\n cert,\n undefined,\n passphrase ? { passphrase } : null,\n );\n }\n\n throw new Error('Invalid security object');\n}\n\nlet envSecurity: Security | undefined;\n\n/**\n * Create a security objet from environment variables\n *\n * Will cache data for future use.\n *\n * @returns Security configuration\n */\nexport function fromEnv(): Security {\n if (envSecurity) {\n return envSecurity;\n }\n\n const { B2B_CERT, B2B_API_KEY_ID, B2B_API_SECRET_KEY } = process.env;\n\n if (!B2B_CERT && !B2B_API_KEY_ID) {\n throw new Error(\n 'Please define a B2B_CERT or a B2B_API_KEY_ID environment variable',\n );\n }\n\n if (B2B_API_KEY_ID) {\n if (!B2B_API_SECRET_KEY) {\n throw new Error(\n `When using B2B_API_KEY_ID, a B2B_API_SECRET_KEY must be defined`,\n );\n }\n\n return {\n apiKeyId: B2B_API_KEY_ID,\n apiSecretKey: B2B_API_SECRET_KEY,\n };\n }\n\n if (!B2B_CERT) {\n throw new Error('Should never happen');\n }\n\n if (!fs.existsSync(B2B_CERT)) {\n throw new Error(`${B2B_CERT} is not a valid certificate file`);\n }\n\n const pfxOrPem = fs.readFileSync(B2B_CERT);\n\n if (!process.env.B2B_CERT_FORMAT || process.env.B2B_CERT_FORMAT === 'pfx') {\n envSecurity = {\n pfx: pfxOrPem,\n passphrase: process.env.B2B_CERT_PASSPHRASE ?? '',\n };\n\n return envSecurity;\n } else if (process.env.B2B_CERT_FORMAT === 'pem') {\n if (!process.env.B2B_CERT_KEY || !fs.existsSync(process.env.B2B_CERT_KEY)) {\n throw new Error(\n 'Please define a valid B2B_CERT_KEY environment variable',\n );\n }\n\n envSecurity = {\n cert: pfxOrPem,\n key: fs.readFileSync(process.env.B2B_CERT_KEY),\n };\n\n if (process.env.B2B_CERT_PASSPHRASE) {\n envSecurity = {\n ...envSecurity,\n passphrase: process.env.B2B_CERT_PASSPHRASE,\n };\n return envSecurity;\n }\n\n return envSecurity;\n }\n\n throw new Error('Unsupported B2B_CERT_FORMAT, must be pfx or pem');\n}\n\n/**\n * Convenience function to clear the cached security objet\n */\nexport function clearCache(): void {\n envSecurity = undefined;\n}\n","import d from 'debug';\nconst PREFIX = '@dgac/nmb2b-client';\nconst debug = d(PREFIX);\n\nfunction log(ns?: string) {\n if (!ns) {\n return debug;\n }\n\n return debug.extend(ns);\n}\n\nexport default log;\n"],"mappings":"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","names":["d","debug","invariant","fs"]}