943 lines
36 KiB
C++
943 lines
36 KiB
C++
<% /*
|
||
$Revision$
|
||
$Id$
|
||
|
||
File: FlexFiles.inc
|
||
Description:
|
||
Parameters:
|
||
Context:
|
||
Note: pModule, pKey en pSubpath worden genormaliseerd
|
||
tot simpele/veilige padnamen
|
||
|
||
pickfile heeft als bijeffect dat je een bijlage uit de lijst kunt kiezen
|
||
*/
|
||
|
||
var fso = Server.CreateObject("Scripting.FileSystemObject"); // Die hebben we hier *zo* vaak nog.
|
||
|
||
function trackBijlagen(pModule, pKey, params, result, action)
|
||
{
|
||
if (pKey > -1 && params.trackcode && (params.kenmerktype == "E" || params.kenmerktype == "F" || params.kenmerktype == "M"))
|
||
{
|
||
if (pModule == "BEZ") { // Voor afpraken heb ik de afspraak key nodig i.p.v. de bezoekerskey om de kenmerk omschrijving te bepalen.
|
||
var sql = "SELECT bez_afspraak_key" +
|
||
" FROM bez_bezoekers" +
|
||
" WHERE bez_bezoekers_key = " + pKey;
|
||
var oRs = Oracle.Execute(sql);
|
||
var afspr_key = oRs("bez_afspraak_key").Value;
|
||
oRs.close();
|
||
pKey = String(afspr_key);
|
||
}
|
||
|
||
var ptxt;
|
||
var j;
|
||
if (action == "upload")
|
||
{
|
||
for (j = 0; j < result.safefilename.length; j++)
|
||
{
|
||
if (params.kenmerksysteem & 4)
|
||
ptxt = L("lcl_shared_attachment_add").format(params.kenmerkoms, L("lcl_confidential_mask"));
|
||
else
|
||
ptxt = L("lcl_shared_attachment_add").format(params.kenmerkoms, result.safefilename[j]);
|
||
shared.trackaction(params.trackcode, pKey, ptxt);
|
||
}
|
||
}
|
||
else if (action == "delete")
|
||
{
|
||
if (params.kenmerksysteem & 4)
|
||
ptxt = L("lcl_shared_attachment_delete").format(params.kenmerkoms, L("lcl_confidential_mask"));
|
||
else
|
||
ptxt = L("lcl_shared_attachment_delete").format(params.kenmerkoms, safe.filename(pDoDelete));
|
||
shared.trackaction(params.trackcode, pKey, ptxt);
|
||
}
|
||
}
|
||
}
|
||
|
||
function bepaalNiveau(pModule, pNiveau)
|
||
{
|
||
if (pModule == "MLD")
|
||
{
|
||
if ("MO".indexOf(pNiveau) >=0)
|
||
return pNiveau;
|
||
else
|
||
INTERNAL_ERROR_PNIVEAU;
|
||
}
|
||
if (pModule == "PRS")
|
||
{
|
||
if ("ABCP".indexOf(pNiveau) >=0)
|
||
return pNiveau;
|
||
else
|
||
INTERNAL_ERROR_PNIVEAU;
|
||
}
|
||
|
||
// return pModule.substr(0,1) zou waarschijnlijk ook voldoen
|
||
switch (pModule)
|
||
{
|
||
case "ALG": pNiveau = "A";
|
||
break;
|
||
case "BES":
|
||
case "BEZ": pNiveau = "B";
|
||
break;
|
||
case "CNT": pNiveau = "C";
|
||
break;
|
||
case "FIN": pNiveau = "F";
|
||
break;
|
||
case "INS": pNiveau = (pNiveau ? pNiveau : "I"); // S voor sleutel (en toekomst: C voor controle/inspectie)
|
||
break;
|
||
case "MRK": pNiveau = "M";
|
||
break;
|
||
case "RES": pNiveau = "R";
|
||
break;
|
||
case "FAQ": pNiveau = "F";
|
||
break;
|
||
}
|
||
return pNiveau;
|
||
}
|
||
|
||
function kenmerkwaardetabel_info(pModule, pNiveau)
|
||
{
|
||
// zie ook FAC_PACFLEX.src
|
||
var kmw = {module: pModule};
|
||
switch (pModule)
|
||
{
|
||
case "ALG": kmw.tabel = "alg_onrgoedkenmerk";
|
||
kmw.refkey = "alg_onrgoed_key";
|
||
break;
|
||
case "BES": if (pNiveau == "I")
|
||
{ kmw.module = "BES";
|
||
kmw.tabel = "bes_kenmerkbesteli";
|
||
kmw.refkey = "bes_bestelling_item_key";
|
||
}
|
||
if (pNiveau == "B")
|
||
{ kmw.module = "BES";
|
||
kmw.tabel = "bes_kenmerkbestell";
|
||
kmw.ref_key = "bes_bestelling_key";
|
||
}
|
||
break;
|
||
case "BEZ": kmw.tabel = "bez_kenmerkwaarde";
|
||
kmw.refkey = "bez_bezoekers_key";
|
||
break;
|
||
case "CNT": kmw.tabel = "cnt_kenmerkcontract";
|
||
kmw.refkey = "cnt_contract_key";
|
||
break;
|
||
case "FAQ": kmw.tabel = "faq_kenmerkwaarde";
|
||
kmw.refkey = "fac_faq_key";
|
||
break;
|
||
case "FIN": if (pNiveau == "R")
|
||
{ kmw.module = "FIN";
|
||
kmw.tabel = "fin_kenmerkfactregel";
|
||
kmw.refkey = "fin_factuurregel_key";
|
||
}
|
||
if (pNiveau == "F")
|
||
{ kmw.module = "FIN";
|
||
kmw.tabel = "fin_kenmerkfactuur";
|
||
kmw.refkey = "fin_factuur_key";
|
||
}
|
||
break;
|
||
case "INS": kmw.tabel = "ins_kenmerkdeel";
|
||
kmw.refkey = "ins_deel_key";
|
||
break;
|
||
case "MLD": if (pNiveau == "M")
|
||
{ kmw.module = "MLD";
|
||
kmw.tabel = "mld_kenmerkmelding";
|
||
kmw.refkey = "mld_melding_key";
|
||
}
|
||
if (pNiveau == "O")
|
||
{ kmw.module = "OPD";
|
||
kmw.tabel = "mld_kenmerkopdr";
|
||
kmw.refkey = "mld_opdr_key";
|
||
}
|
||
break;
|
||
case "PRS": kmw.tabel = "prs_kenmerklink";
|
||
kmw.refkey = "prs_link_key";
|
||
break;
|
||
case "RES": kmw.module = "RES";
|
||
kmw.tabel = "res_kenmerkwaarde";
|
||
kmw.refkey = "res_rsv_ruimte_key";
|
||
//kmw.tabel = "res_kenmerkartikel";
|
||
//kmw.refkey = "res_rsv_artikel_key";
|
||
break;
|
||
}
|
||
|
||
kmw.kenmerkkey = pModule + "_kenmerk_key";
|
||
kmw.waarde = kmw.tabel + "_waarde";
|
||
kmw.verwijder = kmw.tabel + "_verwijder";
|
||
|
||
// Uitzondering:
|
||
if (pModule == "RES")
|
||
kmw.waarde = "res_kenmerkreservering_waarde";
|
||
return kmw;
|
||
}
|
||
|
||
var cache_bepaalKenmerkGegevens = []; // vanuit API2 mogelijk voor heel veel records aangeroepen
|
||
function bepaalKenmerkGegevens(pModule, pKenmerkkey)
|
||
{
|
||
if (pKenmerkkey == null)
|
||
return {kenmerk_omschrijving: null, kenmerk_type: null};
|
||
|
||
var cache_code = pModule + "_" + pKenmerkkey;
|
||
if (cache_code in cache_bepaalKenmerkGegevens)
|
||
return cache_bepaalKenmerkGegevens[cache_code];
|
||
|
||
var table;
|
||
var srttable;
|
||
switch (pModule)
|
||
{
|
||
case "ALG": table = "alg_kenmerk";
|
||
break;
|
||
case "BES": table = "bes_kenmerk";
|
||
srttable = "bes_srtkenmerk";
|
||
break;
|
||
case "BEZ": table = "bez_kenmerk";
|
||
break;
|
||
case "CNT": table = "cnt_kenmerk";
|
||
srttable = "cnt_srtkenmerk";
|
||
break;
|
||
case "FIN": table = "fin_kenmerk";
|
||
break;
|
||
case "INS": table = "ins_kenmerk";
|
||
srttable = "ins_srtkenmerk";
|
||
break;
|
||
case "MLD": table = "mld_kenmerk";
|
||
srttable = "mld_srtkenmerk";
|
||
break;
|
||
case "PRS": table = "prs_kenmerk";
|
||
break;
|
||
case "RES": table = "res_kenmerk";
|
||
srttable = "res_srtkenmerk";
|
||
break;
|
||
case "FAQ": table = "faq_kenmerk";
|
||
break;
|
||
}
|
||
|
||
var sql = "SELECT " + lcl.xsql((srttable? "sk." + srttable : "k." + table) + "_omschrijving", (srttable? "sk." + srttable : "k." + table) + "_key") + " kenmerk_omschrijving"
|
||
+ " , " + (srttable? srttable : table) + "_kenmerktype kenmerk_type"
|
||
+ " , " + (srttable? srttable : table) + "_systeem kenmerk_systeem"
|
||
+ " FROM " + table + " k"
|
||
+ (srttable
|
||
? " , " + srttable + " sk"
|
||
: "")
|
||
+ " WHERE k." + table + "_key = " + pKenmerkkey
|
||
+ (srttable
|
||
? " AND k." + srttable + "_key = sk." + srttable + "_key"
|
||
: "")
|
||
var oRs = Oracle.Execute(sql);
|
||
var kenmerk_omschrijving = oRs("kenmerk_omschrijving").Value;
|
||
var kenmerk_type = oRs("kenmerk_type").Value;
|
||
var kenmerk_systeem = oRs("kenmerk_systeem").Value;
|
||
oRs.close();
|
||
|
||
cache_bepaalKenmerkGegevens[cache_code] = {kenmerk_omschrijving: kenmerk_omschrijving, kenmerk_type: kenmerk_type, kenmerk_systeem: kenmerk_systeem}
|
||
return cache_bepaalKenmerkGegevens[cache_code];
|
||
}
|
||
|
||
function subfolderNew(pNiveau, pId)
|
||
{
|
||
return pNiveau + "__NEW__" + pId;
|
||
}
|
||
|
||
function subfolderKey(pNiveau, pKey)
|
||
{
|
||
var keyStr = "0000000" + pKey;
|
||
var subfolder = pNiveau + keyStr.substr(keyStr.length-7,4) + "___/" + pNiveau + pKey;
|
||
return subfolder;
|
||
}
|
||
|
||
// Codering: M=MLD:K=12345:S=587:N=M:R=R400x400,F=AMSG0-01-A047.JPG
|
||
function flexProps2(flexcode)
|
||
{
|
||
var Module, Key, Subpath, Niveau, getparams;
|
||
var getparams = { getFiles: true };
|
||
|
||
var codes = flexcode.split(":");
|
||
for (var i = 0; i < codes.length; i++)
|
||
{
|
||
var code = codes[i].substr(0,1);
|
||
var data = codes[i].substr(2);
|
||
switch (codes[i].substr(0,1))
|
||
{
|
||
case "M": Module = data;
|
||
break;
|
||
case "K": Key = data; // Ik zou hier willen testen met parseInt maar bijvoorbeeld bij graphics is de Key een dwf-bestandsnaam
|
||
if (!Key)
|
||
shared.internal_error("Bad key in <em>{0}</em>".format(Server.HTMLEncode(flexcode)));
|
||
break;
|
||
case "S": Subpath = data; // Doorgaans kenmerk key
|
||
break;
|
||
case "N": Niveau = data;
|
||
break;
|
||
case "F": getparams.getFile = data;
|
||
break;
|
||
case "R": getparams.resizeCode = data;
|
||
break;
|
||
}
|
||
}
|
||
|
||
var params = flexProps(Module, Key, Subpath, Niveau, getparams);
|
||
return params;
|
||
}
|
||
function flexProps(pModule, pKey, pSubpath, pNiveau, params)
|
||
{
|
||
params = params || {};
|
||
var result = { directlink: false, files: [] };
|
||
switch (pModule)
|
||
{
|
||
case "FGII": // Facilitor Graphics
|
||
result.AttachRootPath = S("flexfilespath") + "/cad/concept/";
|
||
result.AttachPath = result.AttachRootPath;
|
||
result.searchfile = true;
|
||
result.multi = true;
|
||
result.extFilter = "dwf";
|
||
break;
|
||
case "FGIIV": // Vluchtplannen
|
||
result.AttachRootPath = S("flexfilespath") + "/cad/vlucht/";
|
||
result.AttachPath = result.AttachRootPath + "V" + pKey + "/";
|
||
result.pickfile = true;
|
||
result.multi = true;
|
||
result.extFilter = "dwf";
|
||
break;
|
||
case "FGIIS": // Facilitor Graphics symbolen
|
||
result.AttachRootPath = S("flexfilespath") + "/cad/symbols/";
|
||
result.AttachPath = result.AttachRootPath;
|
||
result.pickfile = true;
|
||
result.multi = true;
|
||
result.extFilter = "dwf";
|
||
break;
|
||
case "FGIIP":
|
||
result.AttachRootPath = S("flexfilespath") + "/cad/prj/";
|
||
result.AttachPath = result.AttachRootPath + pKey + "/";
|
||
result.pickfile = true;
|
||
result.multi = true;
|
||
result.extFilter = "dwf";
|
||
break;
|
||
case "BESPH":
|
||
// Bestanden zijn te vinden op prs_bedrijf.prs_bedrijf_image_loc of ...cust/xxxx/photos/bes/[disc_key]/
|
||
// Wij kunnen alleen bestanden naar ...cust/xxxx/photos/bes/[disc_key]/ uploaden.
|
||
result.AttachRootPath = Server.MapPath(S("bes_image_path"));
|
||
result.AttachPath = result.AttachRootPath + "/" + pKey + "/";
|
||
result.extFilter = "jpg|png";
|
||
result.pickfile = true;
|
||
result.multi = true;
|
||
result.regexp = S("bes_photo_size");
|
||
result.directlink = true;
|
||
break;
|
||
case "INSPH":
|
||
// Bestanden zijn te vinden op ...cust/x/photos/ins
|
||
result.AttachRootPath = Server.MapPath(S("ins_image_path"));
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.extFilter = "jpg|png";
|
||
result.pickfile = true;
|
||
result.multi = true;
|
||
result.regexp = S("ins_photo_size");
|
||
result.directlink = true;
|
||
break;
|
||
case "MLDS": // Stdmelding symbolen
|
||
result.AttachRootPath = Server.MapPath(S("mlds_image_path"));
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.pickfile = true;
|
||
result.multi = true;
|
||
result.extFilter = "jpg|png";
|
||
result.regexp = S("mld_photo_size");
|
||
result.directlink = true;
|
||
break;
|
||
case "ALG":
|
||
case "BES":
|
||
case "BEZ":
|
||
case "CNT":
|
||
case "FIN":
|
||
case "INS":
|
||
case "MLD":
|
||
case "PRS":
|
||
case "RES":
|
||
case "FAQ":
|
||
// Bestanden zijn nu te vinden on ...cust/x/flexfiles/[module]/[subfolder]/[key]/[kenmerk_key]
|
||
result.fac_bijlagen = true; // registreren in fac_bijlagen
|
||
result.AttachRootPath = (pKey > 0? S("flexFilesPath") : shared.tempFolder());
|
||
result.AttachSubPath = pModule + "/";
|
||
result.AttachSubPath += (pKey > 0? subfolderKey(bepaalNiveau(pModule, pNiveau), pKey)
|
||
: subfolderNew(bepaalNiveau(pModule, pNiveau), user_key + "_" + (params.tmpfolder||getQParam("tmpfolder"))));
|
||
result.AttachSubPath += "/" + pSubpath;
|
||
|
||
result.AttachPath = result.AttachRootPath + "/" + result.AttachSubPath + "/";
|
||
// de volgende twee wil ik liever met de kenmerk-key opzoeken in de database
|
||
// maar dat is even te veel werk hier. De url is toch hmac-protected
|
||
result.extFilter = getQParam("extFilter", S("flexExtensionFilter"));
|
||
result.encrypt = getQParamInt("encrypt", 0) == 1;
|
||
result.regexp = getQParam("pregexp", ""); //P800x600 cropt/resized naar 800x600
|
||
if (pModule == "ALG" && params)
|
||
{
|
||
result.trackcode = pModule + params.alglevel + "UP";
|
||
var kenmerk_geg = bepaalKenmerkGegevens(pModule, pSubpath);
|
||
result.kenmerkoms = kenmerk_geg.kenmerk_omschrijving;
|
||
result.kenmerktype = kenmerk_geg.kenmerk_type;
|
||
result.kenmerksysteem = kenmerk_geg.kenmerk_systeem;
|
||
}
|
||
else if (pModule != "FAQ")
|
||
{
|
||
if (pModule == "MLD" && pNiveau == "O")
|
||
result.trackcode = "ORD" + "UPD";
|
||
else if (pModule == "INS" && pNiveau == "I")
|
||
result.trackcode = "INS" + "CUP";
|
||
else
|
||
result.trackcode = pModule + "UPD";
|
||
var kenmerk_geg = bepaalKenmerkGegevens(pModule, pSubpath);
|
||
result.kenmerkoms = kenmerk_geg.kenmerk_omschrijving;
|
||
result.kenmerktype = kenmerk_geg.kenmerk_type;
|
||
result.kenmerksysteem = kenmerk_geg.kenmerk_systeem;
|
||
}
|
||
break;
|
||
case "RESPH":
|
||
case "RESPHA":
|
||
case "RESPHD":
|
||
// Bestanden zijn te vinden op ...cust/x/photos
|
||
result.AttachRootPath = Server.MapPath(S("res_image_path"));
|
||
if (pModule == "RESPHA")
|
||
result.AttachRootPath += '/artikel';
|
||
if (pModule == "RESPHD")
|
||
result.AttachRootPath += '/deel';
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.extFilter = "jpg";
|
||
result.searchfile = true;
|
||
result.multi = true;
|
||
result.regexp = S("res_photo_size");
|
||
result.directlink = true;
|
||
if (typeof pKey == "string")
|
||
params.filter = pKey;
|
||
break;
|
||
case "MRK":
|
||
result.AttachRootPath = Server.MapPath(S("mrk_image_path"));
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.AttachPath += (pKey > 0? subfolderKey("M", pKey)
|
||
: subfolderNew("M", Session.SessionId));
|
||
result.AttachPath += "/1/";
|
||
result.multi = false; // vooralsnog maar eentje
|
||
result.extFilter = "jpg|png";
|
||
result.regexp = S("mrk_photo_size");
|
||
result.directlink = true;
|
||
break;
|
||
case "SML":
|
||
result.AttachRootPath = Server.MapPath(S("prs_image_path"));
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.AttachPath += subfolderKey("P", pKey);
|
||
result.AttachPath += "/SML/";
|
||
result.multi = false; // vooralsnog maar eentje
|
||
result.forcesingle = true; // verwijder eventuele anderen
|
||
result.extFilter = "jpg";
|
||
result.regexp = S("sml_photo_size"); // "r200x150", Resized naar binnen 200x150 (zonder crop, met behoud aspect ratio)
|
||
result.directlink = true;
|
||
break;
|
||
case "INSDEEL":
|
||
result.AttachRootPath = Server.MapPath(S("ins_image_path"));
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.AttachPath += subfolderKey("I", pKey);
|
||
result.AttachPath += "/INSDEEL/";
|
||
result.multi = false; // vooralsnog maar eentje
|
||
result.forcesingle = true; // verwijder eventuele anderen
|
||
result.extFilter = "jpg|png"; // alleen de extensies met een pipe gescheiden
|
||
result.regexp = S("ins_photo_size"); // "r200x150", Resized naar binnen 200x150 (zonder crop, met behoud aspect ratio)
|
||
result.directlink = true;
|
||
break;
|
||
case "MENU":
|
||
result.AttachRootPath = Server.MapPath(S("menu_image_path"));
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.multi = true;
|
||
result.extFilter = S("flexExtensionFilter"); // was "jpg|png"; maar tegenwoordig ook andere bestanden
|
||
result.regexp = S("menu_photo_size");
|
||
result.directlink = true;
|
||
break;
|
||
case "BDRADR":
|
||
result.AttachRootPath = S("bdradrfiles_path");
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.pickfile = true;
|
||
result.multi = true;
|
||
result.extFilter = S("flexExtensionFilter"); // Mag in principe alles zijn
|
||
break;
|
||
case "CUSTXSL":
|
||
result.AttachRootPath = Server.MapPath(custpath + "/xsl");
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.multi = true;
|
||
result.extFilter = "xsl";
|
||
result.keephistory = true;
|
||
settings.overrule_setting("flexAllowedExt", "xsl"); // tijdelijk xsl toestaan
|
||
settings.overrule_setting("flexFilesOrdering", 0);
|
||
break;
|
||
case "CUSTIMP":
|
||
result.AttachRootPath = Server.MapPath(custpath + "/import");
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.multi = true;
|
||
result.extFilter = "log";
|
||
settings.overrule_setting("flexAllowedExt", "log"); // tijdelijk log toestaan
|
||
settings.overrule_setting("flexFilesOrdering", 0);
|
||
break;
|
||
case "CUSTEXP":
|
||
result.AttachRootPath = Server.MapPath(custpath + "/export");
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.extFilter = "log";
|
||
settings.overrule_setting("flexAllowedExt", "log"); // tijdelijk log toestaan
|
||
settings.overrule_setting("flexFilesOrdering", 0);
|
||
break;
|
||
case "CUSTTASKS":
|
||
result.AttachRootPath = Server.MapPath(custpath + "/tasks"); // Volgens mij is hier sinds 2019.2 niets meer te vinden
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.extFilter = "log";
|
||
settings.overrule_setting("flexAllowedExt", "log"); // tijdelijk log toestaan
|
||
settings.overrule_setting("flexFilesOrdering", 0);
|
||
break;
|
||
case "CUSTTEMP":
|
||
result.AttachRootPath = shared.tempFolder();
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.extFilter = "xml|json|txt|html";
|
||
settings.overrule_setting("flexAllowedExt", "xml|json|txt|html|log"); // tijdelijk meer toestaan
|
||
settings.overrule_setting("flexFilesOrdering", 1); // nieuwste bovenaan, altijd fijn
|
||
result.searchfile = true;
|
||
result.maxfiles = 5;
|
||
break;
|
||
case "CUSTTEMPPUO":
|
||
result.AttachRootPath = shared.tempFolder() + "/putorders";
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.extFilter = "xml|json|txt|html";
|
||
settings.overrule_setting("flexAllowedExt", "xml|json|txt|html"); // tijdelijk meer toestaan
|
||
settings.overrule_setting("flexFilesOrdering", 1); // nieuwste bovenaan. Ik weet dat putorders toevallig sorteerbare namen aanmaakt
|
||
result.searchfile = true;
|
||
result.maxfiles = 5;
|
||
break;
|
||
case "AIAI":
|
||
result.AttachRootPath = Server.MapPath("../../temp/_AiAi_error");
|
||
result.AttachPath = result.AttachRootPath + "/";
|
||
result.extFilter = "html";
|
||
settings.overrule_setting("flexAllowedExt", "html"); // tijdelijk meer toestaan
|
||
settings.overrule_setting("flexFilesOrdering", 1); // nieuwste bovenaan.
|
||
result.searchfile = true;
|
||
result.maxfiles = 5;
|
||
break;
|
||
//case "SMTP": // werkt niet, IIS kan er niet lezen
|
||
// result.AttachRootPath = "C:\\Windows\\System32\\LogFiles\\SMTPSVC1";
|
||
// result.AttachPath = result.AttachRootPath + "/";
|
||
// result.extFilter = "log";
|
||
// settings.overrule_setting("flexAllowedExt", "log"); // tijdelijk meer toestaan
|
||
// settings.overrule_setting("flexFilesOrdering", 1); // nieuwste bovenaan.
|
||
// result.searchfile = true;
|
||
// result.maxfiles = 5;
|
||
// break;
|
||
default:
|
||
INTERNAL_ERROR_MODULE;
|
||
}
|
||
|
||
if (result.AttachRootPath.indexOf("..") > -1 || // paranoia mode, should never happen
|
||
result.AttachPath.indexOf("..") > -1)
|
||
{
|
||
__DoLog("Bad attach path with '..'\nAttachRootPath: {0}\nAttachPath: {1}".format(result.AttachRootPath, result.AttachPath), '#F00');
|
||
INTERNAL_ERROR_BAD_ATTACHPATH;
|
||
}
|
||
result.AttachRootPath = result.AttachRootPath.replace("..", "_");
|
||
result.AttachPath = result.AttachPath.replace("..", "_");
|
||
|
||
if (params.getFile)
|
||
{
|
||
if (fso.FileExists(result.AttachPath + params.getFile))
|
||
{
|
||
var fsoFile = fso.GetFile(result.AttachPath + params.getFile);
|
||
var filedata = oneFileInfo(fsoFile, result, pModule, pKey, pSubpath, pNiveau, params);
|
||
result.files.push(filedata);
|
||
}
|
||
}
|
||
else if (params.getFiles) // Haal alle bijlagen er bij.
|
||
{
|
||
if (fso.FolderExists(result.AttachPath))
|
||
{
|
||
__Log("Scanning {0} for files".format(result.AttachPath));
|
||
var f = fso.GetFolder(result.AttachPath);
|
||
var fc = new Enumerator(f.files);
|
||
|
||
var totalfiles = 0;
|
||
for (; !fc.atEnd(); fc.moveNext())
|
||
{
|
||
totalfiles ++;
|
||
var fsoFile = fc.item();
|
||
var fName = fsoFile.Name;
|
||
// function escapeRegExp(str)
|
||
// {
|
||
// return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
||
// }
|
||
if (params.filter && !(new RegExp(params.filter, "i").test(fName)))
|
||
continue;
|
||
|
||
var filedata = oneFileInfo(fsoFile, result, pModule, pKey, pSubpath, pNiveau, params);
|
||
result.files.push(filedata);
|
||
}
|
||
__Log("Found {0}/{1} files".format(result.files.length, totalfiles));
|
||
|
||
}
|
||
}
|
||
|
||
result.isAllowedName = function _isAllowedName(FileName)
|
||
{
|
||
if (result.extFilter)
|
||
{
|
||
var regFilter = result.extFilter;
|
||
regFilter = regFilter.replace(/( |,|;)/g,"|"); // Altijd | karakter
|
||
regFilter = ".*\\." + "(" + regFilter + ")$"; // er moet een punt voor en extensie is aan het einde
|
||
}
|
||
else
|
||
regFilter = ".*";
|
||
return (new RegExp(S("flexAllowedExt"), "ig").test(FileName) &&
|
||
new RegExp(regFilter, "ig").test(FileName));
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
function oneFileInfo(fsoFile, result, pModule, pKey, pSubpath, pNiveau, params)
|
||
{
|
||
var fName = fsoFile.Name;
|
||
var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
|
||
var filedata = { name: fName,
|
||
date: new Date(fsoFile.DateLastModified),
|
||
size: fsoFile.Size,
|
||
digest: oCrypto.hex_sha1_file(result.AttachPath + fName)
|
||
}
|
||
if (params.getFileEncoded == "base64" || params.getFileEncoded == "hex")
|
||
{
|
||
// Verleidelijk om new ActiveXObject("SLNKDWF.Crypto").base64 in te zetten
|
||
// Die kan echter alleen text-input aan, niet binary data
|
||
var oStream = Server.CreateObject("ADODB.Stream");
|
||
oStream.Open;
|
||
oStream.Type = 1; // adTypeBinary
|
||
oStream.LoadFromFile(result.AttachPath + fName);
|
||
|
||
var oXML = new ActiveXObject("Msxml2.DOMDocument.6.0");
|
||
var oNode = oXML.createElement("encodeddata");
|
||
oNode.dataType = params.getFileEncoded == "base64"?"bin.base64":"bin.hex"; // Zeer snelle oplossing
|
||
oNode.nodeTypedValue = oStream.read(oStream.Size);
|
||
filedata.data = oNode.text.replace(/\n/g, ""); // Ik wil de newlines er niet in hebben
|
||
oStream.Close();
|
||
}
|
||
|
||
// IIS 7+ geeft 404.11 op een plus-teken in een url. Historisch hebben we daar
|
||
// vele bestanden mee en die hernoemen we hier on-the-fly. Er kan nu een
|
||
// afwijking ontstaan bij 'F' kenmerken. die in de database zijn opgeslagen
|
||
// maar dat nemen we voor lief. In de praktijk is dat nooit probleem.
|
||
// Als we *niet* hernoemen hebben we grotere problemen
|
||
if (fName.toLowerCase() != safe.filename(fName).toLowerCase())
|
||
{
|
||
filedata.name = safe.filename(fName);
|
||
__DoLog("Auto renaming {0} to safer {1}".format(result.AttachPath + fName, result.AttachPath + filedata.name), "#FFFF00");
|
||
fso.MoveFile(result.AttachPath + fName, result.AttachPath + filedata.name);
|
||
}
|
||
|
||
// Resize een plaatje eventueel
|
||
if (params.resizeCode && filedata.name.match(/\.(png|jpg|jpeg)$/i))
|
||
{
|
||
var file = result.AttachPath + filedata.name;
|
||
|
||
var Format = params.resizeCode.match(/^([RrCc])(\d*)x(\d*)$/i); // R800x600
|
||
if (Format && Format.length == 4)
|
||
{
|
||
var oIMG = new ActiveXObject("SLNKDWF.ImageConvert");
|
||
try
|
||
{
|
||
oIMG.Open(result.AttachPath + filedata.name);
|
||
}
|
||
catch(e)
|
||
{
|
||
__Log("Kan plaatje {0} niet laden {1}".format(result.AttachPath + filedata.name, e.description));
|
||
// Gewoon negeren
|
||
return;
|
||
}
|
||
|
||
var RrCc = Format[1];
|
||
var h0 = h = parseInt(Format[2], 10);
|
||
var w0 = w = parseInt(Format[3], 10);
|
||
if (RrCc == "R" || RrCc == "r") // Dan niet croppen maar aspect ratio behouden
|
||
{
|
||
if (oIMG.Width * h > w * oIMG.Height)
|
||
h = oIMG.Height / oIMG.Width * w;
|
||
else
|
||
w = oIMG.Width / oIMG.Height * h;
|
||
}
|
||
|
||
if (oIMG.Height < h || oIMG.Width < w) // Zou er iets vergroot gaan worden.
|
||
{
|
||
if (RrCc == "R" || RrCc == "C") // Dan zijn we streng en eisen we minimale afmeting
|
||
{
|
||
result.message = L("lcl_shared_photo_small").format(h0, w0, oIMG.Height, oIMG.Width);
|
||
// DeleteFile(params.AttachPath + result.safefilename);
|
||
}
|
||
else // Dan maar niet, we vergroten niet.
|
||
{
|
||
h = oIMG.Height;
|
||
w = oIMG.Width;
|
||
}
|
||
}
|
||
if (!result.message && (oIMG.Height != h || oIMG.Width != w))
|
||
{
|
||
try {
|
||
__Log("Resize/Cropping from w=" + oIMG.Width + " h=" + oIMG.Height + " to w=" + w + " h=" + h);
|
||
oIMG.Width = w;
|
||
oIMG.Height = h;
|
||
|
||
// TODO: Originele type behouden of altijd naar het compactere jpg?
|
||
var tempfile = shared.tempFolder() + '/img_' + customerId + '_' + filedata.digest + "_" + params.resizeCode + ".jpg";
|
||
oIMG.SaveAs(tempfile);
|
||
filedata.resized = tempfile;
|
||
if (__Logging == 0)
|
||
filedata.tempdelete = tempfile; // Moet aanroeper opruimen
|
||
}
|
||
catch (e)
|
||
{
|
||
result.message = L("lcl_shared_thumbnail_error") + e.description;
|
||
// Gewoon opruimen
|
||
// DeleteFile(params.AttachPath + result.safefilename);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (params.tmpfolder)
|
||
{
|
||
filedata.token = params.tmpfolder;
|
||
}
|
||
else if (params.api2name)
|
||
{
|
||
var deepurl = HTTP.urlzelf() + "/api2/{0}/{1}/attachments/{2}/{3}".format(
|
||
params.api2name,
|
||
pKey,
|
||
pSubpath,
|
||
safe.filename(filedata.name) // onze filename is ondertussen dusdanig safe
|
||
// dat ik het zonder encoding aandurf
|
||
);
|
||
filedata.deepurl = deepurl;
|
||
}
|
||
else
|
||
{
|
||
if (result.directlink)
|
||
{
|
||
var root = HTTP.urlzelfnoroot() + S("res_image_path");
|
||
if (pModule == "RESPHA")
|
||
root += 'artikel/';
|
||
if (pModule == "RESPHD")
|
||
root += 'deel/';
|
||
|
||
filedata.deepurl = root + filedata.name;
|
||
}
|
||
else // Alleen streaming, bestand staat buiten webroot?
|
||
{
|
||
var deepurl = HTTP.urlzelf() + "/appl/shared/BijlagenStream.asp"
|
||
+ "?module=" + pModule
|
||
+ "&key=" + pKey
|
||
+ (pNiveau? "&niveau=" + pNiveau : "")
|
||
+ "&kenmerk_key=" + pSubpath
|
||
+ "&filename=" + Server.URLencode(filedata.name);
|
||
filedata.deepurl = protectQS.create(deepurl);
|
||
}
|
||
}
|
||
|
||
return filedata;
|
||
}
|
||
|
||
function DeleteFile(fullpath, km_params)
|
||
{
|
||
try
|
||
{
|
||
fso.DeleteFile(fullpath, true);
|
||
}
|
||
catch (e)
|
||
{
|
||
__DoLog("Verwijderen " + fullpath + " mislukt: " + e.description, "#FFFF00");
|
||
};
|
||
|
||
if (km_params)
|
||
{
|
||
var v_dir = km_params.AttachPath.substr(km_params.AttachRootPath.length+1);
|
||
if (v_dir.substr(v_dir.length-1,1) == "/")
|
||
v_dir = v_dir.substr(0, v_dir.length-1);
|
||
|
||
var sql_d = "BEGIN"
|
||
+ " flx.deleteflexbijlage"
|
||
+ " ( " + safe.quoted_sql(km_params.module)
|
||
+ " , " + km_params.kenmerkkey
|
||
+ " , " + km_params.refkey
|
||
+ " , " + safe.quoted_sql(v_dir)
|
||
+ " , " + safe.quoted_sql(km_params.file)
|
||
+ " );"
|
||
+ " END;";
|
||
Oracle.Execute(sql_d);
|
||
}
|
||
}
|
||
|
||
// Verplaats alle bestanden van <20><>n folder
|
||
// Verplaatst geen subfolders
|
||
function MoveFlexfiles(vAttachPath, vAttachPath2)
|
||
{
|
||
if (vAttachPath == vAttachPath2)
|
||
{
|
||
__Log("MoveFlexfiles Skip want twee keer " + vAttachPath);
|
||
return;
|
||
}
|
||
|
||
try
|
||
{
|
||
var fso = Server.CreateObject("Scripting.FileSystemObject")
|
||
__Log("Zoeken " + vAttachPath);
|
||
if (fso.FolderExists(vAttachPath))
|
||
{
|
||
var oFolder = fso.GetFolder(vAttachPath);
|
||
if (oFolder.files.count > 0) // Anders error
|
||
{
|
||
CreateFullPath(vAttachPath2); // het 1000-tal was er misschien nog niet.
|
||
__Log("Verplaats inhoud " + vAttachPath + "/*.* naar " + vAttachPath2 + "/");
|
||
fso.MoveFile (vAttachPath + "/*.*", vAttachPath2 + "/");
|
||
}
|
||
fso.DeleteFolder(vAttachPath);
|
||
}
|
||
}
|
||
catch(ee)
|
||
{
|
||
__DoLog("Moving files from " + vAttachPath + "<br>to " + vAttachPath2 + " failed:<br>" + ee.description, "#FFFF00");
|
||
}
|
||
fso = null;
|
||
}
|
||
|
||
// JavaScript is erg slecht in binary data, gebruik streams
|
||
// gebaseerd op Antonin Foller, http://www.motobit.com
|
||
// Binary - VT_UI1 | VT_ARRAY data To convert To a string
|
||
// getest met encoding "bin.hex" en "bin.base64"
|
||
|
||
function encodedString2File(safefullname, attachmentString, encoding)
|
||
{
|
||
__Log("Saving {0} file to {1}".format(encoding, safefullname));
|
||
var BinaryStream = XXXXDecode(attachmentString, encoding);
|
||
BinaryStream.SaveToFile(safefullname, 2); // adSaveCreateOverWrite
|
||
}
|
||
|
||
function XXXXDecode(vCode, encoding)
|
||
{
|
||
var oXML, oNode
|
||
|
||
oXML = new ActiveXObject("Msxml2.DOMDocument.6.0");
|
||
oNode = oXML.createElement("encodeddata");
|
||
oNode.dataType = encoding; // Zeer snelle oplossing
|
||
oNode.text = vCode
|
||
var Binary = oNode.nodeTypedValue;
|
||
var adTypeText = 2;
|
||
var adTypeBinary = 1;
|
||
|
||
// Create Stream object
|
||
var BinaryStream = new ActiveXObject("ADODB.Stream");
|
||
|
||
// Specify stream type - we want To save binary data.
|
||
BinaryStream.Type = adTypeBinary;
|
||
|
||
// Open the stream And write binary data To the object
|
||
BinaryStream.Open();
|
||
BinaryStream.Write(Binary);
|
||
|
||
// Change stream type To text/string
|
||
BinaryStream.Position = 0;
|
||
BinaryStream.Type = adTypeText;
|
||
|
||
// Specify charset For the output text (unicode) data.
|
||
BinaryStream.CharSet = "us-ascii";
|
||
|
||
// Open the stream And get text/string data from the object
|
||
return BinaryStream;
|
||
}
|
||
|
||
// IE doet een beetje raar als er een puntkomma in de content-disposition filenaam zit, dan negeert hij de rest
|
||
// Een bestand test.exe;.txt wordt dan zo maar 'uitgevoerd'
|
||
// Een # in de naam gaat ook raar: IE9 vervangt die zelf al door een _ maar daar vertrouwen wij niet op
|
||
// We hebben er verder geen probleem mee dat ze geupload worden (en ze bestaan ook), anders was
|
||
// toevoegen aan safe.filename natuurlijk logischer.
|
||
function safeContentName(fname)
|
||
{
|
||
return safe.filename(fname).replace(/[\;\#]+/g, "_")
|
||
}
|
||
|
||
function StreamFile(filePath, filename, mime, pcontentdp)
|
||
{
|
||
var safefullpath = filePath + "/" + safe.filename(filename);
|
||
|
||
var zipit = getQParamInt("zipfile", 0) == 1;
|
||
if (!zipit)
|
||
{
|
||
var autozipfile = getQParamInt("autozipfile", -1); // Als meer dan xx kB dan zippen
|
||
if (autozipfile > 0)
|
||
{
|
||
var fso = new ActiveXObject("Scripting.FileSystemObject");
|
||
if (fso.FileExists(safefullpath))
|
||
{
|
||
var fsoFile = fso.GetFile(safefullpath);
|
||
var sz = fsoFile.Size;
|
||
if (sz >= autozipfile * 1024)
|
||
{
|
||
zipit = true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (zipit)
|
||
{
|
||
if (mime == "text/html") // Handig voor logfiles
|
||
filename = filename.replace(/\.html\.log$/, ".html");
|
||
zipfile(safefullpath, filename);
|
||
}
|
||
pcontentdp = pcontentdp || "attachment";
|
||
try
|
||
{
|
||
var oStream = Server.CreateObject("ADODB.Stream");
|
||
oStream.Open;
|
||
oStream.Type = 1; // adTypeBinary
|
||
|
||
oStream.LoadFromFile(safefullpath);
|
||
|
||
Response.clear;
|
||
Response.contenttype = mime;
|
||
// Known problems:
|
||
// "Plus+Quote'Spatie Rare<72>&.txt" non-ASCII karakters in pFilename worden wel eens onbedoeld herkend als UTF8
|
||
Response.AddHeader("content-disposition", pcontentdp + "; filename= \"" + safeContentName(filename) + "\"");
|
||
Response.BinaryWrite(oStream.read(oStream.Size));
|
||
|
||
Response.End();
|
||
}
|
||
catch(e)
|
||
{
|
||
shared.simpel_page(Server.HTMLEncode(filename) + "<p/>" + e.description
|
||
+ "\n<xmp style='display:none'>" + Server.HTMLEncode(filePath) + "</xmp>");
|
||
}
|
||
oStream = null;
|
||
}
|
||
|
||
function zipfile(fullpath, filename)
|
||
{
|
||
var oZIP = new ActiveXObject("SLNKDWF.Zip");
|
||
var fso = new ActiveXObject("Scripting.FileSystemObject");
|
||
var temp = shared.tempFolder() + "/" + fso.GetTempName();
|
||
var iStream = new ActiveXObject("ADODB.Stream")
|
||
iStream.Type = 2; // Text
|
||
iStream.Open();
|
||
iStream.CharSet = "utf-8";
|
||
try
|
||
{
|
||
iStream.LoadFromFile(fullpath);
|
||
}
|
||
catch (e)
|
||
{
|
||
shared.simpel_page("Error opening " + Server.HTMLEncode(fullpath) + "<p/><em>"+e.description+"</em>");
|
||
}
|
||
oZIP.New(temp) //;; Helaas niet *naar* stream
|
||
oZIP.ZipFromStream(filename, iStream);
|
||
oZIP.Close();
|
||
iStream.Close()
|
||
var oStream = new ActiveXObject("ADODB.Stream");
|
||
oStream.Open;
|
||
oStream.Type = 1; // adTypeBinary
|
||
|
||
oStream.LoadFromFile(temp);
|
||
oStream.Position = 0;
|
||
fso.DeleteFile(temp);
|
||
Response.clear;
|
||
Response.contenttype = 'application/zip';
|
||
Response.AddHeader("content-disposition", "attachment; filename= \"" + filename + ".zip\"");
|
||
Response.BinaryWrite(oStream.read(oStream.Size));
|
||
Response.End;
|
||
}
|
||
%>
|