obsidian-mcp-server 2.0.7 → 3.1.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/CLAUDE.md +364 -0
- package/Dockerfile +99 -0
- package/LICENSE +4 -6
- package/README.md +246 -206
- package/changelog/3.0.x/3.0.0.md +102 -0
- package/changelog/3.1.x/3.1.0.md +26 -0
- package/changelog/template.md +51 -0
- package/dist/config/server-config.d.ts +19 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +55 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -295
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts +8 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.js +8 -0
- package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +36 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +9 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts +23 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.js +47 -0
- package/dist/mcp-server/resources/definitions/obsidian-status.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts +13 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js +30 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts +21 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js +38 -0
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts +45 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.js +66 -0
- package/dist/mcp-server/tools/definitions/_shared/schemas.js.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts +51 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js +120 -0
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +582 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +40 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +42 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +58 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +46 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +66 -0
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts +19 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js +43 -0
- package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +92 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +245 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts +13 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js +38 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +273 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts +13 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js +38 -0
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +68 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +178 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +77 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +172 -0
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +22 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +88 -0
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +81 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +83 -0
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +167 -0
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +76 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +244 -0
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +48 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +100 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -0
- package/dist/services/obsidian/frontmatter-ops.d.ts +34 -0
- package/dist/services/obsidian/frontmatter-ops.d.ts.map +1 -0
- package/dist/services/obsidian/frontmatter-ops.js +230 -0
- package/dist/services/obsidian/frontmatter-ops.js.map +1 -0
- package/dist/services/obsidian/obsidian-service.d.ts +83 -0
- package/dist/services/obsidian/obsidian-service.d.ts.map +1 -0
- package/dist/services/obsidian/obsidian-service.js +435 -0
- package/dist/services/obsidian/obsidian-service.js.map +1 -0
- package/dist/services/obsidian/section-extractor.d.ts +13 -0
- package/dist/services/obsidian/section-extractor.d.ts.map +1 -0
- package/dist/services/obsidian/section-extractor.js +124 -0
- package/dist/services/obsidian/section-extractor.js.map +1 -0
- package/dist/services/obsidian/types.d.ts +91 -0
- package/dist/services/obsidian/types.d.ts.map +1 -0
- package/dist/services/obsidian/types.js +7 -0
- package/dist/services/obsidian/types.js.map +1 -0
- package/package.json +63 -69
- package/server.json +167 -0
- package/CHANGELOG.md +0 -124
- package/dist/config/index.d.ts +0 -41
- package/dist/config/index.js +0 -191
- package/dist/mcp-server/server.d.ts +0 -33
- package/dist/mcp-server/server.js +0 -211
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.d.ts +0 -51
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.js +0 -168
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.d.ts +0 -19
- package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.js +0 -91
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.d.ts +0 -77
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.js +0 -341
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.d.ts +0 -18
- package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.js +0 -69
- package/dist/mcp-server/tools/obsidianListNotesTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianListNotesTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianListNotesTool/logic.d.ts +0 -68
- package/dist/mcp-server/tools/obsidianListNotesTool/logic.js +0 -215
- package/dist/mcp-server/tools/obsidianListNotesTool/registration.d.ts +0 -23
- package/dist/mcp-server/tools/obsidianListNotesTool/registration.js +0 -98
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.js +0 -2
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.d.ts +0 -42
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.js +0 -152
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.js +0 -52
- package/dist/mcp-server/tools/obsidianManageTagsTool/index.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageTagsTool/index.js +0 -2
- package/dist/mcp-server/tools/obsidianManageTagsTool/logic.d.ts +0 -28
- package/dist/mcp-server/tools/obsidianManageTagsTool/logic.js +0 -161
- package/dist/mcp-server/tools/obsidianManageTagsTool/registration.d.ts +0 -3
- package/dist/mcp-server/tools/obsidianManageTagsTool/registration.js +0 -52
- package/dist/mcp-server/tools/obsidianReadNoteTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianReadNoteTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianReadNoteTool/logic.d.ts +0 -87
- package/dist/mcp-server/tools/obsidianReadNoteTool/logic.js +0 -216
- package/dist/mcp-server/tools/obsidianReadNoteTool/registration.d.ts +0 -20
- package/dist/mcp-server/tools/obsidianReadNoteTool/registration.js +0 -101
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.d.ts +0 -255
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.js +0 -583
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.d.ts +0 -22
- package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.js +0 -111
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.d.ts +0 -12
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.js +0 -12
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.d.ts +0 -183
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.js +0 -490
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.d.ts +0 -21
- package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.js +0 -108
- package/dist/mcp-server/transports/auth/core/authContext.d.ts +0 -33
- package/dist/mcp-server/transports/auth/core/authContext.js +0 -24
- package/dist/mcp-server/transports/auth/core/authTypes.d.ts +0 -17
- package/dist/mcp-server/transports/auth/core/authTypes.js +0 -5
- package/dist/mcp-server/transports/auth/core/authUtils.d.ts +0 -18
- package/dist/mcp-server/transports/auth/core/authUtils.js +0 -45
- package/dist/mcp-server/transports/auth/index.d.ts +0 -10
- package/dist/mcp-server/transports/auth/index.js +0 -9
- package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.d.ts +0 -27
- package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.js +0 -149
- package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.d.ts +0 -20
- package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.js +0 -124
- package/dist/mcp-server/transports/httpErrorHandler.d.ts +0 -26
- package/dist/mcp-server/transports/httpErrorHandler.js +0 -73
- package/dist/mcp-server/transports/httpTransport.d.ts +0 -21
- package/dist/mcp-server/transports/httpTransport.js +0 -208
- package/dist/mcp-server/transports/stdioTransport.d.ts +0 -42
- package/dist/mcp-server/transports/stdioTransport.js +0 -63
- package/dist/services/obsidianRestAPI/index.d.ts +0 -15
- package/dist/services/obsidianRestAPI/index.js +0 -17
- package/dist/services/obsidianRestAPI/methods/activeFileMethods.d.ts +0 -38
- package/dist/services/obsidianRestAPI/methods/activeFileMethods.js +0 -62
- package/dist/services/obsidianRestAPI/methods/commandMethods.d.ts +0 -22
- package/dist/services/obsidianRestAPI/methods/commandMethods.js +0 -31
- package/dist/services/obsidianRestAPI/methods/openMethods.d.ts +0 -16
- package/dist/services/obsidianRestAPI/methods/openMethods.js +0 -21
- package/dist/services/obsidianRestAPI/methods/patchMethods.d.ts +0 -37
- package/dist/services/obsidianRestAPI/methods/patchMethods.js +0 -94
- package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.d.ts +0 -42
- package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.js +0 -66
- package/dist/services/obsidianRestAPI/methods/searchMethods.d.ts +0 -25
- package/dist/services/obsidianRestAPI/methods/searchMethods.js +0 -36
- package/dist/services/obsidianRestAPI/methods/vaultMethods.d.ts +0 -58
- package/dist/services/obsidianRestAPI/methods/vaultMethods.js +0 -144
- package/dist/services/obsidianRestAPI/service.d.ts +0 -195
- package/dist/services/obsidianRestAPI/service.js +0 -379
- package/dist/services/obsidianRestAPI/types.d.ts +0 -127
- package/dist/services/obsidianRestAPI/types.js +0 -7
- package/dist/services/obsidianRestAPI/vaultCache/index.d.ts +0 -4
- package/dist/services/obsidianRestAPI/vaultCache/index.js +0 -4
- package/dist/services/obsidianRestAPI/vaultCache/service.d.ts +0 -88
- package/dist/services/obsidianRestAPI/vaultCache/service.js +0 -299
- package/dist/types-global/errors.d.ts +0 -73
- package/dist/types-global/errors.js +0 -71
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.js +0 -13
- package/dist/utils/internal/asyncUtils.d.ts +0 -54
- package/dist/utils/internal/asyncUtils.js +0 -101
- package/dist/utils/internal/errorHandler.d.ts +0 -176
- package/dist/utils/internal/errorHandler.js +0 -351
- package/dist/utils/internal/index.d.ts +0 -4
- package/dist/utils/internal/index.js +0 -4
- package/dist/utils/internal/logger.d.ts +0 -141
- package/dist/utils/internal/logger.js +0 -406
- package/dist/utils/internal/requestContext.d.ts +0 -83
- package/dist/utils/internal/requestContext.js +0 -72
- package/dist/utils/metrics/index.d.ts +0 -1
- package/dist/utils/metrics/index.js +0 -1
- package/dist/utils/metrics/tokenCounter.d.ts +0 -27
- package/dist/utils/metrics/tokenCounter.js +0 -128
- package/dist/utils/obsidian/index.d.ts +0 -5
- package/dist/utils/obsidian/index.js +0 -5
- package/dist/utils/obsidian/obsidianApiUtils.d.ts +0 -14
- package/dist/utils/obsidian/obsidianApiUtils.js +0 -29
- package/dist/utils/obsidian/obsidianStatUtils.d.ts +0 -68
- package/dist/utils/obsidian/obsidianStatUtils.js +0 -143
- package/dist/utils/parsing/dateParser.d.ts +0 -56
- package/dist/utils/parsing/dateParser.js +0 -104
- package/dist/utils/parsing/index.d.ts +0 -2
- package/dist/utils/parsing/index.js +0 -3
- package/dist/utils/parsing/jsonParser.d.ts +0 -80
- package/dist/utils/parsing/jsonParser.js +0 -133
- package/dist/utils/security/idGenerator.d.ts +0 -140
- package/dist/utils/security/idGenerator.js +0 -194
- package/dist/utils/security/index.d.ts +0 -3
- package/dist/utils/security/index.js +0 -3
- package/dist/utils/security/rateLimiter.d.ts +0 -156
- package/dist/utils/security/rateLimiter.js +0 -235
- package/dist/utils/security/sanitization.d.ts +0 -244
- package/dist/utils/security/sanitization.js +0 -599
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Provides a generic rate limiter class to manage request rates
|
|
3
|
-
* based on configurable time windows and request counts. It supports custom
|
|
4
|
-
* key generation, periodic cleanup of expired entries, and skipping rate
|
|
5
|
-
* limiting in development environments.
|
|
6
|
-
* @module src/utils/security/rateLimiter
|
|
7
|
-
*/
|
|
8
|
-
import { BaseErrorCode, McpError } from "../../types-global/errors.js";
|
|
9
|
-
import { environment } from "../../config/index.js";
|
|
10
|
-
import { logger, requestContextService, } from "../internal/index.js"; // Use internal index for RequestContext
|
|
11
|
-
/**
|
|
12
|
-
* A generic rate limiter class that can be used to control the frequency of
|
|
13
|
-
* operations or requests from various sources. It stores request counts in memory.
|
|
14
|
-
*/
|
|
15
|
-
export class RateLimiter {
|
|
16
|
-
/**
|
|
17
|
-
* Creates a new `RateLimiter` instance.
|
|
18
|
-
* @param {Partial<RateLimitConfig>} [initialConfig={}] - Optional initial configuration
|
|
19
|
-
* to override default settings.
|
|
20
|
-
*/
|
|
21
|
-
constructor(initialConfig = {}) {
|
|
22
|
-
this.cleanupTimer = null;
|
|
23
|
-
this.currentConfig = { ...RateLimiter.DEFAULT_CONFIG, ...initialConfig };
|
|
24
|
-
this.limits = new Map();
|
|
25
|
-
this.startCleanupTimer();
|
|
26
|
-
// Initial log message about instantiation can be done by the code that creates the singleton instance,
|
|
27
|
-
// after logger itself is fully initialized.
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Starts the periodic cleanup timer for expired rate limit entries.
|
|
31
|
-
* If a timer already exists, it's cleared and restarted.
|
|
32
|
-
* @private
|
|
33
|
-
*/
|
|
34
|
-
startCleanupTimer() {
|
|
35
|
-
if (this.cleanupTimer) {
|
|
36
|
-
clearInterval(this.cleanupTimer);
|
|
37
|
-
this.cleanupTimer = null;
|
|
38
|
-
}
|
|
39
|
-
const interval = this.currentConfig.cleanupInterval;
|
|
40
|
-
if (interval && interval > 0) {
|
|
41
|
-
this.cleanupTimer = setInterval(() => {
|
|
42
|
-
this.cleanupExpiredEntries();
|
|
43
|
-
}, interval);
|
|
44
|
-
// Allow Node.js to exit if this timer is the only thing running.
|
|
45
|
-
if (this.cleanupTimer.unref) {
|
|
46
|
-
this.cleanupTimer.unref();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Removes expired entries from the rate limit store to free up memory.
|
|
52
|
-
* This method is called periodically by the cleanup timer.
|
|
53
|
-
* @private
|
|
54
|
-
*/
|
|
55
|
-
cleanupExpiredEntries() {
|
|
56
|
-
const now = Date.now();
|
|
57
|
-
let expiredCount = 0;
|
|
58
|
-
const internalContext = requestContextService.createRequestContext({
|
|
59
|
-
operation: "RateLimiter.cleanupExpiredEntries",
|
|
60
|
-
});
|
|
61
|
-
for (const [key, entry] of this.limits.entries()) {
|
|
62
|
-
if (now >= entry.resetTime) {
|
|
63
|
-
this.limits.delete(key);
|
|
64
|
-
expiredCount++;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
if (expiredCount > 0) {
|
|
68
|
-
logger.debug(`Cleaned up ${expiredCount} expired rate limit entries.`, {
|
|
69
|
-
...internalContext,
|
|
70
|
-
totalRemaining: this.limits.size,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Updates the rate limiter's configuration.
|
|
76
|
-
* @param {Partial<RateLimitConfig>} newConfig - Partial configuration object
|
|
77
|
-
* with new settings to apply.
|
|
78
|
-
*/
|
|
79
|
-
configure(newConfig) {
|
|
80
|
-
const oldCleanupInterval = this.currentConfig.cleanupInterval;
|
|
81
|
-
this.currentConfig = { ...this.currentConfig, ...newConfig };
|
|
82
|
-
if (newConfig.cleanupInterval !== undefined &&
|
|
83
|
-
newConfig.cleanupInterval !== oldCleanupInterval) {
|
|
84
|
-
this.startCleanupTimer(); // Restart timer if interval changed
|
|
85
|
-
}
|
|
86
|
-
// Consider logging configuration changes if needed, using a RequestContext.
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Retrieves a copy of the current rate limiter configuration.
|
|
90
|
-
* @returns {RateLimitConfig} The current configuration.
|
|
91
|
-
*/
|
|
92
|
-
getConfig() {
|
|
93
|
-
return { ...this.currentConfig };
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Resets all rate limits, clearing all tracked keys and their counts.
|
|
97
|
-
* @param {RequestContext} [context] - Optional context for logging the reset operation.
|
|
98
|
-
*/
|
|
99
|
-
reset(context) {
|
|
100
|
-
this.limits.clear();
|
|
101
|
-
const opContext = context ||
|
|
102
|
-
requestContextService.createRequestContext({
|
|
103
|
-
operation: "RateLimiter.reset",
|
|
104
|
-
});
|
|
105
|
-
logger.info("Rate limiter has been reset. All limits cleared.", opContext);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Checks if a request identified by a key exceeds the configured rate limit.
|
|
109
|
-
* If the limit is exceeded, an `McpError` is thrown.
|
|
110
|
-
*
|
|
111
|
-
* @param {string} identifier - A unique string identifying the source of the request
|
|
112
|
-
* (e.g., IP address, user ID, session ID).
|
|
113
|
-
* @param {RequestContext} [context] - Optional request context for logging and potentially
|
|
114
|
-
* for use by a custom `keyGenerator`.
|
|
115
|
-
* @throws {McpError} If the rate limit is exceeded for the given key.
|
|
116
|
-
* The error will have `BaseErrorCode.RATE_LIMITED`.
|
|
117
|
-
*/
|
|
118
|
-
check(identifier, context) {
|
|
119
|
-
const opContext = context ||
|
|
120
|
-
requestContextService.createRequestContext({
|
|
121
|
-
operation: "RateLimiter.check",
|
|
122
|
-
identifier,
|
|
123
|
-
});
|
|
124
|
-
if (this.currentConfig.skipInDevelopment && environment === "development") {
|
|
125
|
-
logger.debug(`Rate limiting skipped for key "${identifier}" in development environment.`, opContext);
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const limitKey = this.currentConfig.keyGenerator
|
|
129
|
-
? this.currentConfig.keyGenerator(identifier, opContext)
|
|
130
|
-
: identifier;
|
|
131
|
-
const now = Date.now();
|
|
132
|
-
const entry = this.limits.get(limitKey);
|
|
133
|
-
if (!entry || now >= entry.resetTime) {
|
|
134
|
-
// New entry or expired window
|
|
135
|
-
this.limits.set(limitKey, {
|
|
136
|
-
count: 1,
|
|
137
|
-
resetTime: now + this.currentConfig.windowMs,
|
|
138
|
-
});
|
|
139
|
-
return; // First request in window, allow
|
|
140
|
-
}
|
|
141
|
-
// Window is active, check count
|
|
142
|
-
if (entry.count >= this.currentConfig.maxRequests) {
|
|
143
|
-
const waitTimeSeconds = Math.ceil((entry.resetTime - now) / 1000);
|
|
144
|
-
const errorMessageTemplate = this.currentConfig.errorMessage ||
|
|
145
|
-
RateLimiter.DEFAULT_CONFIG.errorMessage;
|
|
146
|
-
const errorMessage = errorMessageTemplate.replace("{waitTime}", waitTimeSeconds.toString());
|
|
147
|
-
logger.warning(`Rate limit exceeded for key "${limitKey}".`, {
|
|
148
|
-
...opContext,
|
|
149
|
-
limitKey,
|
|
150
|
-
count: entry.count,
|
|
151
|
-
maxRequests: this.currentConfig.maxRequests,
|
|
152
|
-
resetTime: new Date(entry.resetTime).toISOString(),
|
|
153
|
-
waitTimeSeconds,
|
|
154
|
-
});
|
|
155
|
-
throw new McpError(BaseErrorCode.RATE_LIMITED, errorMessage, { ...opContext, keyUsed: limitKey, waitTime: waitTimeSeconds });
|
|
156
|
-
}
|
|
157
|
-
// Increment count and update entry
|
|
158
|
-
entry.count++;
|
|
159
|
-
// No need to this.limits.set(limitKey, entry) again if entry is a reference to the object in the map.
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Retrieves the current rate limit status for a given key.
|
|
163
|
-
* @param {string} key - The rate limit key (as generated by `keyGenerator` or the raw identifier).
|
|
164
|
-
* @returns {{ current: number; limit: number; remaining: number; resetTime: number } | null}
|
|
165
|
-
* An object with current status, or `null` if the key is not currently tracked (or has expired).
|
|
166
|
-
* `resetTime` is a Unix timestamp (milliseconds).
|
|
167
|
-
*/
|
|
168
|
-
getStatus(key) {
|
|
169
|
-
const entry = this.limits.get(key);
|
|
170
|
-
if (!entry || Date.now() >= entry.resetTime) {
|
|
171
|
-
// Also consider expired as not found for status
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
return {
|
|
175
|
-
current: entry.count,
|
|
176
|
-
limit: this.currentConfig.maxRequests,
|
|
177
|
-
remaining: Math.max(0, this.currentConfig.maxRequests - entry.count),
|
|
178
|
-
resetTime: entry.resetTime,
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Stops the cleanup timer and clears all rate limit entries.
|
|
183
|
-
* This should be called if the rate limiter instance is no longer needed,
|
|
184
|
-
* to prevent resource leaks (though `unref` on the timer helps).
|
|
185
|
-
* @param {RequestContext} [context] - Optional context for logging the disposal.
|
|
186
|
-
*/
|
|
187
|
-
dispose(context) {
|
|
188
|
-
if (this.cleanupTimer) {
|
|
189
|
-
clearInterval(this.cleanupTimer);
|
|
190
|
-
this.cleanupTimer = null;
|
|
191
|
-
}
|
|
192
|
-
this.limits.clear();
|
|
193
|
-
const opContext = context ||
|
|
194
|
-
requestContextService.createRequestContext({
|
|
195
|
-
operation: "RateLimiter.dispose",
|
|
196
|
-
});
|
|
197
|
-
logger.info("Rate limiter disposed, cleanup timer stopped and limits cleared.", opContext);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Default configuration values for the rate limiter.
|
|
202
|
-
*/
|
|
203
|
-
RateLimiter.DEFAULT_CONFIG = {
|
|
204
|
-
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
205
|
-
maxRequests: 100,
|
|
206
|
-
errorMessage: "Rate limit exceeded. Please try again in {waitTime} seconds.",
|
|
207
|
-
skipInDevelopment: false,
|
|
208
|
-
cleanupInterval: 5 * 60 * 1000, // 5 minutes
|
|
209
|
-
};
|
|
210
|
-
/**
|
|
211
|
-
* A default, shared instance of the `RateLimiter`.
|
|
212
|
-
* This instance is configured with default settings (e.g., 100 requests per 15 minutes).
|
|
213
|
-
* It can be reconfigured using `rateLimiter.configure()`.
|
|
214
|
-
*
|
|
215
|
-
* Example:
|
|
216
|
-
* ```typescript
|
|
217
|
-
* import { rateLimiter, RequestContext } from './rateLimiter';
|
|
218
|
-
* import { requestContextService } from '../internal';
|
|
219
|
-
*
|
|
220
|
-
* const context: RequestContext = requestContextService.createRequestContext({ operation: 'MyApiCall' });
|
|
221
|
-
* const userIp = '123.45.67.89';
|
|
222
|
-
*
|
|
223
|
-
* try {
|
|
224
|
-
* rateLimiter.check(userIp, context);
|
|
225
|
-
* // Proceed with operation
|
|
226
|
-
* } catch (e) {
|
|
227
|
-
* if (e instanceof McpError && e.code === BaseErrorCode.RATE_LIMITED) {
|
|
228
|
-
* console.error("Rate limit hit:", e.message);
|
|
229
|
-
* } else {
|
|
230
|
-
* // Handle other errors
|
|
231
|
-
* }
|
|
232
|
-
* }
|
|
233
|
-
* ```
|
|
234
|
-
*/
|
|
235
|
-
export const rateLimiter = new RateLimiter({}); // Initialize with default or empty to use class defaults
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Provides a comprehensive sanitization utility class for various input types,
|
|
3
|
-
* including HTML, strings, URLs, file paths, JSON, and numbers. It also includes
|
|
4
|
-
* functionality for redacting sensitive information from objects for safe logging.
|
|
5
|
-
* @module src/utils/security/sanitization
|
|
6
|
-
*/
|
|
7
|
-
import sanitizeHtml from "sanitize-html";
|
|
8
|
-
import { RequestContext } from "../internal/index.js";
|
|
9
|
-
/**
|
|
10
|
-
* Options for path sanitization, controlling how file paths are cleaned and validated.
|
|
11
|
-
*/
|
|
12
|
-
export interface PathSanitizeOptions {
|
|
13
|
-
/**
|
|
14
|
-
* If provided, restricts sanitized paths to be relative to this root directory.
|
|
15
|
-
* Attempts to traverse above this root (e.g., using `../`) will result in an error.
|
|
16
|
-
* The final sanitized path will be relative to this `rootDir`.
|
|
17
|
-
*/
|
|
18
|
-
rootDir?: string;
|
|
19
|
-
/**
|
|
20
|
-
* If `true`, normalizes Windows-style backslashes (`\\`) to POSIX-style forward slashes (`/`).
|
|
21
|
-
* Defaults to `false`.
|
|
22
|
-
*/
|
|
23
|
-
toPosix?: boolean;
|
|
24
|
-
/**
|
|
25
|
-
* If `true`, allows absolute paths, subject to `rootDir` constraints if `rootDir` is also provided.
|
|
26
|
-
* If `false` (default), absolute paths are converted to relative paths by removing leading slashes or drive letters.
|
|
27
|
-
*/
|
|
28
|
-
allowAbsolute?: boolean;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Information returned by the `sanitizePath` method, providing details about
|
|
32
|
-
* the sanitization process and its outcome.
|
|
33
|
-
*/
|
|
34
|
-
export interface SanitizedPathInfo {
|
|
35
|
-
/** The final sanitized and normalized path string. */
|
|
36
|
-
sanitizedPath: string;
|
|
37
|
-
/** The original path string passed to the function before any normalization or sanitization. */
|
|
38
|
-
originalInput: string;
|
|
39
|
-
/** Indicates if the input path was determined to be absolute after initial `path.normalize()`. */
|
|
40
|
-
wasAbsolute: boolean;
|
|
41
|
-
/**
|
|
42
|
-
* Indicates if an initially absolute path was converted to a relative path
|
|
43
|
-
* (typically because `options.allowAbsolute` was `false`).
|
|
44
|
-
*/
|
|
45
|
-
convertedToRelative: boolean;
|
|
46
|
-
/** The effective options (including defaults) that were used for sanitization. */
|
|
47
|
-
optionsUsed: PathSanitizeOptions;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Options for context-specific string sanitization using `sanitizeString`.
|
|
51
|
-
*/
|
|
52
|
-
export interface SanitizeStringOptions {
|
|
53
|
-
/**
|
|
54
|
-
* Specifies the context in which the string will be used, guiding the sanitization strategy.
|
|
55
|
-
* - `'text'`: (Default) Strips all HTML tags, suitable for plain text content.
|
|
56
|
-
* - `'html'`: Sanitizes for safe HTML embedding, using `allowedTags` and `allowedAttributes`.
|
|
57
|
-
* - `'attribute'`: Sanitizes for use within an HTML attribute value (strips all tags).
|
|
58
|
-
* - `'url'`: Validates and trims the string as a URL.
|
|
59
|
-
* - `'javascript'`: **Disallowed.** Throws an error to prevent unsafe JavaScript sanitization.
|
|
60
|
-
*/
|
|
61
|
-
context?: "text" | "html" | "attribute" | "url" | "javascript";
|
|
62
|
-
/** Custom allowed HTML tags when `context` is `'html'`. Overrides default HTML sanitization tags. */
|
|
63
|
-
allowedTags?: string[];
|
|
64
|
-
/** Custom allowed HTML attributes per tag when `context` is `'html'`. Overrides default HTML sanitization attributes. */
|
|
65
|
-
allowedAttributes?: Record<string, string[]>;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Configuration options for HTML sanitization using `sanitizeHtml`.
|
|
69
|
-
*/
|
|
70
|
-
export interface HtmlSanitizeConfig {
|
|
71
|
-
/** An array of allowed HTML tag names (e.g., `['p', 'a', 'strong']`). */
|
|
72
|
-
allowedTags?: string[];
|
|
73
|
-
/**
|
|
74
|
-
* A map specifying allowed attributes for HTML tags.
|
|
75
|
-
* Keys can be tag names (e.g., `'a'`) or `'*'` for global attributes.
|
|
76
|
-
* Values are arrays of allowed attribute names (e.g., `{'a': ['href', 'title']}`).
|
|
77
|
-
*/
|
|
78
|
-
allowedAttributes?: sanitizeHtml.IOptions["allowedAttributes"];
|
|
79
|
-
/** If `true`, HTML comments (`<!-- ... -->`) are preserved. Defaults to `false`. */
|
|
80
|
-
preserveComments?: boolean;
|
|
81
|
-
/**
|
|
82
|
-
* Custom rules for transforming tags during sanitization.
|
|
83
|
-
* See `sanitize-html` documentation for `transformTags` options.
|
|
84
|
-
*/
|
|
85
|
-
transformTags?: sanitizeHtml.IOptions["transformTags"];
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* A singleton utility class for performing various input sanitization tasks.
|
|
89
|
-
* It provides methods to clean and validate strings, HTML, URLs, file paths, JSON,
|
|
90
|
-
* and numbers, and to redact sensitive data for logging.
|
|
91
|
-
*/
|
|
92
|
-
export declare class Sanitization {
|
|
93
|
-
private static instance;
|
|
94
|
-
private sensitiveFields;
|
|
95
|
-
private defaultHtmlSanitizeConfig;
|
|
96
|
-
private constructor();
|
|
97
|
-
/**
|
|
98
|
-
* Gets the singleton instance of the `Sanitization` class.
|
|
99
|
-
* @returns {Sanitization} The singleton instance.
|
|
100
|
-
*/
|
|
101
|
-
static getInstance(): Sanitization;
|
|
102
|
-
/**
|
|
103
|
-
* Sets or extends the list of field names considered sensitive for log redaction.
|
|
104
|
-
* Field names are matched case-insensitively.
|
|
105
|
-
* @param {string[]} fields - An array of field names to add to the sensitive list.
|
|
106
|
-
* @param {RequestContext} [context] - Optional context for logging this configuration change.
|
|
107
|
-
*/
|
|
108
|
-
setSensitiveFields(fields: string[], context?: RequestContext): void;
|
|
109
|
-
/**
|
|
110
|
-
* Retrieves a copy of the current list of sensitive field names used for log redaction.
|
|
111
|
-
* @returns {string[]} An array of sensitive field names (all lowercase).
|
|
112
|
-
*/
|
|
113
|
-
getSensitiveFields(): string[];
|
|
114
|
-
/**
|
|
115
|
-
* Sanitizes an HTML string by removing potentially malicious tags and attributes,
|
|
116
|
-
* based on a configurable allow-list.
|
|
117
|
-
* @param {string} input - The HTML string to sanitize.
|
|
118
|
-
* @param {HtmlSanitizeConfig} [config] - Optional custom configuration for HTML sanitization.
|
|
119
|
-
* Overrides defaults for `allowedTags`, `allowedAttributes`, etc.
|
|
120
|
-
* @returns {string} The sanitized HTML string. Returns an empty string if input is falsy.
|
|
121
|
-
*/
|
|
122
|
-
sanitizeHtml(input: string, config?: HtmlSanitizeConfig): string;
|
|
123
|
-
/**
|
|
124
|
-
* Sanitizes a tag name by removing the leading '#' and replacing invalid characters.
|
|
125
|
-
* @param {string} input - The tag string to sanitize.
|
|
126
|
-
* @returns {string} The sanitized tag name.
|
|
127
|
-
*/
|
|
128
|
-
sanitizeTagName(input: string): string;
|
|
129
|
-
/**
|
|
130
|
-
>>>>>>> REPLACE
|
|
131
|
-
* Sanitizes a string based on its intended usage context (e.g., HTML, URL, plain text).
|
|
132
|
-
*
|
|
133
|
-
* **Security Note:** Using `context: 'javascript'` is explicitly disallowed and will throw an `McpError`.
|
|
134
|
-
* This is to prevent accidental introduction of XSS vulnerabilities through ineffective sanitization
|
|
135
|
-
* of JavaScript code. Proper contextual encoding or safer methods should be used for JavaScript.
|
|
136
|
-
*
|
|
137
|
-
* @param {string} input - The string to sanitize.
|
|
138
|
-
* @param {SanitizeStringOptions} [options={}] - Options specifying the sanitization context
|
|
139
|
-
* and any context-specific parameters (like `allowedTags` for HTML).
|
|
140
|
-
* @param {RequestContext} [contextForLogging] - Optional context for logging warnings or errors.
|
|
141
|
-
* @returns {string} The sanitized string. Returns an empty string if input is falsy.
|
|
142
|
-
* @throws {McpError} If `options.context` is `'javascript'`.
|
|
143
|
-
*/
|
|
144
|
-
sanitizeString(input: string, options?: SanitizeStringOptions, contextForLogging?: RequestContext): string;
|
|
145
|
-
/**
|
|
146
|
-
* Sanitizes a URL string by validating its format and protocol.
|
|
147
|
-
* @param {string} input - The URL string to sanitize.
|
|
148
|
-
* @param {string[]} [allowedProtocols=['http', 'https']] - An array of allowed URL protocols (e.g., 'http', 'https', 'ftp').
|
|
149
|
-
* @param {RequestContext} [contextForLogging] - Optional context for logging errors.
|
|
150
|
-
* @returns {string} The sanitized and trimmed URL string.
|
|
151
|
-
* @throws {McpError} If the URL is invalid, uses a disallowed protocol, or contains 'javascript:'.
|
|
152
|
-
*/
|
|
153
|
-
sanitizeUrl(input: string, allowedProtocols?: string[], contextForLogging?: RequestContext): string;
|
|
154
|
-
/**
|
|
155
|
-
* Sanitizes a file path to prevent path traversal attacks and normalize its format.
|
|
156
|
-
*
|
|
157
|
-
* @param {string} input - The file path string to sanitize.
|
|
158
|
-
* @param {PathSanitizeOptions} [options={}] - Options to control sanitization behavior (e.g., `rootDir`, `toPosix`).
|
|
159
|
-
* @param {RequestContext} [contextForLogging] - Optional context for logging warnings or errors.
|
|
160
|
-
* @returns {SanitizedPathInfo} An object containing the sanitized path and metadata about the sanitization.
|
|
161
|
-
* @throws {McpError} If the path is invalid (e.g., empty, contains null bytes) or determined to be unsafe
|
|
162
|
-
* (e.g., attempts to traverse outside `rootDir` or current working directory if no `rootDir`).
|
|
163
|
-
*/
|
|
164
|
-
sanitizePath(input: string, options?: PathSanitizeOptions, contextForLogging?: RequestContext): SanitizedPathInfo;
|
|
165
|
-
/**
|
|
166
|
-
* Sanitizes a JSON string by parsing it to validate its format.
|
|
167
|
-
* Optionally checks if the JSON string's byte size exceeds a maximum limit.
|
|
168
|
-
*
|
|
169
|
-
* @template T The expected type of the parsed JSON object. Defaults to `unknown`.
|
|
170
|
-
* @param {string} input - The JSON string to sanitize/validate.
|
|
171
|
-
* @param {number} [maxSizeBytes] - Optional maximum allowed size of the JSON string in bytes.
|
|
172
|
-
* @param {RequestContext} [contextForLogging] - Optional context for logging errors.
|
|
173
|
-
* @returns {T} The parsed JavaScript object.
|
|
174
|
-
* @throws {McpError} If the input is not a string, is not valid JSON, or exceeds `maxSizeBytes`.
|
|
175
|
-
*/
|
|
176
|
-
sanitizeJson<T = unknown>(input: string, maxSizeBytes?: number, contextForLogging?: RequestContext): T;
|
|
177
|
-
/**
|
|
178
|
-
* Sanitizes a numeric input (number or string) by converting it to a number
|
|
179
|
-
* and optionally clamping it within a specified min/max range.
|
|
180
|
-
*
|
|
181
|
-
* @param {number | string} input - The numeric value or string representation of a number.
|
|
182
|
-
* @param {number} [min] - Optional minimum allowed value (inclusive).
|
|
183
|
-
* @param {number} [max] - Optional maximum allowed value (inclusive).
|
|
184
|
-
* @param {RequestContext} [contextForLogging] - Optional context for logging clamping or errors.
|
|
185
|
-
* @returns {number} The sanitized (and potentially clamped) number.
|
|
186
|
-
* @throws {McpError} If the input cannot be parsed into a valid, finite number.
|
|
187
|
-
*/
|
|
188
|
-
sanitizeNumber(input: number | string, min?: number, max?: number, contextForLogging?: RequestContext): number;
|
|
189
|
-
/**
|
|
190
|
-
* Sanitizes an object or array for logging by deep cloning it and redacting fields
|
|
191
|
-
* whose names (case-insensitively) match any of the configured sensitive field names.
|
|
192
|
-
* Redacted fields are replaced with the string `'[REDACTED]'`.
|
|
193
|
-
*
|
|
194
|
-
* @param {unknown} input - The object, array, or other value to sanitize for logging.
|
|
195
|
-
* If input is not an object or array, it's returned as is.
|
|
196
|
-
* @param {RequestContext} [contextForLogging] - Optional context for logging errors during sanitization.
|
|
197
|
-
* @returns {unknown} A sanitized copy of the input, safe for logging.
|
|
198
|
-
* Returns `'[Log Sanitization Failed]'` if an unexpected error occurs during sanitization.
|
|
199
|
-
*/
|
|
200
|
-
sanitizeForLogging(input: unknown, contextForLogging?: RequestContext): unknown;
|
|
201
|
-
/**
|
|
202
|
-
* Helper to convert attribute format for sanitize-html.
|
|
203
|
-
* `sanitize-html` expects `allowedAttributes` in a specific format.
|
|
204
|
-
* This method assumes the input `attrs` (from `SanitizeStringOptions`)
|
|
205
|
-
* is already in the correct format or a compatible one.
|
|
206
|
-
* @param {Record<string, string[]>} attrs - Attributes configuration.
|
|
207
|
-
* @returns {sanitizeHtml.IOptions['allowedAttributes']} Attributes in `sanitize-html` format.
|
|
208
|
-
* @private
|
|
209
|
-
*/
|
|
210
|
-
private convertAttributesFormat;
|
|
211
|
-
/**
|
|
212
|
-
* Recursively redacts sensitive fields within an object or array.
|
|
213
|
-
* This method modifies the input object/array in place.
|
|
214
|
-
* @param {unknown} obj - The object or array to redact sensitive fields from.
|
|
215
|
-
* @private
|
|
216
|
-
*/
|
|
217
|
-
private redactSensitiveFields;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* A default, shared instance of the `Sanitization` class.
|
|
221
|
-
* Use this instance for all sanitization tasks.
|
|
222
|
-
*
|
|
223
|
-
* Example:
|
|
224
|
-
* ```typescript
|
|
225
|
-
* import { sanitization, sanitizeInputForLogging } from './sanitization';
|
|
226
|
-
*
|
|
227
|
-
* const unsafeHtml = "<script>alert('xss')</script><p>Safe</p>";
|
|
228
|
-
* const safeHtml = sanitization.sanitizeHtml(unsafeHtml);
|
|
229
|
-
*
|
|
230
|
-
* const sensitiveData = { password: '123', username: 'user' };
|
|
231
|
-
* const safeLogData = sanitizeInputForLogging(sensitiveData);
|
|
232
|
-
* // safeLogData will be { password: '[REDACTED]', username: 'user' }
|
|
233
|
-
* ```
|
|
234
|
-
*/
|
|
235
|
-
export declare const sanitization: Sanitization;
|
|
236
|
-
/**
|
|
237
|
-
* A convenience function that wraps `sanitization.sanitizeForLogging`.
|
|
238
|
-
* Sanitizes an object or array for logging by redacting sensitive fields.
|
|
239
|
-
*
|
|
240
|
-
* @param {unknown} input - The data to sanitize for logging.
|
|
241
|
-
* @param {RequestContext} [contextForLogging] - Optional context for logging errors during sanitization.
|
|
242
|
-
* @returns {unknown} A sanitized copy of the input, safe for logging.
|
|
243
|
-
*/
|
|
244
|
-
export declare const sanitizeInputForLogging: (input: unknown, contextForLogging?: RequestContext) => unknown;
|