All files / src/logging request-obfuscator.js

97.44% Statements 38/39
95% Branches 19/20
100% Functions 9/9
97.22% Lines 35/36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118                        114x             6x   6x 3x     3x               82x 77x     5x 1x   1x     4x       4x   4x 3x   3x   1x     3x               49x   49x 41x     8x   8x               82x 39x     43x   43x 5x   38x     43x               82x 13x     69x               82x 82x 82x    
 
/**
 * Module dependencies.
 */
 
import methods from '../methods';
import { defaults, get, has, isArray, isEmpty, isString, map, mapKeys } from 'lodash';
 
/**
 * Map all methods to lowercase.
 */
 
const lowercaseMethods = mapKeys(methods, (value, key) => key.toLowerCase());
 
/**
 * Obfuscate the response body.
 */
 
function obfuscateResponseBody(body, method) {
  const fn = get(lowercaseMethods[method], 'obfuscate.response');
 
  if (!fn || isEmpty(body.result)) {
    return body;
  }
 
  return defaults({ result: fn(body.result) }, body);
}
 
/**
 * Obfuscate the response.
 */
 
function obfuscateResponse(request, instance) {
  if (!get(request, 'response.body')) {
    return;
  }
 
  if (get(request, `response.headers['content-type']`) === 'application/octet-stream') {
    request.response.body = '******';
 
    return;
  }
 
  Iif (!instance.body) {
    return;
  }
 
  const requestBody = JSON.parse(instance.body);
 
  if (isArray(request.response.body)) {
    const methodsById = mapKeys(requestBody, method => method.id);
 
    request.response.body = map(request.response.body, request => obfuscateResponseBody(request, methodsById[request.id].method));
 
    return;
  }
 
  request.response.body = obfuscateResponseBody(request.response.body, requestBody.method);
}
 
/**
 * Obfuscate the request body.
 */
 
function obfuscateRequestBody(body) {
  const method = get(lowercaseMethods[body.method], 'obfuscate.request');
 
  if (!method) {
    return body;
  }
 
  body.params = method(body.params);
 
  return body;
}
 
/**
 * Obfuscate the request.
 */
 
function obfuscateRequest(request) {
  if (!isString(request.body)) {
    return;
  }
 
  request.body = JSON.parse(request.body);
 
  if (isArray(request.body)) {
    request.body = map(request.body, obfuscateRequestBody);
  } else {
    request.body = obfuscateRequestBody(request.body);
  }
 
  request.body = JSON.stringify(request.body);
}
 
/**
 * Obfuscate headers.
 */
 
function obfuscateHeaders(request) {
  if (!has(request, 'headers.authorization')) {
    return;
  }
 
  request.headers.authorization = request.headers.authorization.replace(/(Basic )(.*)/, `$1******`);
}
 
/**
 * Export `RequestObfuscator`.
 */
 
export function obfuscate(request, instance) {
  obfuscateHeaders(request);
  obfuscateRequest(request);
  obfuscateResponse(request, instance);
}