UNPKG

@szegedsw/lib-node

Version:

A little framework published by Szeged Software Zrt. in order to enhance api endpoint security and create reuseable code. Email module, Logging system, and much more. Further improvements are expected.

472 lines 16.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DotenvConfig = exports.dotenvSettings = void 0; const dotenv_1 = __importDefault(require("dotenv")); const fs_1 = __importDefault(require("fs")); const lodash_1 = __importDefault(require("lodash")); const crypt_1 = require("../encryption/crypt"); const logger_1 = require("../logger/logger"); exports.dotenvSettings = { initCryptModule: false, cryptoKeys: ["cryptoSecretAes", "cryptoSecretHmac", "cryptoInitVector"], toSnakeCase: true, path: "", dist: true, }; /** * @class extend this class, declare properties then call super() and this.init(this) from constructor * The super() call will load the .env file into process.env * Then try to get the properties from the .env file and load it to the class */ class DotenvConfig { // if secure = true, you might need to app.use('trust proxy',1); line to get it work behind a proxy... constructor(settings = exports.dotenvSettings) { Object.defineProperty(this, "settings", { enumerable: true, configurable: true, writable: true, value: settings }); Object.defineProperty(this, "nodeEnv", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "nodeSsl", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "nodeSslKey", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "nodeSslCert", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "nodeSslCa", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "nodePort", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "nodeApiName", { enumerable: true, configurable: true, writable: true, value: "" }); // public trustFirstProxy: boolean = false; Object.defineProperty(this, "cookieName", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "cookieSecure", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "cookieSecret", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "cookieHttponly", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "sessionTimeout", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databaseType", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databaseUser", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databasePassword", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databaseAuthSource", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databaseHost", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databasePort", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databaseSid", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databaseName", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databaseOwner", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "databaseSsl", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "databasePoolSize", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databasePoolMin", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databasePoolMax", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databasePoolIncrement", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databaseIdleTimeout", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databaseConnectionTimeout", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databaseRownum", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "databaseDebug", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "databaseSecret", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "emailUser", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "emailPassword", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "emailHost", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "emailPort", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "emailSecure", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "emailPoolSize", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "emailLogger", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "emailSubject", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "emailAdmins", { enumerable: true, configurable: true, writable: true, value: [] }); Object.defineProperty(this, "emailLogs", { enumerable: true, configurable: true, writable: true, value: [] }); Object.defineProperty(this, "emailEvents", { enumerable: true, configurable: true, writable: true, value: [] }); Object.defineProperty(this, "emailRejectUnauthorized", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "emailReplyTo", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "auditLogMethods", { enumerable: true, configurable: true, writable: true, value: [] }); Object.defineProperty(this, "maskPassKeys", { enumerable: true, configurable: true, writable: true, value: [] }); Object.defineProperty(this, "clientVersion", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "upgradeNoteInterval", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "cryptoSecretAes", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "cryptoSecretHmac", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "cryptoInitVector", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "downloadDirectory", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "uploadDirectory", { enumerable: true, configurable: true, writable: true, value: "" }); Object.defineProperty(this, "logDirectory", { enumerable: true, configurable: true, writable: true, value: "" }); const path = this.settings.path || this.path(this.settings.dist); logger_1.Logger.info(`Env path: ${path}`); const result = dotenv_1.default.config({ path }); if (result.error) { logger_1.Logger.error(result.error.message, "DOTENV_LOAD", true); } } get emailAttachments() { return (process.env.EMAIL_ATTACHMENTS || "") .split(",") .map((attachment) => ({ path: attachment })) .filter((attachment) => fs_1.default.existsSync(attachment.path)); } init(object) { logger_1.Logger.info("Loading .env configuration...", false); let error = false; Object.keys(object).forEach((key) => { var _a, _b; if (key === "settings") { return; } if (!this.settings.initCryptModule && this.settings.cryptoKeys.includes(key)) { return; } const envKey = this.settings.toSnakeCase ? lodash_1.default.snakeCase(key).toUpperCase() : key; if (typeof this[key] === "boolean") { if (process.env[envKey] !== undefined) { this[key] = ((_a = process.env[envKey]) === null || _a === void 0 ? void 0 : _a.toUpperCase()) === "TRUE"; } else { logger_1.Logger.warning(`Bad .env configuration. Missing key => ${envKey} : (boolean)`); error = true; } } else if (typeof this[key] === "number") { if (process.env[envKey] !== undefined) { this[key] = Number(process.env[envKey] || 0); } else { logger_1.Logger.warning(`Bad .env configuration. Missing key => ${envKey} : (number)`); error = true; } } else if (typeof this[key] === "object") { if (process.env[envKey] !== undefined && Array.isArray(this[key])) { this[key] = (_b = process.env[envKey]) === null || _b === void 0 ? void 0 : _b.split(","); } else { logger_1.Logger.warning(`Bad .env configuration. Missing key => ${envKey} : (array ,splitted by comma e.g.: a,b,c)`); error = true; } } else if (typeof this[key] === "string") { if (process.env[envKey] !== undefined) { this[key] = process.env[envKey]; } else { logger_1.Logger.warning(`Bad .env configuration. Missing key => ${envKey} (string)`); error = true; } } else if (typeof this[key] === "function") { logger_1.Logger.warning(`Function found in .env configuration: ${envKey}`); } else { logger_1.Logger.error(`Assigned type is not supported yet! key => ${envKey}`); } }); if (error) { logger_1.Logger.error(".env configuration has been loaded with errors! Please see above for more info!"); if (this.settings.initCryptModule) { logger_1.Logger.error("Crypt module was not initilized!"); } } else { logger_1.Logger.success(".env configuration has been loaded...", false); this.checkSettings(); if (this.settings.initCryptModule) { crypt_1.Crypt.init([this.cryptoSecretAes, this.cryptoSecretHmac], this.cryptoInitVector); } } } path(dist = true) { switch (process.env.NODE_ENV.trim()) { case "production": return `${dist ? "dist/" : ""}.env`; case "development": return "src/.env"; default: return undefined; } } checkSettings() { if (this.nodeEnv === "production") { if (!this.cookieHttponly) { logger_1.Logger.warning(`Cookies are probably misconfigured! Please keep in mind using of session cookies with httpOnly attribute set to false makes the 'website' vulnerable against XSS attacks! If this is an intended usage please ignore this warning!`, true); } if (this.sessionTimeout > 0) { logger_1.Logger.warning(`Cookies are probably misconfigured! Please keep in mind using of session cookies with maxage attribute set to non-zero value makes the server vulnerable against session hijacking! If this is an intended usage please ignore this warning!`, true); } if (this.secure && !this.trustFirstProxy) { logger_1.Logger.info(`HINT: Using secure cookies means they can be transferred through encrypted connection. If your nodejs server is behind a proxy and sessions does not works, you should try to set TRUST_FIRST_PROXY=true`, true); } if (!this.cookieSecure) { logger_1.Logger.warning(`Cookies are probably misconfigured! Please keep in mind using of session cookies with secure attribute set to false is insecure! If this is an intended usage please ignore this warning!`, true); } } } } exports.DotenvConfig = DotenvConfig; //# sourceMappingURL=dotenv.config.js.map