@channel.io/app-sdk-server 0.24.2 → 0.26.0
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.
- package/dist/__tests__/sanitize-for-logging.test.js +66 -0
- package/dist/__tests__/sanitize-for-logging.test.js.map +1 -1
- package/dist/decorators/extension-names.d.ts +1 -1
- package/dist/decorators/extension-names.d.ts.map +1 -1
- package/dist/decorators/extension-names.js +1 -0
- package/dist/decorators/extension-names.js.map +1 -1
- package/dist/utils/sanitize-for-logging.d.ts.map +1 -1
- package/dist/utils/sanitize-for-logging.js +23 -0
- package/dist/utils/sanitize-for-logging.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,6 +1,72 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { sanitizeForLogging } from "../utils/sanitize-for-logging.js";
|
|
3
3
|
describe("sanitizeForLogging", () => {
|
|
4
|
+
it("redacts OAuth resume nonces and redirect URLs that embed them", () => {
|
|
5
|
+
expect(sanitizeForLogging({
|
|
6
|
+
resumeUrl: "https://desk.example/return?oauthFlowNonce=secret",
|
|
7
|
+
resumeNonce: "secret",
|
|
8
|
+
oauth_flow_nonce: "secret",
|
|
9
|
+
result: {
|
|
10
|
+
type: "redirect",
|
|
11
|
+
url: "https://setup.example/?returnTo=https%3A%2F%2Fdesk.example%3FoauthFlowNonce%3Dsecret",
|
|
12
|
+
},
|
|
13
|
+
flowId: "flow-1",
|
|
14
|
+
})).toEqual({
|
|
15
|
+
resumeUrl: "[REDACTED]",
|
|
16
|
+
resumeNonce: "[REDACTED]",
|
|
17
|
+
oauth_flow_nonce: "[REDACTED]",
|
|
18
|
+
result: { type: "redirect", url: "[REDACTED]" },
|
|
19
|
+
flowId: "flow-1",
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
it.each(["oauth_flow_nonce", "oauth-flow-nonce", "OAuth_Flow_Nonce"])("redacts %s inside nested and encoded redirect URLs", (nonceKey) => {
|
|
23
|
+
const resumeUrl = `https://desk.example/return?${nonceKey}=secret`;
|
|
24
|
+
expect(sanitizeForLogging({
|
|
25
|
+
result: {
|
|
26
|
+
url: `https://setup.example/?returnTo=${encodeURIComponent(resumeUrl)}`,
|
|
27
|
+
returnTo: resumeUrl,
|
|
28
|
+
},
|
|
29
|
+
})).toEqual({
|
|
30
|
+
result: { url: "[REDACTED]", returnTo: "[REDACTED]" },
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
it("redacts space-separated nonce names in strings", () => {
|
|
34
|
+
expect(sanitizeForLogging({ url: "https://desk.example/?oauth flow nonce=secret" })).toEqual({
|
|
35
|
+
url: "[REDACTED]",
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it.each([
|
|
39
|
+
"oauth%46lowNonce",
|
|
40
|
+
"oauth%5Fflow%5Fnonce",
|
|
41
|
+
"oauth%2Dflow%2Dnonce",
|
|
42
|
+
"oauth%20flow%20nonce",
|
|
43
|
+
"oauth+flow+nonce",
|
|
44
|
+
"oauth%2Bflow%2Bnonce",
|
|
45
|
+
])("redacts encoded nonce name %s in direct and nested URLs", (nonceKey) => {
|
|
46
|
+
const resumeUrl = `https://desk.example/?${nonceKey}=secret`;
|
|
47
|
+
const redirectUrl = `https://setup.example/?returnTo=${encodeURIComponent(resumeUrl)}`;
|
|
48
|
+
expect(sanitizeForLogging({
|
|
49
|
+
url: resumeUrl,
|
|
50
|
+
nested: { returnTo: `https://outer.example/?next=${encodeURIComponent(redirectUrl)}` },
|
|
51
|
+
})).toEqual({ url: "[REDACTED]", nested: { returnTo: "[REDACTED]" } });
|
|
52
|
+
});
|
|
53
|
+
it("redacts encoded nonces even when another URL component has malformed escapes", () => {
|
|
54
|
+
expect(sanitizeForLogging({ url: "https://desk.example/?broken=%FF%&oauth%46lowNonce=secret" })).toEqual({ url: "[REDACTED]" });
|
|
55
|
+
});
|
|
56
|
+
it("redacts deeply encoded values without unbounded decoding", () => {
|
|
57
|
+
let url = "https://desk.example/?oauth%46lowNonce=secret";
|
|
58
|
+
for (let i = 0; i < 8; i++) {
|
|
59
|
+
url = encodeURIComponent(url);
|
|
60
|
+
}
|
|
61
|
+
expect(sanitizeForLogging({ url })).toEqual({ url: "[REDACTED]" });
|
|
62
|
+
});
|
|
63
|
+
it("preserves unrelated text and URLs, including malformed percent escapes", () => {
|
|
64
|
+
const value = {
|
|
65
|
+
url: "https://desk.example/?returnTo=https%3A%2F%2Fsetup.example%2Fdone&broken=%FF%",
|
|
66
|
+
message: "100% complete",
|
|
67
|
+
};
|
|
68
|
+
expect(sanitizeForLogging(value)).toEqual(value);
|
|
69
|
+
});
|
|
4
70
|
it("should redact snake_case and kebab-case sensitive keys", () => {
|
|
5
71
|
expect(sanitizeForLogging({
|
|
6
72
|
access_token: "access-123",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize-for-logging.test.js","sourceRoot":"","sources":["../../src/__tests__/sanitize-for-logging.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CACJ,kBAAkB,CAAC;YACjB,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,aAAa;YAC9B,gBAAgB,EAAE,cAAc;YAChC,OAAO,EAAE,aAAa;YACtB,aAAa,EAAE,mBAAmB;YAClC,UAAU,EAAE,gBAAgB;SAC7B,CAAC,CACH,CAAC,OAAO,CAAC;YACR,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,YAAY;YAC7B,gBAAgB,EAAE,YAAY;YAC9B,OAAO,EAAE,YAAY;YACrB,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,YAAY;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CACJ,kBAAkB,CAAC;YACjB,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,IAAI;SACb,CAAC,CACH,CAAC,OAAO,CAAC;YACR,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"sanitize-for-logging.test.js","sourceRoot":"","sources":["../../src/__tests__/sanitize-for-logging.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const SDK_EXTENSION_NAMES: readonly ["oauth", "apikey", "config", "calendar", "messaging", "messenger", "command", "widget", "customtab", "hook", "polling", "store", "datasource", "commerce", "order", "wms", "userAuthorization", "alfTask", "notebook"];
|
|
1
|
+
export declare const SDK_EXTENSION_NAMES: readonly ["oauth", "apikey", "config", "calendar", "messaging", "messenger", "command", "widget", "customtab", "hook", "polling", "store", "suggestion", "datasource", "commerce", "order", "wms", "userAuthorization", "alfTask", "notebook"];
|
|
2
2
|
export type SdkExtensionName = (typeof SDK_EXTENSION_NAMES)[number];
|
|
3
3
|
//# sourceMappingURL=extension-names.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-names.d.ts","sourceRoot":"","sources":["../../src/decorators/extension-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"extension-names.d.ts","sourceRoot":"","sources":["../../src/decorators/extension-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,gPAqBtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-names.js","sourceRoot":"","sources":["../../src/decorators/extension-names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,WAAW;IACX,WAAW;IACX,SAAS;IACT,QAAQ;IACR,WAAW;IACX,MAAM;IACN,SAAS;IACT,OAAO;IACP,YAAY;IACZ,UAAU;IACV,OAAO;IACP,KAAK;IACL,mBAAmB;IACnB,SAAS;IACT,UAAU;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"extension-names.js","sourceRoot":"","sources":["../../src/decorators/extension-names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,WAAW;IACX,WAAW;IACX,SAAS;IACT,QAAQ;IACR,WAAW;IACX,MAAM;IACN,SAAS;IACT,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,OAAO;IACP,KAAK;IACL,mBAAmB;IACnB,SAAS;IACT,UAAU;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize-for-logging.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize-for-logging.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sanitize-for-logging.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize-for-logging.ts"],"names":[],"mappings":"AA2CA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,kBAAgB,GAAG,OAAO,CA6B9F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const REDACTED_LOG_VALUE = "[REDACTED]";
|
|
2
2
|
const CIRCULAR_LOG_VALUE = "[Circular]";
|
|
3
|
+
const OAUTH_FLOW_NONCE_NAME = /oauth[-_ +]?flow[-_ +]?nonce/i;
|
|
3
4
|
const SENSITIVE_LOG_KEYS = new Set([
|
|
4
5
|
"secret",
|
|
5
6
|
"appsecret",
|
|
@@ -13,14 +14,36 @@ const SENSITIVE_LOG_KEYS = new Set([
|
|
|
13
14
|
"clientsecret",
|
|
14
15
|
"password",
|
|
15
16
|
"xaccesstoken",
|
|
17
|
+
"resumeurl",
|
|
18
|
+
"resumenonce",
|
|
19
|
+
"oauthflownonce",
|
|
16
20
|
]);
|
|
17
21
|
function normalizeSensitiveLogKey(key) {
|
|
18
22
|
return key.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
19
23
|
}
|
|
24
|
+
function shouldRedactOAuthFlowURL(value) {
|
|
25
|
+
for (let depth = 0; depth < 4; depth++) {
|
|
26
|
+
if (OAUTH_FLOW_NONCE_NAME.test(value)) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
// Decode bytes only for detection; malformed escapes must not stop masking.
|
|
30
|
+
const decoded = value.replace(/%([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)));
|
|
31
|
+
if (decoded === value) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
value = decoded;
|
|
35
|
+
}
|
|
36
|
+
// Bound work for deeply nested redirects and hide values we cannot fully inspect.
|
|
37
|
+
return OAUTH_FLOW_NONCE_NAME.test(value) || /%[0-9a-f]{2}/i.test(value);
|
|
38
|
+
}
|
|
20
39
|
export function sanitizeForLogging(value, key, seen = new WeakSet()) {
|
|
21
40
|
if (key && SENSITIVE_LOG_KEYS.has(normalizeSensitiveLogKey(key))) {
|
|
22
41
|
return REDACTED_LOG_VALUE;
|
|
23
42
|
}
|
|
43
|
+
// Redirect destinations can embed the signed resume URL as an encoded query value.
|
|
44
|
+
if (typeof value === "string" && shouldRedactOAuthFlowURL(value)) {
|
|
45
|
+
return REDACTED_LOG_VALUE;
|
|
46
|
+
}
|
|
24
47
|
if (Array.isArray(value)) {
|
|
25
48
|
return value.map((item) => sanitizeForLogging(item, undefined, seen));
|
|
26
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize-for-logging.js","sourceRoot":"","sources":["../../src/utils/sanitize-for-logging.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,QAAQ;IACR,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,QAAQ;IACR,eAAe;IACf,cAAc;IACd,UAAU;IACV,cAAc;
|
|
1
|
+
{"version":3,"file":"sanitize-for-logging.js","sourceRoot":"","sources":["../../src/utils/sanitize-for-logging.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,qBAAqB,GAAG,+BAA+B,CAAC;AAC9D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,QAAQ;IACR,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,QAAQ;IACR,eAAe;IACf,cAAc;IACd,UAAU;IACV,cAAc;IACd,WAAW;IACX,aAAa;IACb,gBAAgB;CACjB,CAAC,CAAC;AAEH,SAAS,wBAAwB,CAAC,GAAW;IAC3C,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa;IAC7C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,4EAA4E;QAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CACnE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CACvC,CAAC;QACF,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,GAAG,OAAO,CAAC;IAClB,CAAC;IACD,kFAAkF;IAClF,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,GAAY,EAAE,IAAI,GAAG,IAAI,OAAO,EAAE;IACnF,IAAI,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,mFAAmF;IACnF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEhB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;YACpD,QAAQ;YACR,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC;SAC/C,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@channel.io/app-sdk-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "NestJS server SDK for Channel.io apps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"protobufjs": "^8.7.1",
|
|
26
26
|
"zod": "^3.24.1",
|
|
27
27
|
"zod-to-json-schema": "^3.25.2",
|
|
28
|
-
"@channel.io/app-sdk-core": "0.
|
|
28
|
+
"@channel.io/app-sdk-core": "0.26.0"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@google-cloud/bigquery": "^8.3.1",
|