Files
Facilitor/UTILS/PutOrders/puo_xmltools.js
Jos Groot Lipman f6584c2079 AAIT#39909 'anonieme' autorisatie vanuit een link in de bon of e-mail
svn path=/Website/trunk/; revision=33787
2017-05-10 15:16:36 +00:00

273 lines
9.7 KiB
JavaScript

// ******************************************
// * $Id$
// *
// * UserException()
// * RaiseAnError()
// * TestAndRaiseAnXMLError()
// * SafeLoadTextXML()
// * SafeLoadFileXSL()
// * XML2HTML()
// * fetchXMLContent()
// * mergeXMLAttachments()
// * Hexify()
// *
// * XML en XSL functies.
// *
// ******************************************
//
function UserException(number, source, message)
{
this.number = number;
this.source = source;
this.description = message;
}
function RaiseAnError(e, p)
{
throw new UserException(e + 1000, "UserException", p);
}
function TestAndRaiseAnXMLError(p, iXml)
{
if (iXml.parseError.errorCode != 0)
{
RaiseAnError( iXml.parseError.errorCode
, p + "\n" + iXml.parseError.reason
+ " regel " + iXml.parseError.line
+ "(" + iXml.parseError.filepos + ")"
);
}
}
function SafeLoadTextXML(xmlText)
{
var iXml = new ActiveXObject("Msxml2.DOMDocument.6.0");
iXml.async = false;
iXml.loadXML(xmlText);
TestAndRaiseAnXMLError("Error in xmlData", iXml);
return iXml;
}
function SafeLoadFileXSL(xslPath)
{
var iXsl = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0"); // Moet FreeThreaded voor XSLTemplate
iXsl.async = false;
iXsl.setProperty("AllowXsltScript", true);
iXsl.load(custabspath + "/" + xslPath);
iXsl.resolveExternals = true; // anders SOAP problemen om de template functie te vinden
TestAndRaiseAnXMLError("Error loading file " + xslPath, iXsl);
return iXsl;
}
function XML2HTML( body
, xslPath
, srtnotificatie
, mode
, p_bedrijfadres
)
{
// Transform body=xml according to xslPath=xslfilenaam with optionel srtnotification parameter (e.g. RESBEV)
// Output is supposed to be a HTML string but really depends on the XSL content
var xslt = new ActiveXObject("Msxml2.XSLTemplate.6.0");
var xslProc;
var xslDoc = SafeLoadFileXSL(xslPath);
var result = "";
var xmlDoc = SafeLoadTextXML(body);
xslDoc.resolveExternals = true; // anders op de volgende regel al:
// A reference to variable or parameter 'srtnotificatiecode' cannot be resolved
xslt.stylesheet = xslDoc;
var xslProc = xslt.createProcessor();
xslProc.input = xmlDoc;
xslProc.addParameter("srtnotificatiecode", srtnotificatie);
xslProc.addParameter("mode", mode);
xslProc.transform();
result = xslProc.output;
// eerst lockeduser(xmlnode,key,bdradr_key) vervangen
// lockeduser(opdracht,12345,910) met 12345 opdracht_key en 910 bedrijfadres_key
var hmacs = result.match(/(lockeduser\([^\)]*\))/g); // heeft nu array van lockeduser(opdracht,12345,910)
for (var i =0; hmacs && i < hmacs.length; i++)
{
var params = hmacs[i].match(/\(([^,]+)\,(\d+),(\d+)\)/);
if (params.length == 4)
{
var xmlnode = params[1]; // We ondersteunen alleen nog maar 'opdracht'
var key = params[2];
var bdradr_key = params[3];
var sql = "SELECT prs_bedrijfadres_locksecret"
+ " FROM prs_bedrijfadres"
+ " WHERE prs_bedrijfadres_key = " + bdradr_key
+ " AND prs_bedrijfadres_locksecret IS NOT NULL"
+ " AND prs_bedrijfadres_lockuser_key IS NOT NULL";
var oRs = Oracle.Execute(sql);
var locksecret = oRs("prs_bedrijfadres_locksecret").Value;
oRs.Close();
var url = "?u={0}&k={1}&lbdr={2}".format(xmlnode, key, bdradr_key);
// create hmac
var splitter = url.split("?");
var pad = splitter[0];
var qs = splitter.length>1?splitter[1]:"x=x";
var padsplitter = pad.split("/");
var file = padsplitter[padsplitter.length-1]; // laatste component
// Let op dat protectQS.wsc hetzelfde doet voor Facmgt
var str = file.toUpperCase() + "?" + qs;
//var hmacced = protectHMAC.create(data, params);
var ts = String(Math.round((new Date).getTime() / 1000));
var data = ts + ":" + str
Log2File(2, "hmacdata: " + data);
//__Log("sleutel: "+ params.sleutel);
var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
var sig = oCrypto.hex_hmac_sha1(locksecret, data);
var hmac = oCrypto.hex2base64(sig, false, true); // no padding, urlsafe
oCrypto = null; // Caching klinkt leuk maar Oracle sessies blijven langer hangen?
hmacced = ts+":"+hmac;
newurl = pad + "?" + qs + "&hmac="+encodeURIComponent(hmacced);
//var newurl = protectQS.create(url, { sleutel: locksecret, no_user_key: true });
result = result.replace(hmacs[i], newurl);
}
}
return result;
}
function fetchXMLContent( node
, refkey
, xrefkey
, where
, userlang
)
{
var xml_content = "";
try
{
var xrefkeystr = (xrefkey == -1 ? "NULL" : safe.quoted_sql(String(xrefkey)));
// we geven de gewenste taal mee aan de Oracle sessie, die dat verder zal gebruiken
var sql = "BEGIN lcl.setuserlanguage (" + safe.quoted_sql(userlang) + "); END;"
Log2File(3, sql);
Oracle.Execute(sql);
//
var sql_params = safe.quoted_sql(node)
+ ", " + refkey
+ ", " + safe.quoted_sql(customerId)
+ ", '$PutOrdersSession$'"
+ ", " + xrefkeystr
+ ", " + safe.quoted_sql(where);
var sql = "SELECT xml.make_xml2(" + sql_params + ") xml_blob FROM dual";
Log2File(2, sql);
var oRs = Oracle.Execute(sql);
var xml_content = oRs("xml_blob").Value||"";
oRs.Close();
if (xml_content)
Log2File(2, "XML blob is {0} karakters.".format(xml_content.length));
else
Log2File(1, "XML blob is leeg. Verwijderd record?");
}
catch(e)
{
Log2File(0, "fetchXMLContent error: " + e.description);
xml_content = "";
}
finally
{
LogString2File(2, "make_xml", xml_content, "xml");
}
return xml_content;
}
function mergeXMLAttachments(iXml)
{
mergeXMLAttachments2(iXml, "//FCLTmeldingattachment", "meldingkey", "M");
mergeXMLAttachments2(iXml, "//FCLTopdrachtattachment", "opdrachtkey", "O");
}
function mergeXMLAttachments2(iXml, xmltag, keynaam, pNiveau)
{
// Doorzoek iXml op <!FCLTmeldingattachment>345</FCLTmeldingattachment>
// en vervang die door alle flexkenmerken er onder
// <Iattachements>
// <attachment>...hexdata...</attachtment>
// <name>naam</name>
// <size>1235</size>
// </attachment>
// </Iattachments>
var NodeList = iXml.documentElement.selectNodes(xmltag);
if (NodeList.length > 0)
{
Log2File(1, "*> mergeXMLAttachments");
for (var index=0; index < NodeList.length; index++)
{
var node = NodeList[index];
var meldingopdrachtkey = trimall(node.attributes.getNamedItem(keynaam).text);
var kenmerkkey = trimall(node.attributes.getNamedItem("kenmerkkey").text);
var nodename = trimall(node.attributes.getNamedItem("nodename").text);
var AttachPath = S("flexfilespath") + "/MLD/" + subfolderKey(pNiveau, meldingopdrachtkey) + "/" + kenmerkkey;
Log2File(1, "AttachPath: " + AttachPath);
var objFso = new ActiveXObject("Scripting.FileSystemObject");
if (objFso.FolderExists(AttachPath))
{
var objFiles = objFso.GetFolder(AttachPath);
var allFiles = new Enumerator(objFiles.files);
for (; !allFiles.atEnd(); allFiles.moveNext())
{
var attFile = allFiles.item();
Log2File(1, "Adding attachment: " + attFile.path + " (" + attFile.Size + " bytes)");
var elemAttachments = iXml.createElement(nodename);
var elemAtt = iXml.createElement("attachment");
elemAtt.text = Hexify(attFile.path);
elemAttachments.appendChild(elemAtt);
elemAtt = iXml.createElement("name");
elemAtt.text = attFile.name;
elemAttachments.appendChild(elemAtt);
elemAtt = iXml.createElement("size");
elemAtt.text = attFile.Size;
elemAttachments.appendChild(elemAtt);
node.parentNode.appendChild(elemAttachments);
}
}
node.parentNode.removeChild(node); // dummy fcltattachments weg
}
Log2File(2, "*< mergeXMLAttachments");
}
return iXml;
}
function Hexify(p_path)
{
var oStream = new ActiveXObject("ADODB.Stream");
oStream.charset = "Windows-1252";
oStream.Open();
oStream.Type = 2; // adTypeText
oZIP = new ActiveXObject("SLNKDWF.Zip");
oZIP.FileToHexStream(p_path, oStream);
oStream.Position = 0;
ReadBytes = 131072; // optimaal volgens http://support.microsoft.com/kb/280067
var result = "";
while (!oStream.EOS)
{
result = result + oStream.ReadText(ReadBytes);
}
return result;
}