Files
Facilitor/APPL/FAC/fac_verify_sha.inc
Rik Hassing 0c8299b640 FMHN#86276
- Regex aangepast, zodat hij . escaped.

svn path=/Website/trunk/; revision=67021
2024-11-13 12:23:46 +00:00

194 lines
7.5 KiB
PHP

<%
/*
$Revision$
$Id$
File: fac_verify_sha.inc
Description: Berekent SHA checksum over alle files
Werkt in combinatie met de geautomatiseerde mkRelease
die in de appl-folder een .sha file met checksums plaatst.
*/
function findSHAinfo()
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
var oAbout = new ActiveXObject("SLNKDWF.About");
var tmStart = oAbout.usTimer;
var shafile = Server.MapPath("../checksums.sha.inc"); // aangemaakt door mkRelease.bat
if (!fso.FileExists(shafile))
return null;
var svnfile = Server.MapPath("../svnrevision.txt.inc"); // aangemaakt door mkRelease.bat
if (!fso.FileExists(svnfile))
return null;
var fsha = fso.OpenTextFile(svnfile, 1); // readonly
var maxrev = parseInt(fsha.ReadAll());
fsha.Close();
var shainfo = { svnrev: maxrev,
shafile: shafile,
retrieved: new Date(),
ok: [],
changed: [],
unknown: [],
missing: []
};
var fsha = fso.GetFile(shafile);
shainfo.shadate = new Date(fsha.DateLastModified);
var fsha = fso.OpenTextFile(shafile, 1); // readonly
var allsha = fsha.ReadAll().split("\n");
if (allsha.length == 1)
var allsha = allsha.split(/\x0A/); // Misschien alleen UNIX LF's?
fsha.Close();
var allfiles = { };
// Some known safe files
allfiles["../appl/checksums.sha.inc"] = 1;
allfiles["../web.config"] = 1;
allfiles["../default.asp"] = 1;
for (var i in allsha)
{
var regel = allsha[i];
var spl = regel.split(" ");
if (spl.length == 2)
{
var sha_should = spl[0];
var fname = spl[1].substring(1, spl[1].length);
fname = fname.replace(/\\/g,'/');
allfiles[fname.toLowerCase()] = 1;
var file = { fname: fname.replace(/^\.\.\//,"/") };
if (!fso.FileExists(Server.MapPath("../" + fname)))
{
shainfo.missing.push (file);
}
else
{
var ff = fso.GetFile(Server.MapPath("../" + fname));
file.date = new Date(ff.DateLastModified);
file.readonly = (ff.attributes & 1) == 1;
try
{
var sha_is = oCrypto.hex_sha1_file(Server.MapPath("../" + fname));
if (sha_should != sha_is)
{
file.message = "SHA mismatch";
shainfo.changed.push (file);
}
else
{
shainfo.ok.push (file);
}
if (fname.match(/EventHandlers\.js$/i)) // Dan ook onder hMailserver folder testen
{
var fname2 = "c:\\Program Files (x86)\\hMailServer\\Events\\EventHandlers.js";
if (fso.FileExists(fname2)) // anders niet moeilijk doen
{
var file = { fname: fname2 };
var ff = fso.GetFile(fname2);
file.date = new Date(ff.DateLastModified);
file.readonly = (ff.attributes & 1) == 1;
var sha_is2 = oCrypto.hex_sha1_file(fname2);
if (sha_should != sha_is2)
{
file.message = "SHA mismatch";
shainfo.changed.push (file);
}
}
}
if (fname.match(/SLNKDWFx64\.dll$/i)) // Dan ook onder C:\Windows\System32 folder testen
{
var fname2 = oAbout.DLLPath;
if (fso.FileExists(fname2)) // anders niet moeilijk doen
{
var file = { fname: fname2 };
var ff = fso.GetFile(fname2);
file.date = new Date(ff.DateLastModified);
file.readonly = (ff.attributes & 1) == 1;
var sha_is2 = oCrypto.hex_sha1_file(fname2);
if (sha_should != sha_is2)
{
file.message = "SHA mismatch";
shainfo.changed.push (file);
}
}
}
if (fname.match(/SLNKXLSX\.dll$/i)) // Dan ook onder C:\Windows\System32 folder testen
{
var oAboutX = new ActiveXObject("SLNKXLSX.About");
var fname2 = oAboutX.DLLPath;
if (fso.FileExists(fname2)) // anders niet moeilijk doen
{
var file = { fname: fname2 };
var ff = fso.GetFile(fname2);
file.date = new Date(ff.DateLastModified);
file.readonly = (ff.attributes & 1) == 1;
var sha_is2 = oCrypto.hex_sha1_file(fname2);
if (sha_should != sha_is2)
{
file.message = "SHA mismatch";
shainfo.changed.push (file);
}
}
}
}
catch(e)
{
file.message = "Error reading it: " + e.description;
shainfo.changed.push (file);
}
}
}
}
// Overbodige files
var rootdir = Server.MapPath("../../") + "/";
function scanFolder(scanDir, lvl)
{
if (scanDir.match(/CUST\/$/i))
return;
if (scanDir.match(/TEMP\/$/i))
return;
if (scanDir.match(/CACHE\/$/i))
return;
if (scanDir.match(/.svn\/$/i))
return;
startFolder = fso.GetFolder(rootdir + scanDir)
var fc1 = new Enumerator(startFolder.Files);
for (; !fc1.atEnd(); fc1.moveNext())
{
var fil = fc1.item();
var filename = fil.Name;
if (!(("../" + scanDir + filename).toLowerCase() in allfiles))
{
// We zouden kunnen zoeken of zijn sha bij de 'missing' voorkomt
// wat een rename aangeeft.
//var sha1 = oCrypto.hex_sha1_file(rootdir + scanDir + filename);
shainfo.unknown.push ({ fname: "/" + scanDir + filename,
date: new Date(fil.DateLastModified),
readonly: (fil.attributes & 1) == 1
});
}
}
// En nu recursief alle subfolders.
var fc1 = new Enumerator(startFolder.SubFolders);
for (; !fc1.atEnd(); fc1.moveNext())
{
fil = fc1.item();
scanFolder(scanDir + fil.Name + "/", lvl+1);
}
}
scanFolder("", 0);
shainfo.duration = Math.floor((oAbout.usTimer - tmStart) / 1000);
return shainfo;
}
%>