cdktg
Version:
Agile Threat Modeling as Code
219 lines (190 loc) • 7.83 kB
JavaScript
const fs = require("./fileSystem").require();
const pth = require("path");
const Constants = require("./constants");
const isWin = typeof process === "object" && "win32" === process.platform;
module.exports = (function () {
const crcTable = [];
const PATH_SEPARATOR = pth.sep;
function genCRCTable() {
for (let n = 0; n < 256; n++) {
let c = n;
for (let k = 8; --k >= 0; )
if ((c & 1) !== 0) {
c = 0xedb88320 ^ (c >>> 1);
} else {
c = c >>> 1;
}
crcTable[n] = c >>> 0;
}
}
function mkdirSync(/*String*/ path) {
var resolvedPath = path.split(PATH_SEPARATOR)[0];
path.split(PATH_SEPARATOR).forEach(function (name) {
if (!name || name.substr(-1, 1) === ":") return;
resolvedPath += PATH_SEPARATOR + name;
var stat;
try {
stat = fs.statSync(resolvedPath);
} catch (e) {
fs.mkdirSync(resolvedPath);
}
if (stat && stat.isFile()) throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath);
});
}
function findSync(/*String*/ dir, /*RegExp*/ pattern, /*Boolean*/ recoursive) {
if (typeof pattern === "boolean") {
recoursive = pattern;
pattern = undefined;
}
var files = [];
fs.readdirSync(dir).forEach(function (file) {
var path = pth.join(dir, file);
if (fs.statSync(path).isDirectory() && recoursive) files = files.concat(findSync(path, pattern, recoursive));
if (!pattern || pattern.test(path)) {
files.push(pth.normalize(path) + (fs.statSync(path).isDirectory() ? PATH_SEPARATOR : ""));
}
});
return files;
}
function readBigUInt64LE(/*Buffer*/ buffer, /*int*/ index) {
var slice = Buffer.from(buffer.slice(index, index + 8));
slice.swap64();
return parseInt(`0x${slice.toString("hex")}`);
}
return {
makeDir: function (/*String*/ path) {
mkdirSync(path);
},
crc32: function (buf) {
if (typeof buf === "string") {
buf = Buffer.from(buf, "utf8");
}
// Generate crcTable
if (!crcTable.length) genCRCTable();
let off = 0;
let len = buf.length;
let crc = ~0;
while (--len >= 0) crc = crcTable[(crc ^ buf[off++]) & 0xff] ^ (crc >>> 8);
// xor and cast as uint32 number
return ~crc >>> 0;
},
methodToString: function (/*Number*/ method) {
switch (method) {
case Constants.STORED:
return "STORED (" + method + ")";
case Constants.DEFLATED:
return "DEFLATED (" + method + ")";
default:
return "UNSUPPORTED (" + method + ")";
}
},
writeFileTo: function (/*String*/ path, /*Buffer*/ content, /*Boolean*/ overwrite, /*Number*/ attr) {
if (fs.existsSync(path)) {
if (!overwrite) return false; // cannot overwrite
var stat = fs.statSync(path);
if (stat.isDirectory()) {
return false;
}
}
var folder = pth.dirname(path);
if (!fs.existsSync(folder)) {
mkdirSync(folder);
}
var fd;
try {
fd = fs.openSync(path, "w", 438); // 0666
} catch (e) {
fs.chmodSync(path, 438);
fd = fs.openSync(path, "w", 438);
}
if (fd) {
try {
fs.writeSync(fd, content, 0, content.length, 0);
} finally {
fs.closeSync(fd);
}
}
fs.chmodSync(path, attr || 438);
return true;
},
canonical: function (p) {
if (!p) return "";
// trick normalize think path is absolute
var safeSuffix = pth.posix.normalize("/" + p.split("\\").join("/"));
return pth.join(".", safeSuffix);
},
sanitize: function (prefix, name) {
prefix = pth.resolve(pth.normalize(prefix));
var parts = name.split("/");
for (var i = 0, l = parts.length; i < l; i++) {
var path = pth.normalize(pth.join(prefix, parts.slice(i, l).join(pth.sep)));
if (path.indexOf(prefix) === 0) {
return path;
}
}
return pth.normalize(pth.join(prefix, pth.basename(name)));
},
writeFileToAsync: function (/*String*/ path, /*Buffer*/ content, /*Boolean*/ overwrite, /*Number*/ attr, /*Function*/ callback) {
if (typeof attr === "function") {
callback = attr;
attr = undefined;
}
fs.exists(path, function (exist) {
if (exist && !overwrite) return callback(false);
fs.stat(path, function (err, stat) {
if (exist && stat.isDirectory()) {
return callback(false);
}
var folder = pth.dirname(path);
fs.exists(folder, function (exists) {
if (!exists) mkdirSync(folder);
fs.open(path, "w", 438, function (err, fd) {
if (err) {
fs.chmod(path, 438, function () {
fs.open(path, "w", 438, function (err, fd) {
fs.write(fd, content, 0, content.length, 0, function () {
fs.close(fd, function () {
fs.chmod(path, attr || 438, function () {
callback(true);
});
});
});
});
});
} else if (fd) {
fs.write(fd, content, 0, content.length, 0, function () {
fs.close(fd, function () {
fs.chmod(path, attr || 438, function () {
callback(true);
});
});
});
} else {
fs.chmod(path, attr || 438, function () {
callback(true);
});
}
});
});
});
});
},
findFiles: function (/*String*/ path) {
return findSync(path, true);
},
getAttributes: function () {},
setAttributes: function () {},
toBuffer: function (input) {
if (Buffer.isBuffer(input)) {
return input;
} else if (input instanceof Uint8Array) {
return Buffer.from(input);
} else {
// expect string all other values are invalid and return empty buffer
return typeof input === "string" ? Buffer.from(input, "utf8") : Buffer.alloc(0);
}
},
isWin, // Do we have windows system
readBigUInt64LE
};
})();