@riocrypto/common-server 1.0.1715 → 1.0.1717

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,11 +6,39 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const axios_1 = __importDefault(require("axios"));
7
7
  const logger_1 = __importDefault(require("../services/logger"));
8
8
  const axiosWithLogging = axios_1.default.create();
9
+ const sensitiveHeaders = [
10
+ "Authorization",
11
+ "x-api-key",
12
+ "Api-Key",
13
+ "x-cluster-api-key",
14
+ "X-API-KEY",
15
+ "CB-ACCESS-KEY",
16
+ "CB-ACCESS-SIGN",
17
+ "CB-ACCESS-TIMESTAMP",
18
+ "CB-ACCESS-PASSPHRASE",
19
+ ];
20
+ function maskHeaderValue(value) {
21
+ return value.length > 4
22
+ ? "*".repeat(value.length - 4) + value.slice(-4)
23
+ : value;
24
+ }
25
+ // Masking function to selectively mask headers
26
+ function maskHeaders(headers) {
27
+ const maskedHeaders = Object.assign({}, headers);
28
+ Object.keys(maskedHeaders).forEach((header) => {
29
+ if (sensitiveHeaders.includes(header)) {
30
+ maskedHeaders[header] = maskHeaderValue(maskedHeaders[header]);
31
+ }
32
+ });
33
+ return maskedHeaders;
34
+ }
9
35
  // Request Interceptor
10
36
  axiosWithLogging.interceptors.request.use((config) => {
11
37
  var _a;
12
- // Combine and log the full request configuration
13
- const logMessage = `Request: method=${config.method}, url=${config.url}, headers=${JSON.stringify(config.headers)}, data=${JSON.stringify(config.data)}`;
38
+ // Mask sensitive headers in the configuration
39
+ const maskedHeaders = maskHeaders(config.headers);
40
+ // Combine and log the full request configuration with masked headers
41
+ const logMessage = `Request: method=${config.method}, url=${config.url}, headers=${JSON.stringify(maskedHeaders)}, data=${JSON.stringify(config.data)}`;
14
42
  ((_a = logger_1.default.getLogger()) === null || _a === void 0 ? void 0 : _a.info(logMessage)) || console.log(logMessage);
15
43
  return config;
16
44
  }, (error) => {
@@ -2,6 +2,7 @@ import { Logger } from "winston";
2
2
  declare class LoggerService {
3
3
  private logger;
4
4
  constructor();
5
+ private maskValue;
5
6
  private maskSensitiveData;
6
7
  getLogger(): Logger;
7
8
  initLogger(): Promise<void>;
@@ -15,8 +15,8 @@ class LoggerService {
15
15
  constructor() {
16
16
  this.maskSensitiveData = (0, winston_1.format)((info) => {
17
17
  // Mask sensitive headers
18
- if (info.metadata && info.metadata.req && info.metadata.req.headers) {
19
- const headers = info.metadata.req.headers;
18
+ if (info.meta && info.meta.req && info.meta.req.headers) {
19
+ const headers = info.meta.req.headers;
20
20
  const headerKeysToMask = [
21
21
  "x-api-key",
22
22
  "x-admin-api-key",
@@ -24,16 +24,21 @@ class LoggerService {
24
24
  ];
25
25
  headerKeysToMask.forEach((key) => {
26
26
  if (headers[key]) {
27
- headers[key] = "***MASKED***"; // Replace with your masking preference
27
+ headers[key] = this.maskValue(headers[key]); // Use maskValue function
28
28
  }
29
29
  });
30
+ // Mask cookies specifically
30
31
  if (headers.cookie) {
31
32
  headers.cookie = headers.cookie
32
33
  .split("; ")
33
34
  .map((cookie) => {
34
35
  const [key, value] = cookie.split("=");
35
- if (key === "accessToken" || key === "adminAccessCookie") {
36
- return `${key}=***MASKED***`; // Mask the sensitive cookie
36
+ if (key === "accessToken" ||
37
+ key === "adminAccessToken" ||
38
+ key === "refreshToken" ||
39
+ key === "adminRefreshToken" ||
40
+ key === "phoneVerifiedJWT") {
41
+ return `${key}=${this.maskValue(value)}`; // Mask the sensitive cookie
37
42
  }
38
43
  return cookie; // Return unmodified if not sensitive
39
44
  })
@@ -41,7 +46,7 @@ class LoggerService {
41
46
  }
42
47
  }
43
48
  // Mask sensitive request body fields
44
- if (info.metadata && info.metadata.req && info.metadata.req.body) {
49
+ if (info.meta && info.meta.req && info.meta.req.body) {
45
50
  const requestBodyFieldsToMask = [
46
51
  "password",
47
52
  "newPassword",
@@ -50,17 +55,17 @@ class LoggerService {
50
55
  "authenticatorCode",
51
56
  ];
52
57
  requestBodyFieldsToMask.forEach((field) => {
53
- if (info.metadata.req.body.hasOwnProperty(field)) {
54
- info.metadata.req.body[field] = "***MASKED***"; // Replace with your masking preference
58
+ if (info.meta.req.body.hasOwnProperty(field)) {
59
+ info.meta.req.body[field] = this.maskValue(info.meta.req.body[field]); // Use maskValue function
55
60
  }
56
61
  });
57
62
  }
58
63
  // Mask sensitive response body fields
59
- if (info.metadata && info.metadata.res && info.metadata.res.body) {
64
+ if (info.meta && info.meta.res && info.meta.res.body) {
60
65
  const responseBodyFieldsToMask = ["secret", "value"];
61
66
  responseBodyFieldsToMask.forEach((field) => {
62
- if (info.metadata.res.body.hasOwnProperty(field)) {
63
- info.metadata.res.body[field] = "***MASKED***"; // Replace with your masking preference
67
+ if (info.meta.res.body.hasOwnProperty(field)) {
68
+ info.meta.res.body[field] = this.maskValue(info.meta.res.body[field]); // Use maskValue function
64
69
  }
65
70
  });
66
71
  }
@@ -68,6 +73,11 @@ class LoggerService {
68
73
  });
69
74
  this.logger = null;
70
75
  }
76
+ maskValue(value) {
77
+ return value.length > 4
78
+ ? "*".repeat(value.length - 4) + value.slice(-4)
79
+ : value;
80
+ }
71
81
  getLogger() {
72
82
  if (!this.logger) {
73
83
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riocrypto/common-server",
3
- "version": "1.0.1715",
3
+ "version": "1.0.1717",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",