summaryrefslogtreecommitdiff
path: root/lib/internal/util/debuglog.js
diff options
context:
space:
mode:
authorJoyee Cheung <joyeec9h3@gmail.com>2019-03-06 12:54:12 +0100
committerJoyee Cheung <joyeec9h3@gmail.com>2019-03-08 13:57:38 +0100
commitb05fd4baa87886674721101eaf38b75716037891 (patch)
tree944d9db74ba3b14a9d74f3be081cc1351c338bb9 /lib/internal/util/debuglog.js
parent687f30467b67db9f39334cd19faa484c20a4ab06 (diff)
downloadandroid-node-v8-b05fd4baa87886674721101eaf38b75716037891.tar.gz
android-node-v8-b05fd4baa87886674721101eaf38b75716037891.tar.bz2
android-node-v8-b05fd4baa87886674721101eaf38b75716037891.zip
lib: explicitly initialize debuglog during bootstrap
This patch splits the implementation of util.debuglog into a separate file and explicitly initialize it during pre-execution since the initialization depends on environment variables. Also delays the call to `debuglog` in modules that are loaded during bootstrap to make sure we only access the environment variable during pre-execution. PR-URL: https://github.com/nodejs/node/pull/26468 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'lib/internal/util/debuglog.js')
-rw-r--r--lib/internal/util/debuglog.js54
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/internal/util/debuglog.js b/lib/internal/util/debuglog.js
new file mode 100644
index 0000000000..769328ac9d
--- /dev/null
+++ b/lib/internal/util/debuglog.js
@@ -0,0 +1,54 @@
+'use strict';
+
+const { format } = require('internal/util/inspect');
+
+// `debugs` is deliberately initialized to undefined so any call to
+// debuglog() before initializeDebugEnv() is called will throw.
+let debugs;
+
+let debugEnvRegex = /^$/;
+
+// `debugEnv` is initial value of process.env.NODE_DEBUG
+function initializeDebugEnv(debugEnv) {
+ debugs = {};
+ if (debugEnv) {
+ debugEnv = debugEnv.replace(/[|\\{}()[\]^$+?.]/g, '\\$&')
+ .replace(/\*/g, '.*')
+ .replace(/,/g, '$|^')
+ .toUpperCase();
+ debugEnvRegex = new RegExp(`^${debugEnv}$`, 'i');
+ }
+}
+
+// Emits warning when user sets
+// NODE_DEBUG=http or NODE_DEBUG=http2.
+function emitWarningIfNeeded(set) {
+ if ('HTTP' === set || 'HTTP2' === set) {
+ process.emitWarning('Setting the NODE_DEBUG environment variable ' +
+ 'to \'' + set.toLowerCase() + '\' can expose sensitive ' +
+ 'data (such as passwords, tokens and authentication headers) ' +
+ 'in the resulting log.');
+ }
+}
+
+function debuglog(set) {
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (debugEnvRegex.test(set)) {
+ const pid = process.pid;
+ emitWarningIfNeeded(set);
+ debugs[set] = function debug(...args) {
+ const msg = format(...args);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function debug() {};
+ }
+ }
+ return debugs[set];
+}
+
+module.exports = {
+ debuglog,
+ initializeDebugEnv
+};