mcp-wordpress 1.1.7 → 1.2.2
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/README.md +388 -66
- package/dist/cache/CacheInvalidation.d.ts +118 -0
- package/dist/cache/CacheInvalidation.d.ts.map +1 -0
- package/dist/cache/CacheInvalidation.js +349 -0
- package/dist/cache/CacheInvalidation.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +143 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +308 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/HttpCacheWrapper.d.ts +121 -0
- package/dist/cache/HttpCacheWrapper.d.ts.map +1 -0
- package/dist/cache/HttpCacheWrapper.js +280 -0
- package/dist/cache/HttpCacheWrapper.js.map +1 -0
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts +5 -0
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CacheInvalidation.test.js +236 -0
- package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -0
- package/dist/cache/__tests__/CacheManager.test.d.ts +5 -0
- package/dist/cache/__tests__/CacheManager.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CacheManager.test.js +233 -0
- package/dist/cache/__tests__/CacheManager.test.js.map +1 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +5 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +1 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.js +228 -0
- package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +5 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +1 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +296 -0
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -0
- package/dist/cache/index.d.ts +12 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +9 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/client/CachedWordPressClient.d.ts +160 -0
- package/dist/client/CachedWordPressClient.d.ts.map +1 -0
- package/dist/client/CachedWordPressClient.js +338 -0
- package/dist/client/CachedWordPressClient.js.map +1 -0
- package/dist/client/WordPressClient.d.ts +81 -0
- package/dist/client/WordPressClient.d.ts.map +1 -0
- package/dist/client/WordPressClient.js +354 -0
- package/dist/client/WordPressClient.js.map +1 -0
- package/dist/config/ConfigurationSchema.d.ts +281 -0
- package/dist/config/ConfigurationSchema.d.ts.map +1 -0
- package/dist/config/ConfigurationSchema.js +205 -0
- package/dist/config/ConfigurationSchema.js.map +1 -0
- package/dist/config/ServerConfiguration.d.ts +38 -0
- package/dist/config/ServerConfiguration.d.ts.map +1 -0
- package/dist/config/ServerConfiguration.js +158 -0
- package/dist/config/ServerConfiguration.js.map +1 -0
- package/dist/docs/DocumentationGenerator.d.ts +184 -0
- package/dist/docs/DocumentationGenerator.d.ts.map +1 -0
- package/dist/docs/DocumentationGenerator.js +735 -0
- package/dist/docs/DocumentationGenerator.js.map +1 -0
- package/dist/docs/MarkdownFormatter.d.ts +84 -0
- package/dist/docs/MarkdownFormatter.d.ts.map +1 -0
- package/dist/docs/MarkdownFormatter.js +448 -0
- package/dist/docs/MarkdownFormatter.js.map +1 -0
- package/dist/docs/index.d.ts +8 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +7 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -212
- package/dist/index.js.map +1 -1
- package/dist/performance/AnomalyDetector.d.ts +63 -0
- package/dist/performance/AnomalyDetector.d.ts.map +1 -0
- package/dist/performance/AnomalyDetector.js +222 -0
- package/dist/performance/AnomalyDetector.js.map +1 -0
- package/dist/performance/BenchmarkAnalyzer.d.ts +67 -0
- package/dist/performance/BenchmarkAnalyzer.d.ts.map +1 -0
- package/dist/performance/BenchmarkAnalyzer.js +301 -0
- package/dist/performance/BenchmarkAnalyzer.js.map +1 -0
- package/dist/performance/MetricsCollector.d.ts +139 -0
- package/dist/performance/MetricsCollector.d.ts.map +1 -0
- package/dist/performance/MetricsCollector.js +320 -0
- package/dist/performance/MetricsCollector.js.map +1 -0
- package/dist/performance/PerformanceAnalytics.d.ts +162 -0
- package/dist/performance/PerformanceAnalytics.d.ts.map +1 -0
- package/dist/performance/PerformanceAnalytics.js +554 -0
- package/dist/performance/PerformanceAnalytics.js.map +1 -0
- package/dist/performance/PerformanceMonitor.d.ts +202 -0
- package/dist/performance/PerformanceMonitor.d.ts.map +1 -0
- package/dist/performance/PerformanceMonitor.js +478 -0
- package/dist/performance/PerformanceMonitor.js.map +1 -0
- package/dist/performance/TrendAnalyzer.d.ts +69 -0
- package/dist/performance/TrendAnalyzer.d.ts.map +1 -0
- package/dist/performance/TrendAnalyzer.js +203 -0
- package/dist/performance/TrendAnalyzer.js.map +1 -0
- package/dist/performance/index.d.ts +11 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +8 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/security/InputValidator.d.ts +215 -0
- package/dist/security/InputValidator.d.ts.map +1 -0
- package/dist/security/InputValidator.js +278 -0
- package/dist/security/InputValidator.js.map +1 -0
- package/dist/security/SecurityConfig.d.ts +129 -0
- package/dist/security/SecurityConfig.d.ts.map +1 -0
- package/dist/security/SecurityConfig.js +262 -0
- package/dist/security/SecurityConfig.js.map +1 -0
- package/dist/server/ConnectionTester.d.ts +24 -0
- package/dist/server/ConnectionTester.d.ts.map +1 -0
- package/dist/server/ConnectionTester.js +61 -0
- package/dist/server/ConnectionTester.js.map +1 -0
- package/dist/server/ToolRegistry.d.ts +46 -0
- package/dist/server/ToolRegistry.d.ts.map +1 -0
- package/dist/server/ToolRegistry.js +148 -0
- package/dist/server/ToolRegistry.js.map +1 -0
- package/dist/tools/BaseToolClass.d.ts +76 -0
- package/dist/tools/BaseToolClass.d.ts.map +1 -0
- package/dist/tools/BaseToolClass.js +104 -0
- package/dist/tools/BaseToolClass.js.map +1 -0
- package/dist/tools/BaseToolManager.d.ts +26 -0
- package/dist/tools/BaseToolManager.d.ts.map +1 -0
- package/dist/tools/BaseToolManager.js +56 -0
- package/dist/tools/BaseToolManager.js.map +1 -0
- package/dist/tools/base.d.ts +37 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +60 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/cache.d.ts +260 -0
- package/dist/tools/cache.d.ts.map +1 -0
- package/dist/tools/cache.js +237 -0
- package/dist/tools/cache.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/performance.d.ts +63 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +865 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/types/client.d.ts +1 -0
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.js.map +1 -1
- package/dist/utils/toolWrapper.d.ts +4 -0
- package/dist/utils/toolWrapper.d.ts.map +1 -1
- package/dist/utils/toolWrapper.js +11 -0
- package/dist/utils/toolWrapper.js.map +1 -1
- package/dist/utils/validation.d.ts +68 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +185 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/CACHING.md +340 -0
- package/docs/DOCKER.md +451 -0
- package/docs/PERFORMANCE_MONITORING.md +471 -0
- package/docs/SECURITY_TESTING.md +393 -0
- package/docs/api/README.md +200 -0
- package/docs/api/categories/auth.md +40 -0
- package/docs/api/categories/cache.md +41 -0
- package/docs/api/categories/comment.md +44 -0
- package/docs/api/categories/media.md +43 -0
- package/docs/api/categories/page.md +43 -0
- package/docs/api/categories/performance.md +44 -0
- package/docs/api/categories/post.md +43 -0
- package/docs/api/categories/site.md +43 -0
- package/docs/api/categories/taxonomy.md +47 -0
- package/docs/api/categories/user.md +43 -0
- package/docs/api/openapi.json +3305 -0
- package/docs/api/summary.json +12 -0
- package/docs/api/tools/wp_approve_comment.md +98 -0
- package/docs/api/tools/wp_cache_clear.md +120 -0
- package/docs/api/tools/wp_cache_info.md +119 -0
- package/docs/api/tools/wp_cache_stats.md +119 -0
- package/docs/api/tools/wp_cache_warm.md +119 -0
- package/docs/api/tools/wp_create_application_password.md +102 -0
- package/docs/api/tools/wp_create_category.md +102 -0
- package/docs/api/tools/wp_create_comment.md +128 -0
- package/docs/api/tools/wp_create_page.md +135 -0
- package/docs/api/tools/wp_create_post.md +147 -0
- package/docs/api/tools/wp_create_tag.md +101 -0
- package/docs/api/tools/wp_create_user.md +135 -0
- package/docs/api/tools/wp_delete_application_password.md +101 -0
- package/docs/api/tools/wp_delete_category.md +100 -0
- package/docs/api/tools/wp_delete_comment.md +101 -0
- package/docs/api/tools/wp_delete_media.md +108 -0
- package/docs/api/tools/wp_delete_page.md +108 -0
- package/docs/api/tools/wp_delete_post.md +117 -0
- package/docs/api/tools/wp_delete_tag.md +100 -0
- package/docs/api/tools/wp_delete_user.md +108 -0
- package/docs/api/tools/wp_get_application_passwords.md +103 -0
- package/docs/api/tools/wp_get_auth_status.md +101 -0
- package/docs/api/tools/wp_get_category.md +103 -0
- package/docs/api/tools/wp_get_comment.md +103 -0
- package/docs/api/tools/wp_get_current_user.md +101 -0
- package/docs/api/tools/wp_get_media.md +103 -0
- package/docs/api/tools/wp_get_page.md +103 -0
- package/docs/api/tools/wp_get_page_revisions.md +103 -0
- package/docs/api/tools/wp_get_post.md +112 -0
- package/docs/api/tools/wp_get_post_revisions.md +103 -0
- package/docs/api/tools/wp_get_site_settings.md +108 -0
- package/docs/api/tools/wp_get_tag.md +103 -0
- package/docs/api/tools/wp_get_user.md +103 -0
- package/docs/api/tools/wp_list_categories.md +111 -0
- package/docs/api/tools/wp_list_comments.md +111 -0
- package/docs/api/tools/wp_list_media.md +145 -0
- package/docs/api/tools/wp_list_pages.md +145 -0
- package/docs/api/tools/wp_list_posts.md +156 -0
- package/docs/api/tools/wp_list_tags.md +110 -0
- package/docs/api/tools/wp_list_users.md +111 -0
- package/docs/api/tools/wp_performance_alerts.md +162 -0
- package/docs/api/tools/wp_performance_benchmark.md +160 -0
- package/docs/api/tools/wp_performance_export.md +162 -0
- package/docs/api/tools/wp_performance_history.md +161 -0
- package/docs/api/tools/wp_performance_optimize.md +162 -0
- package/docs/api/tools/wp_performance_stats.md +160 -0
- package/docs/api/tools/wp_search_site.md +99 -0
- package/docs/api/tools/wp_spam_comment.md +98 -0
- package/docs/api/tools/wp_switch_auth_method.md +122 -0
- package/docs/api/tools/wp_test_auth.md +96 -0
- package/docs/api/tools/wp_update_category.md +102 -0
- package/docs/api/tools/wp_update_comment.md +127 -0
- package/docs/api/tools/wp_update_media.md +129 -0
- package/docs/api/tools/wp_update_page.md +135 -0
- package/docs/api/tools/wp_update_post.md +144 -0
- package/docs/api/tools/wp_update_site_settings.md +127 -0
- package/docs/api/tools/wp_update_tag.md +102 -0
- package/docs/api/tools/wp_update_user.md +134 -0
- package/docs/api/tools/wp_upload_media.md +131 -0
- package/docs/api/types/WordPressPost.md +39 -0
- package/docs/contract-testing.md +183 -0
- package/docs/developer/NPM_AUTH_SETUP.md +3 -3
- package/docs/wordpress-rest-api-authentication-troubleshooting.md +218 -0
- package/package.json +84 -64
- package/src/cache/CacheInvalidation.ts +421 -0
- package/src/cache/CacheManager.ts +391 -0
- package/src/cache/HttpCacheWrapper.ts +372 -0
- package/src/cache/__tests__/CacheInvalidation.test.ts +299 -0
- package/src/cache/__tests__/CacheManager.test.ts +300 -0
- package/src/cache/__tests__/CachedWordPressClient.test.ts +304 -0
- package/src/cache/__tests__/HttpCacheWrapper.test.ts +359 -0
- package/src/cache/index.ts +26 -0
- package/src/client/CachedWordPressClient.ts +442 -0
- package/src/config/ConfigurationSchema.ts +246 -0
- package/src/config/ServerConfiguration.ts +215 -0
- package/src/docs/DocumentationGenerator.ts +952 -0
- package/src/docs/MarkdownFormatter.ts +494 -0
- package/src/docs/index.ts +21 -0
- package/src/index.ts +14 -274
- package/src/performance/MetricsCollector.ts +447 -0
- package/src/performance/PerformanceAnalytics.ts +762 -0
- package/src/performance/PerformanceMonitor.ts +649 -0
- package/src/performance/index.ts +28 -0
- package/src/security/InputValidator.ts +319 -0
- package/src/security/SecurityConfig.ts +301 -0
- package/src/server/ConnectionTester.ts +74 -0
- package/src/server/ToolRegistry.ts +194 -0
- package/src/tools/BaseToolManager.ts +66 -0
- package/src/tools/cache.ts +259 -0
- package/src/tools/index.ts +2 -0
- package/src/tools/performance.ts +948 -0
- package/src/types/client.ts +1 -0
- package/src/utils/toolWrapper.ts +11 -0
- package/src/utils/validation.ts +259 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive Input Validation and Sanitization System
|
|
3
|
+
* Provides security-focused validation for all MCP tool inputs
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// Common validation patterns
|
|
7
|
+
const URL_PATTERN = /^https?:\/\/[^\s<>'"{}|\\^`\[\]]+$/;
|
|
8
|
+
const EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
9
|
+
const SLUG_PATTERN = /^[a-z0-9-]+$/;
|
|
10
|
+
const SCRIPT_PATTERN = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
|
|
11
|
+
const SQL_INJECTION_PATTERN = /('|(\\')|(;)|(\\x00)|(\\n)|(\\r)|(\\x1a)|(\\x22)|(\\x27)|(\\x5c)|(\\x60))/i;
|
|
12
|
+
/**
|
|
13
|
+
* Security validation schemas
|
|
14
|
+
*/
|
|
15
|
+
export const SecuritySchemas = {
|
|
16
|
+
// Safe string with XSS protection
|
|
17
|
+
safeString: z.string()
|
|
18
|
+
.max(10000, 'String too long')
|
|
19
|
+
.refine(val => !SCRIPT_PATTERN.test(val), 'Script tags not allowed')
|
|
20
|
+
.refine(val => !val.includes('javascript:'), 'JavaScript URLs not allowed')
|
|
21
|
+
.refine(val => !val.includes('data:'), 'Data URLs not allowed')
|
|
22
|
+
.refine(val => !val.includes('onerror='), 'Event handlers not allowed')
|
|
23
|
+
.refine(val => !val.includes('onload='), 'Event handlers not allowed')
|
|
24
|
+
.refine(val => !val.includes('onfocus='), 'Event handlers not allowed'),
|
|
25
|
+
// HTML content with basic sanitization
|
|
26
|
+
htmlContent: z.string()
|
|
27
|
+
.max(100000, 'Content too long')
|
|
28
|
+
.refine(val => !SCRIPT_PATTERN.test(val), 'Script tags not allowed')
|
|
29
|
+
.refine(val => !val.includes('javascript:'), 'JavaScript URLs not allowed')
|
|
30
|
+
.refine(val => !val.includes('on[a-z]+='), 'Event handlers not allowed'),
|
|
31
|
+
// URL validation
|
|
32
|
+
url: z.string()
|
|
33
|
+
.url('Invalid URL format')
|
|
34
|
+
.regex(URL_PATTERN, 'URL contains invalid characters')
|
|
35
|
+
.refine(val => !val.includes('javascript:'), 'JavaScript URLs not allowed')
|
|
36
|
+
.refine(val => !val.includes('data:'), 'Data URLs not allowed'),
|
|
37
|
+
// Email validation
|
|
38
|
+
email: z.string()
|
|
39
|
+
.email('Invalid email format')
|
|
40
|
+
.regex(EMAIL_PATTERN, 'Email contains invalid characters')
|
|
41
|
+
.max(254, 'Email too long'),
|
|
42
|
+
// Slug validation (for URLs, usernames, etc.)
|
|
43
|
+
slug: z.string()
|
|
44
|
+
.min(1, 'Slug cannot be empty')
|
|
45
|
+
.max(100, 'Slug too long')
|
|
46
|
+
.regex(SLUG_PATTERN, 'Slug can only contain lowercase letters, numbers, and hyphens'),
|
|
47
|
+
// WordPress post/page content
|
|
48
|
+
wpContent: z.string()
|
|
49
|
+
.max(1000000, 'Content too long')
|
|
50
|
+
.refine(val => !SCRIPT_PATTERN.test(val), 'Script tags not allowed in content')
|
|
51
|
+
.refine(val => !val.includes('javascript:'), 'JavaScript URLs not allowed'),
|
|
52
|
+
// Site ID validation
|
|
53
|
+
siteId: z.string()
|
|
54
|
+
.min(1, 'Site ID cannot be empty')
|
|
55
|
+
.max(50, 'Site ID too long')
|
|
56
|
+
.regex(/^[a-zA-Z0-9\-_]+$/, 'Site ID can only contain letters, numbers, hyphens, and underscores'),
|
|
57
|
+
// WordPress ID (numeric)
|
|
58
|
+
wpId: z.number()
|
|
59
|
+
.int('ID must be an integer')
|
|
60
|
+
.positive('ID must be positive')
|
|
61
|
+
.max(999999999, 'ID too large'),
|
|
62
|
+
// Search query with SQL injection protection
|
|
63
|
+
searchQuery: z.string()
|
|
64
|
+
.max(500, 'Search query too long')
|
|
65
|
+
.refine(val => !SQL_INJECTION_PATTERN.test(val), 'Invalid characters in search query')
|
|
66
|
+
.refine(val => !val.includes('--'), 'SQL comments not allowed')
|
|
67
|
+
.refine(val => !val.includes('/*'), 'SQL comments not allowed'),
|
|
68
|
+
// File path validation
|
|
69
|
+
filePath: z.string()
|
|
70
|
+
.max(500, 'File path too long')
|
|
71
|
+
.refine(val => !val.includes('..'), 'Path traversal not allowed')
|
|
72
|
+
.refine(val => !val.includes('<'), 'Invalid characters in path')
|
|
73
|
+
.refine(val => !val.includes('>'), 'Invalid characters in path'),
|
|
74
|
+
// Password (for display/logging - never log actual passwords)
|
|
75
|
+
passwordMask: z.string()
|
|
76
|
+
.transform(() => '[REDACTED]'),
|
|
77
|
+
// WordPress application password format
|
|
78
|
+
appPassword: z.string()
|
|
79
|
+
.regex(/^[a-zA-Z0-9\s]{24}$/, 'Invalid application password format')
|
|
80
|
+
.transform(val => val.replace(/\s/g, ' ')) // Normalize spaces
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Input sanitization functions
|
|
84
|
+
*/
|
|
85
|
+
export class InputSanitizer {
|
|
86
|
+
/**
|
|
87
|
+
* Sanitize HTML content by removing dangerous elements
|
|
88
|
+
*/
|
|
89
|
+
static sanitizeHtml(input) {
|
|
90
|
+
return input
|
|
91
|
+
.replace(SCRIPT_PATTERN, '') // Remove script tags
|
|
92
|
+
.replace(/javascript:/gi, '') // Remove javascript: URLs
|
|
93
|
+
.replace(/data:/gi, '') // Remove data: URLs
|
|
94
|
+
.replace(/on[a-z]+\s*=/gi, '') // Remove event handlers
|
|
95
|
+
.replace(/<iframe[^>]*>/gi, '') // Remove iframes
|
|
96
|
+
.replace(/<object[^>]*>/gi, '') // Remove objects
|
|
97
|
+
.replace(/<embed[^>]*>/gi, ''); // Remove embeds
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Sanitize search queries to prevent SQL injection
|
|
101
|
+
*/
|
|
102
|
+
static sanitizeSearchQuery(query) {
|
|
103
|
+
return query
|
|
104
|
+
.replace(/['"\\;]/g, '') // Remove quotes and backslashes
|
|
105
|
+
.replace(/--/g, '') // Remove SQL comments
|
|
106
|
+
.replace(/\/\*/g, '') // Remove SQL comments
|
|
107
|
+
.replace(/\*/g, '') // Remove wildcards
|
|
108
|
+
.trim()
|
|
109
|
+
.substring(0, 500); // Limit length
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Sanitize file paths to prevent directory traversal
|
|
113
|
+
*/
|
|
114
|
+
static sanitizeFilePath(path) {
|
|
115
|
+
return path
|
|
116
|
+
.replace(/\.\./g, '') // Remove directory traversal
|
|
117
|
+
.replace(/[<>]/g, '') // Remove angle brackets
|
|
118
|
+
.replace(/[|&;$`\\]/g, '') // Remove shell metacharacters
|
|
119
|
+
.trim();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Encode output for safe display
|
|
123
|
+
*/
|
|
124
|
+
static encodeOutput(input) {
|
|
125
|
+
return input
|
|
126
|
+
.replace(/&/g, '&')
|
|
127
|
+
.replace(/</g, '<')
|
|
128
|
+
.replace(/>/g, '>')
|
|
129
|
+
.replace(/"/g, '"')
|
|
130
|
+
.replace(/'/g, ''');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Security validation decorator for tool methods
|
|
135
|
+
*/
|
|
136
|
+
export function validateSecurity(schema) {
|
|
137
|
+
return function (target, propertyName, descriptor) {
|
|
138
|
+
const method = descriptor.value;
|
|
139
|
+
descriptor.value = async function (...args) {
|
|
140
|
+
try {
|
|
141
|
+
// Validate input parameters
|
|
142
|
+
const params = args[0] || {};
|
|
143
|
+
const validatedParams = schema.parse(params);
|
|
144
|
+
// Log security validation (without sensitive data)
|
|
145
|
+
console.log(`Security validation passed for ${propertyName}`, {
|
|
146
|
+
timestamp: new Date().toISOString(),
|
|
147
|
+
method: propertyName,
|
|
148
|
+
paramCount: Object.keys(validatedParams).length
|
|
149
|
+
});
|
|
150
|
+
// Call original method with validated params
|
|
151
|
+
return await method.call(this, validatedParams, ...args.slice(1));
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
// Log security validation failure
|
|
155
|
+
console.error(`Security validation failed for ${propertyName}`, {
|
|
156
|
+
timestamp: new Date().toISOString(),
|
|
157
|
+
method: propertyName,
|
|
158
|
+
error: error instanceof z.ZodError ? error.errors : (error instanceof Error ? error.message : String(error))
|
|
159
|
+
});
|
|
160
|
+
throw new SecurityValidationError(`Security validation failed for ${propertyName}`, error instanceof z.ZodError ? error.errors : [{ message: error instanceof Error ? error.message : String(error) }]);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
return descriptor;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Custom security validation error
|
|
168
|
+
*/
|
|
169
|
+
export class SecurityValidationError extends Error {
|
|
170
|
+
errors;
|
|
171
|
+
constructor(message, errors = []) {
|
|
172
|
+
super(message);
|
|
173
|
+
this.name = 'SecurityValidationError';
|
|
174
|
+
this.errors = errors;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Tool-specific validation schemas
|
|
179
|
+
*/
|
|
180
|
+
export const ToolSchemas = {
|
|
181
|
+
// Post creation/update
|
|
182
|
+
postData: z.object({
|
|
183
|
+
site: SecuritySchemas.siteId.optional(),
|
|
184
|
+
title: SecuritySchemas.safeString.optional(),
|
|
185
|
+
content: SecuritySchemas.wpContent.optional(),
|
|
186
|
+
excerpt: SecuritySchemas.safeString.optional(),
|
|
187
|
+
status: z.enum(['publish', 'draft', 'private', 'pending']).optional(),
|
|
188
|
+
slug: SecuritySchemas.slug.optional(),
|
|
189
|
+
categories: z.array(SecuritySchemas.wpId).optional(),
|
|
190
|
+
tags: z.array(SecuritySchemas.wpId).optional()
|
|
191
|
+
}),
|
|
192
|
+
// User creation/update
|
|
193
|
+
userData: z.object({
|
|
194
|
+
site: SecuritySchemas.siteId.optional(),
|
|
195
|
+
username: SecuritySchemas.slug,
|
|
196
|
+
email: SecuritySchemas.email,
|
|
197
|
+
password: SecuritySchemas.safeString.optional(),
|
|
198
|
+
roles: z.array(z.string()).optional(),
|
|
199
|
+
firstName: SecuritySchemas.safeString.optional(),
|
|
200
|
+
lastName: SecuritySchemas.safeString.optional()
|
|
201
|
+
}),
|
|
202
|
+
// Search parameters
|
|
203
|
+
searchParams: z.object({
|
|
204
|
+
site: SecuritySchemas.siteId.optional(),
|
|
205
|
+
query: SecuritySchemas.searchQuery,
|
|
206
|
+
type: z.enum(['post', 'page', 'any']).optional(),
|
|
207
|
+
limit: z.number().int().min(1).max(100).optional()
|
|
208
|
+
}),
|
|
209
|
+
// Media upload
|
|
210
|
+
mediaUpload: z.object({
|
|
211
|
+
site: SecuritySchemas.siteId.optional(),
|
|
212
|
+
filename: SecuritySchemas.filePath,
|
|
213
|
+
title: SecuritySchemas.safeString.optional(),
|
|
214
|
+
caption: SecuritySchemas.safeString.optional(),
|
|
215
|
+
description: SecuritySchemas.safeString.optional()
|
|
216
|
+
}),
|
|
217
|
+
// Site settings
|
|
218
|
+
siteSettings: z.object({
|
|
219
|
+
site: SecuritySchemas.siteId.optional(),
|
|
220
|
+
title: SecuritySchemas.safeString.optional(),
|
|
221
|
+
description: SecuritySchemas.safeString.optional(),
|
|
222
|
+
url: SecuritySchemas.url.optional(),
|
|
223
|
+
adminEmail: SecuritySchemas.email.optional()
|
|
224
|
+
}),
|
|
225
|
+
// Generic list parameters
|
|
226
|
+
listParams: z.object({
|
|
227
|
+
site: SecuritySchemas.siteId.optional(),
|
|
228
|
+
page: z.number().int().min(1).max(1000).optional(),
|
|
229
|
+
perPage: z.number().int().min(1).max(100).optional(),
|
|
230
|
+
search: SecuritySchemas.searchQuery.optional(),
|
|
231
|
+
orderBy: z.string().max(50).optional(),
|
|
232
|
+
order: z.enum(['asc', 'desc']).optional()
|
|
233
|
+
}),
|
|
234
|
+
// ID-based operations
|
|
235
|
+
idParams: z.object({
|
|
236
|
+
site: SecuritySchemas.siteId.optional(),
|
|
237
|
+
id: SecuritySchemas.wpId
|
|
238
|
+
})
|
|
239
|
+
};
|
|
240
|
+
/**
|
|
241
|
+
* Rate limiting and DoS protection
|
|
242
|
+
*/
|
|
243
|
+
export class SecurityLimiter {
|
|
244
|
+
static requestCounts = new Map();
|
|
245
|
+
static RATE_LIMIT = 1000; // requests per window
|
|
246
|
+
static WINDOW_MS = 60 * 1000; // 1 minute
|
|
247
|
+
/**
|
|
248
|
+
* Check if request is within rate limits
|
|
249
|
+
*/
|
|
250
|
+
static checkRateLimit(identifier) {
|
|
251
|
+
const now = Date.now();
|
|
252
|
+
const key = identifier;
|
|
253
|
+
const current = this.requestCounts.get(key);
|
|
254
|
+
if (!current || now > current.resetTime) {
|
|
255
|
+
this.requestCounts.set(key, { count: 1, resetTime: now + this.WINDOW_MS });
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
if (current.count >= this.RATE_LIMIT) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
current.count++;
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Clean up expired rate limit entries
|
|
266
|
+
*/
|
|
267
|
+
static cleanup() {
|
|
268
|
+
const now = Date.now();
|
|
269
|
+
for (const [key, data] of this.requestCounts.entries()) {
|
|
270
|
+
if (now > data.resetTime) {
|
|
271
|
+
this.requestCounts.delete(key);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Start cleanup interval
|
|
277
|
+
setInterval(() => SecurityLimiter.cleanup(), 60000); // Clean up every minute
|
|
278
|
+
//# sourceMappingURL=InputValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputValidator.js","sourceRoot":"","sources":["../../src/security/InputValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security configuration and constants for MCP WordPress
|
|
3
|
+
*/
|
|
4
|
+
export declare const SecurityConfig: {
|
|
5
|
+
rateLimiting: {
|
|
6
|
+
default: {
|
|
7
|
+
windowMs: number;
|
|
8
|
+
maxRequests: number;
|
|
9
|
+
};
|
|
10
|
+
authentication: {
|
|
11
|
+
windowMs: number;
|
|
12
|
+
maxAttempts: number;
|
|
13
|
+
};
|
|
14
|
+
upload: {
|
|
15
|
+
windowMs: number;
|
|
16
|
+
maxRequests: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
fileUpload: {
|
|
20
|
+
maxSizeMB: number;
|
|
21
|
+
allowedMimeTypes: string[];
|
|
22
|
+
blockedExtensions: string[];
|
|
23
|
+
};
|
|
24
|
+
validation: {
|
|
25
|
+
maxStringLength: number;
|
|
26
|
+
maxTitleLength: number;
|
|
27
|
+
maxContentLength: number;
|
|
28
|
+
maxExcerptLength: number;
|
|
29
|
+
maxUrlLength: number;
|
|
30
|
+
maxUsernameLength: number;
|
|
31
|
+
minUsernameLength: number;
|
|
32
|
+
maxPasswordLength: number;
|
|
33
|
+
minPasswordLength: number;
|
|
34
|
+
};
|
|
35
|
+
timeouts: {
|
|
36
|
+
default: number;
|
|
37
|
+
upload: number;
|
|
38
|
+
auth: number;
|
|
39
|
+
};
|
|
40
|
+
headers: {
|
|
41
|
+
'X-Content-Type-Options': string;
|
|
42
|
+
'X-Frame-Options': string;
|
|
43
|
+
'X-XSS-Protection': string;
|
|
44
|
+
'Strict-Transport-Security': string;
|
|
45
|
+
'Content-Security-Policy': string;
|
|
46
|
+
};
|
|
47
|
+
errorMessages: {
|
|
48
|
+
authentication: string;
|
|
49
|
+
authorization: string;
|
|
50
|
+
validation: string;
|
|
51
|
+
rateLimit: string;
|
|
52
|
+
serverError: string;
|
|
53
|
+
notFound: string;
|
|
54
|
+
};
|
|
55
|
+
logging: {
|
|
56
|
+
excludeFields: string[];
|
|
57
|
+
redactPatterns: RegExp[];
|
|
58
|
+
};
|
|
59
|
+
cache: {
|
|
60
|
+
enabled: boolean;
|
|
61
|
+
maxSize: number;
|
|
62
|
+
defaultTTL: number;
|
|
63
|
+
enableLRU: boolean;
|
|
64
|
+
enableStats: boolean;
|
|
65
|
+
ttlPresets: {
|
|
66
|
+
static: number;
|
|
67
|
+
semiStatic: number;
|
|
68
|
+
dynamic: number;
|
|
69
|
+
session: number;
|
|
70
|
+
realtime: number;
|
|
71
|
+
};
|
|
72
|
+
cacheHeaders: {
|
|
73
|
+
static: string;
|
|
74
|
+
semiStatic: string;
|
|
75
|
+
dynamic: string;
|
|
76
|
+
session: string;
|
|
77
|
+
realtime: string;
|
|
78
|
+
};
|
|
79
|
+
invalidation: {
|
|
80
|
+
enabled: boolean;
|
|
81
|
+
batchSize: number;
|
|
82
|
+
queueTimeout: number;
|
|
83
|
+
enableCascading: boolean;
|
|
84
|
+
};
|
|
85
|
+
cleanup: {
|
|
86
|
+
interval: number;
|
|
87
|
+
maxMemoryMB: number;
|
|
88
|
+
evictionThreshold: number;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Security utility functions
|
|
94
|
+
*/
|
|
95
|
+
export declare class SecurityUtils {
|
|
96
|
+
/**
|
|
97
|
+
* Redact sensitive information from objects
|
|
98
|
+
*/
|
|
99
|
+
static redactSensitiveData(obj: any): any;
|
|
100
|
+
/**
|
|
101
|
+
* Redact sensitive patterns from strings
|
|
102
|
+
*/
|
|
103
|
+
static redactString(str: string): string;
|
|
104
|
+
/**
|
|
105
|
+
* Generate secure random strings
|
|
106
|
+
*/
|
|
107
|
+
static generateSecureToken(length?: number): string;
|
|
108
|
+
/**
|
|
109
|
+
* Check if a file extension is allowed
|
|
110
|
+
*/
|
|
111
|
+
static isFileExtensionAllowed(filename: string): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Sanitize log output
|
|
114
|
+
*/
|
|
115
|
+
static sanitizeForLog(data: any): any;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Secure error handler that prevents information disclosure
|
|
119
|
+
*/
|
|
120
|
+
export declare function createSecureError(error: any, fallbackMessage?: string): Error;
|
|
121
|
+
/**
|
|
122
|
+
* Environment-specific security settings
|
|
123
|
+
*/
|
|
124
|
+
export declare function getEnvironmentSecurity(): {
|
|
125
|
+
strictMode: boolean;
|
|
126
|
+
verboseErrors: boolean;
|
|
127
|
+
enforceHttps: boolean;
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=SecurityConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityConfig.d.ts","sourceRoot":"","sources":["../../src/security/SecurityConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwK1B,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAsBzC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAUxC;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM;IAgBvD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKxD;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG;CAStC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,GAAG,EACV,eAAe,GAAE,MAAiD,GACjE,KAAK,CAeP;AAKD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI;IACxC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACrB,CAQF"}
|