r2-streamer-js
Version:
Readium 2 'streamer' for NodeJS (TypeScript)
122 lines • 4.77 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.serverSecureHTTPHeader = serverSecureHTTPHeader;
exports.serverSecure = serverSecure;
var crypto = require("crypto");
var debug_ = require("debug");
var debug = debug_("r2:streamer#http/server-secure");
var debugHttps = debug_("r2:https");
var IS_DEV = (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "dev");
function serverSecureHTTPHeader(server, url) {
var info = server.serverInfo();
if (server.isSecured() &&
info && info.trustKey && info.trustCheck && info.trustCheckIV) {
var t1 = void 0;
if (IS_DEV) {
t1 = process.hrtime();
}
var encrypteds = [];
var encryptStream = crypto.createCipheriv("aes-256-cbc", info.trustKey, info.trustCheckIV);
encryptStream.setAutoPadding(true);
var now = Date.now();
var jsonStr = "{\"url\":\"".concat(url, "\",\"time\":").concat(now, "}");
var buff1 = encryptStream.update(jsonStr, "utf8");
if (buff1) {
encrypteds.push(buff1);
}
var buff2 = encryptStream.final();
if (buff2) {
encrypteds.push(buff2);
}
var encrypted = Buffer.concat(encrypteds);
var base64 = Buffer.from(encrypted).toString("base64");
if (IS_DEV) {
var t2 = process.hrtime(t1);
var seconds = t2[0];
var nanoseconds = t2[1];
var milliseconds = nanoseconds / 1e6;
debugHttps("< A > ".concat(seconds, "s ").concat(milliseconds, "ms [ ").concat(url, " ]"));
}
return { name: "X-" + info.trustCheck, value: base64 };
}
return undefined;
}
function serverSecure(server, topRouter) {
topRouter.use(function (req, res, next) {
if (!server.isSecured()) {
next();
return;
}
if (req.method.toLowerCase() === "options") {
next();
return;
}
var doFail = true;
var serverData = server.serverInfo();
if (serverData && serverData.trustKey &&
serverData.trustCheck && serverData.trustCheckIV) {
var t1 = void 0;
if (IS_DEV) {
t1 = process.hrtime();
}
var delta = 0;
var urlCheck = server.serverUrl() + req.url;
var base64Val = req.get("X-" + serverData.trustCheck);
if (base64Val) {
var decodedVal = Buffer.from(base64Val, "base64");
var encrypted = decodedVal;
var decrypteds = [];
var decryptStream = crypto.createDecipheriv("aes-256-cbc", serverData.trustKey, serverData.trustCheckIV);
decryptStream.setAutoPadding(false);
var buff1 = decryptStream.update(encrypted);
if (buff1) {
decrypteds.push(buff1);
}
var buff2 = decryptStream.final();
if (buff2) {
decrypteds.push(buff2);
}
var decrypted = Buffer.concat(decrypteds);
var nPaddingBytes = decrypted[decrypted.length - 1];
var size = encrypted.length - nPaddingBytes;
var decryptedStr = decrypted.slice(0, size).toString("utf8");
try {
var decryptedJson = JSON.parse(decryptedStr);
var url = decryptedJson.url;
var time = decryptedJson.time;
var now = Date.now();
delta = now - time;
if (delta <= 3000) {
var i = url.lastIndexOf("#");
if (i > 0) {
url = url.substr(0, i);
}
if (url === urlCheck) {
doFail = false;
}
}
}
catch (err) {
debug(err);
debug(decryptedStr);
}
}
if (IS_DEV) {
var t2 = process.hrtime(t1);
var seconds = t2[0];
var nanoseconds = t2[1];
var milliseconds = nanoseconds / 1e6;
debugHttps("< B > (".concat(delta, "ms) ").concat(seconds, "s ").concat(milliseconds, "ms [ ").concat(urlCheck, " ]"));
}
}
if (doFail) {
debug("############## X-Debug- FAIL ========================== ");
debug(req.url);
res.status(200);
res.end();
return;
}
next();
});
}
//# sourceMappingURL=server-secure.js.map