"use strict";
// var fs = require('fs');
// var path = require('path');
// var ejs = require('ejs');
// var SignedXml = require('xml-crypto').SignedXml;
// var uuid4 = require('uuid/v4');
import { SignedXml } from 'xml-crypto';
import uuid4 from 'uuid/v4';
let wsseSecurityHeaderTemplate;
let wsseSecurityTokenTemplate;
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes * 60000);
}
function dateStringForSOAP(date) {
return date.getUTCFullYear() + '-' + ('0' + (date.getUTCMonth() + 1)).slice(-2) + '-' +
('0' + date.getUTCDate()).slice(-2) + 'T' + ('0' + date.getUTCHours()).slice(-2) + ":" +
('0' + date.getUTCMinutes()).slice(-2) + ":" + ('0' + date.getUTCSeconds()).slice(-2) + "Z";
}
function generateCreated() {
return dateStringForSOAP(new Date());
}
function generateExpires() {
return dateStringForSOAP(addMinutes(new Date(), 10));
}
function insertStr(src, dst, pos) {
return [dst.slice(0, pos), src, dst.slice(pos)].join('');
}
function generateId() {
return uuid4().replace(/-/gm, '');
}
export function WSSecurityCert(privatePEM, publicP12PEM, password) {
this.publicP12PEM = publicP12PEM.toString().replace('-----BEGIN CERTIFICATE-----', '').replace('-----END CERTIFICATE-----', '').replace(/(\r\n|\n|\r)/gm, '');
this.signer = new SignedXml();
this.signer.signingKey = {
key: privatePEM,
passphrase: password
};
this.x509Id = "x509-" + generateId();
var _this = this;
this.signer.keyInfoProvider = {};
this.signer.keyInfoProvider.getKeyInfo = function (key) {
if (!wsseSecurityTokenTemplate) {
// wsseSecurityTokenTemplate = ejs.compile(fs.readFileSync(path.join(__dirname, 'templates', 'wsse-security-token.ejs')).toString());
}
// return wsseSecurityTokenTemplate({ x509Id: _this.x509Id });
return `
`;
};
}
WSSecurityCert.prototype.postProcess = function (xml, envelopeKey) {
this.created = generateCreated();
this.expires = generateExpires();
if (!wsseSecurityHeaderTemplate) {
// wsseSecurityHeaderTemplate = ejs.compile(fs.readFileSync(path.join(__dirname, 'templates', 'wsse-security-header.ejs')).toString());
}
// var secHeader = wsseSecurityHeaderTemplate({
// binaryToken: this.publicP12PEM,
// created: this.created,
// expires: this.expires,
// id: this.x509Id
// });
var secHeader = `
${this.publicP12PEM}
${this.created}
${this.expires}
`;
var xmlWithSec = insertStr(secHeader, xml, xml.indexOf(''));
var references = ["http://www.w3.org/2000/09/xmldsig#enveloped-signature",
"http://www.w3.org/2001/10/xml-exc-c14n#"];
this.signer.addReference("//*[name(.)='" + envelopeKey + ":Body']", references);
this.signer.addReference("//*[name(.)='wsse:Security']/*[local-name(.)='Timestamp']", references);
this.signer.computeSignature(xmlWithSec);
return insertStr(this.signer.getSignatureXml(), xmlWithSec, xmlWithSec.indexOf(''));
};
// module.exports = WSSecurityCert;