273 lines
9.7 KiB
JavaScript
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;
|
|
}
|