var _ = require('./utility'); var traverse = require('./utility/traverse'); function scrub(data, scrubFields, scrubPaths) { scrubFields = scrubFields || []; if (scrubPaths) { for (var i = 0; i < scrubPaths.length; ++i) { scrubPath(data, scrubPaths[i]); } } var paramRes = _getScrubFieldRegexs(scrubFields); var queryRes = _getScrubQueryParamRegexs(scrubFields); function redactQueryParam(dummy0, paramPart) { return paramPart + _.redact(); } function paramScrubber(v) { var i; if (_.isType(v, 'string')) { for (i = 0; i < queryRes.length; ++i) { v = v.replace(queryRes[i], redactQueryParam); } } return v; } function valScrubber(k, v) { var i; for (i = 0; i < paramRes.length; ++i) { if (paramRes[i].test(k)) { v = _.redact(); break; } } return v; } function scrubber(k, v, seen) { var tmpV = valScrubber(k, v); if (tmpV === v) { if (_.isType(v, 'object') || _.isType(v, 'array')) { return traverse(v, scrubber, seen); } return paramScrubber(tmpV); } else { return tmpV; } } return traverse(data, scrubber); } function scrubPath(obj, path) { var keys = path.split('.'); var last = keys.length - 1; try { for (var i = 0; i <= last; ++i) { if (i < last) { obj = obj[keys[i]]; } else { obj[keys[i]] = _.redact(); } } } catch (e) { // Missing key is OK; } } function _getScrubFieldRegexs(scrubFields) { var ret = []; var pat; for (var i = 0; i < scrubFields.length; ++i) { pat = '^\\[?(%5[bB])?' + scrubFields[i] + '\\[?(%5[bB])?\\]?(%5[dD])?$'; ret.push(new RegExp(pat, 'i')); } return ret; } function _getScrubQueryParamRegexs(scrubFields) { var ret = []; var pat; for (var i = 0; i < scrubFields.length; ++i) { pat = '\\[?(%5[bB])?' + scrubFields[i] + '\\[?(%5[bB])?\\]?(%5[dD])?'; ret.push(new RegExp('(' + pat + '=)([^&\\n]+)', 'igm')); } return ret; } module.exports = scrub;