@unchainedshop/api 3.1.12 → 3.1.13
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/lib/errors.d.ts +1 -0
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +1 -0
- package/lib/errors.js.map +1 -1
- package/lib/express/chatRouter.d.ts +3 -0
- package/lib/express/chatRouter.d.ts.map +1 -0
- package/lib/express/chatRouter.js +86 -0
- package/lib/express/chatRouter.js.map +1 -0
- package/lib/express/createApolloMiddleware.d.ts +4 -0
- package/lib/express/createApolloMiddleware.d.ts.map +1 -0
- package/lib/express/createApolloMiddleware.js +36 -0
- package/lib/express/createApolloMiddleware.js.map +1 -0
- package/lib/express/createSingleSignOnMiddleware.d.ts +5 -0
- package/lib/express/createSingleSignOnMiddleware.d.ts.map +1 -0
- package/lib/express/createSingleSignOnMiddleware.js +71 -0
- package/lib/express/createSingleSignOnMiddleware.js.map +1 -0
- package/lib/hashPassword.d.ts +2 -0
- package/lib/hashPassword.d.ts.map +1 -0
- package/lib/hashPassword.js +5 -0
- package/lib/hashPassword.js.map +1 -0
- package/lib/loaders/assortmentMediaTextLoader.js +1 -1
- package/lib/loaders/assortmentMediaTextLoader.js.map +1 -1
- package/lib/loaders/assortmentTextLoader.js +1 -1
- package/lib/loaders/assortmentTextLoader.js.map +1 -1
- package/lib/loaders/filterTextLoader.js +1 -1
- package/lib/loaders/filterTextLoader.js.map +1 -1
- package/lib/loaders/index.d.ts.map +1 -1
- package/lib/loaders/index.js.map +1 -1
- package/lib/loaders/productMediaTextLoader.d.ts.map +1 -1
- package/lib/loaders/productMediaTextLoader.js +1 -1
- package/lib/loaders/productMediaTextLoader.js.map +1 -1
- package/lib/loaders/productTextLoader.d.ts.map +1 -1
- package/lib/loaders/productTextLoader.js +1 -1
- package/lib/loaders/productTextLoader.js.map +1 -1
- package/lib/mcp/index.d.ts.map +1 -1
- package/lib/mcp/index.js +1 -1
- package/lib/mcp/index.js.map +1 -1
- package/lib/mcp/tools/addProductAssignmentHandler.d.ts +52 -0
- package/lib/mcp/tools/addProductAssignmentHandler.d.ts.map +1 -0
- package/lib/mcp/tools/addProductAssignmentHandler.js +97 -0
- package/lib/mcp/tools/addProductAssignmentHandler.js.map +1 -0
- package/lib/mcp/tools/countriesHandler.d.ts +60 -0
- package/lib/mcp/tools/countriesHandler.d.ts.map +1 -0
- package/lib/mcp/tools/countriesHandler.js +48 -0
- package/lib/mcp/tools/countriesHandler.js.map +1 -0
- package/lib/mcp/tools/countryHandler.d.ts +20 -0
- package/lib/mcp/tools/countryHandler.d.ts.map +1 -0
- package/lib/mcp/tools/countryHandler.js +34 -0
- package/lib/mcp/tools/countryHandler.js.map +1 -0
- package/lib/mcp/tools/createProduct.d.ts +138 -0
- package/lib/mcp/tools/createProduct.d.ts.map +1 -0
- package/lib/mcp/tools/createProduct.js +60 -0
- package/lib/mcp/tools/createProduct.js.map +1 -0
- package/lib/mcp/tools/createProductVariationHandler.d.ts +84 -0
- package/lib/mcp/tools/createProductVariationHandler.d.ts.map +1 -0
- package/lib/mcp/tools/createProductVariationHandler.js +67 -0
- package/lib/mcp/tools/createProductVariationHandler.js.map +1 -0
- package/lib/mcp/tools/currenciesHandler.d.ts +60 -0
- package/lib/mcp/tools/currenciesHandler.d.ts.map +1 -0
- package/lib/mcp/tools/currenciesHandler.js +50 -0
- package/lib/mcp/tools/currenciesHandler.js.map +1 -0
- package/lib/mcp/tools/currencyHandler.d.ts +20 -0
- package/lib/mcp/tools/currencyHandler.d.ts.map +1 -0
- package/lib/mcp/tools/currencyHandler.js +34 -0
- package/lib/mcp/tools/currencyHandler.js.map +1 -0
- package/lib/mcp/tools/getProduct.d.ts +0 -3
- package/lib/mcp/tools/getProduct.d.ts.map +1 -1
- package/lib/mcp/tools/getProduct.js +0 -324
- package/lib/mcp/tools/getProduct.js.map +1 -1
- package/lib/mcp/tools/languageHandler.d.ts +20 -0
- package/lib/mcp/tools/languageHandler.d.ts.map +1 -0
- package/lib/mcp/tools/languageHandler.js +31 -0
- package/lib/mcp/tools/languageHandler.js.map +1 -0
- package/lib/mcp/tools/languagesHandler.d.ts +60 -0
- package/lib/mcp/tools/languagesHandler.d.ts.map +1 -0
- package/lib/mcp/tools/languagesHandler.js +42 -0
- package/lib/mcp/tools/languagesHandler.js.map +1 -0
- package/lib/mcp/tools/listProducts.d.ts.map +1 -1
- package/lib/mcp/tools/listProducts.js +0 -13
- package/lib/mcp/tools/listProducts.js.map +1 -1
- package/lib/mcp/tools/normalizeMediaUrl.d.ts +3 -0
- package/lib/mcp/tools/normalizeMediaUrl.d.ts.map +1 -0
- package/lib/mcp/tools/normalizeMediaUrl.js +21 -0
- package/lib/mcp/tools/normalizeMediaUrl.js.map +1 -0
- package/lib/mcp/tools/productsCountHandler.d.ts +32 -0
- package/lib/mcp/tools/productsCountHandler.d.ts.map +1 -0
- package/lib/mcp/tools/productsCountHandler.js +33 -0
- package/lib/mcp/tools/productsCountHandler.js.map +1 -0
- package/lib/mcp/tools/publishProduct.d.ts +20 -0
- package/lib/mcp/tools/publishProduct.d.ts.map +1 -0
- package/lib/mcp/tools/publishProduct.js +40 -0
- package/lib/mcp/tools/publishProduct.js.map +1 -0
- package/lib/mcp/tools/removeProduct.d.ts +20 -0
- package/lib/mcp/tools/removeProduct.d.ts.map +1 -0
- package/lib/mcp/tools/removeProduct.js +34 -0
- package/lib/mcp/tools/removeProduct.js.map +1 -0
- package/lib/mcp/tools/removeProductVariationHandler.d.ts +20 -0
- package/lib/mcp/tools/removeProductVariationHandler.d.ts.map +1 -0
- package/lib/mcp/tools/removeProductVariationHandler.js +43 -0
- package/lib/mcp/tools/removeProductVariationHandler.js.map +1 -0
- package/lib/mcp/tools/unPublishProduct.d.ts +20 -0
- package/lib/mcp/tools/unPublishProduct.d.ts.map +1 -0
- package/lib/mcp/tools/unPublishProduct.js +40 -0
- package/lib/mcp/tools/unPublishProduct.js.map +1 -0
- package/lib/mcp/tools/updateProduct.d.ts +56 -0
- package/lib/mcp/tools/updateProduct.d.ts.map +1 -0
- package/lib/mcp/tools/updateProduct.js +44 -0
- package/lib/mcp/tools/updateProduct.js.map +1 -0
- package/lib/mcp/tools/updateProductCommerceHandler.d.ts +166 -0
- package/lib/mcp/tools/updateProductCommerceHandler.d.ts.map +1 -0
- package/lib/mcp/tools/updateProductCommerceHandler.js +64 -0
- package/lib/mcp/tools/updateProductCommerceHandler.js.map +1 -0
- package/lib/mcp/tools/updateProductPlanHandler.d.ts +72 -0
- package/lib/mcp/tools/updateProductPlanHandler.d.ts.map +1 -0
- package/lib/mcp/tools/updateProductPlanHandler.js +51 -0
- package/lib/mcp/tools/updateProductPlanHandler.js.map +1 -0
- package/lib/mcp/tools/updateProductSupplyHandler.d.ts +64 -0
- package/lib/mcp/tools/updateProductSupplyHandler.d.ts.map +1 -0
- package/lib/mcp/tools/updateProductSupplyHandler.js +52 -0
- package/lib/mcp/tools/updateProductSupplyHandler.js.map +1 -0
- package/lib/mcp/tools/updateProductTextsHandler.d.ts +114 -0
- package/lib/mcp/tools/updateProductTextsHandler.d.ts.map +1 -0
- package/lib/mcp/tools/updateProductTextsHandler.js +50 -0
- package/lib/mcp/tools/updateProductTextsHandler.js.map +1 -0
- package/lib/mcp/tools/updateProductTokenizationHandler.d.ts +72 -0
- package/lib/mcp/tools/updateProductTokenizationHandler.d.ts.map +1 -0
- package/lib/mcp/tools/updateProductTokenizationHandler.js +49 -0
- package/lib/mcp/tools/updateProductTokenizationHandler.js.map +1 -0
- package/lib/mcp/tools/updateProductWarehousingHandler.d.ts +48 -0
- package/lib/mcp/tools/updateProductWarehousingHandler.d.ts.map +1 -0
- package/lib/mcp/tools/updateProductWarehousingHandler.js +45 -0
- package/lib/mcp/tools/updateProductWarehousingHandler.js.map +1 -0
- package/lib/mcp/utils/getNormalizedProductDetails.d.ts +26 -0
- package/lib/mcp/utils/getNormalizedProductDetails.d.ts.map +1 -0
- package/lib/mcp/utils/getNormalizedProductDetails.js +36 -0
- package/lib/mcp/utils/getNormalizedProductDetails.js.map +1 -0
- package/lib/mcp/utils/normalizeMediaUrl.d.ts +3 -0
- package/lib/mcp/utils/normalizeMediaUrl.d.ts.map +1 -0
- package/lib/mcp/utils/normalizeMediaUrl.js +21 -0
- package/lib/mcp/utils/normalizeMediaUrl.js.map +1 -0
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.d.ts +3 -0
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.d.ts.map +1 -0
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.js +6 -0
- package/lib/resolvers/mutations/accounts/buildSecretTOTPAuthURL.js.map +1 -0
- package/lib/resolvers/mutations/accounts/disableTOTP.d.ts +6 -0
- package/lib/resolvers/mutations/accounts/disableTOTP.d.ts.map +1 -0
- package/lib/resolvers/mutations/accounts/disableTOTP.js +27 -0
- package/lib/resolvers/mutations/accounts/disableTOTP.js.map +1 -0
- package/lib/resolvers/mutations/accounts/enableTOTP.d.ts +6 -0
- package/lib/resolvers/mutations/accounts/enableTOTP.d.ts.map +1 -0
- package/lib/resolvers/mutations/accounts/enableTOTP.js +20 -0
- package/lib/resolvers/mutations/accounts/enableTOTP.js.map +1 -0
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.d.ts +7 -0
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.d.ts.map +1 -0
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.js +30 -0
- package/lib/resolvers/mutations/accounts/linkOAuthAccount.js.map +1 -0
- package/lib/resolvers/mutations/accounts/loginWithOAuth.d.ts +8 -0
- package/lib/resolvers/mutations/accounts/loginWithOAuth.d.ts.map +1 -0
- package/lib/resolvers/mutations/accounts/loginWithOAuth.js +25 -0
- package/lib/resolvers/mutations/accounts/loginWithOAuth.js.map +1 -0
- package/lib/resolvers/mutations/accounts/logoutAllSessions.d.ts +5 -0
- package/lib/resolvers/mutations/accounts/logoutAllSessions.d.ts.map +1 -0
- package/lib/resolvers/mutations/accounts/logoutAllSessions.js +20 -0
- package/lib/resolvers/mutations/accounts/logoutAllSessions.js.map +1 -0
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.d.ts +6 -0
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.d.ts.map +1 -0
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.js +13 -0
- package/lib/resolvers/mutations/accounts/unlinkOAuthAccount.js.map +1 -0
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.d.ts +6 -0
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.d.ts.map +1 -0
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.js +18 -0
- package/lib/resolvers/mutations/assortments/addAssortmentMedia.js.map +1 -0
- package/lib/resolvers/mutations/products/addProductAssignment.d.ts.map +1 -1
- package/lib/resolvers/mutations/products/addProductAssignment.js +3 -1
- package/lib/resolvers/mutations/products/addProductAssignment.js.map +1 -1
- package/lib/resolvers/mutations/products/addProductMedia.d.ts +6 -0
- package/lib/resolvers/mutations/products/addProductMedia.d.ts.map +1 -0
- package/lib/resolvers/mutations/products/addProductMedia.js +18 -0
- package/lib/resolvers/mutations/products/addProductMedia.js.map +1 -0
- package/lib/resolvers/mutations/users/updateUserAvatar.d.ts +6 -0
- package/lib/resolvers/mutations/users/updateUserAvatar.d.ts.map +1 -0
- package/lib/resolvers/mutations/users/updateUserAvatar.js +22 -0
- package/lib/resolvers/mutations/users/updateUserAvatar.js.map +1 -0
- package/lib/resolvers/mutations/utils/getOrderCart.d.ts +7 -0
- package/lib/resolvers/mutations/utils/getOrderCart.d.ts.map +1 -0
- package/lib/resolvers/mutations/utils/getOrderCart.js +13 -0
- package/lib/resolvers/mutations/utils/getOrderCart.js.map +1 -0
- package/lib/resolvers/type/dispatch-types.d.ts +15 -0
- package/lib/resolvers/type/dispatch-types.d.ts.map +1 -0
- package/lib/resolvers/type/dispatch-types.js +16 -0
- package/lib/resolvers/type/dispatch-types.js.map +1 -0
- package/lib/resolvers/type/oauth-account.d.ts +6 -0
- package/lib/resolvers/type/oauth-account.d.ts.map +1 -0
- package/lib/resolvers/type/oauth-account.js +7 -0
- package/lib/resolvers/type/oauth-account.js.map +1 -0
- package/lib/resolvers/type/oauth-provider.d.ts +6 -0
- package/lib/resolvers/type/oauth-provider.d.ts.map +1 -0
- package/lib/resolvers/type/oauth-provider.js +6 -0
- package/lib/resolvers/type/oauth-provider.js.map +1 -0
- package/lib/resolvers/type/stock-types.d.ts +14 -0
- package/lib/resolvers/type/stock-types.d.ts.map +1 -0
- package/lib/resolvers/type/stock-types.js +15 -0
- package/lib/resolvers/type/stock-types.js.map +1 -0
- package/lib/user-context.d.ts +7 -0
- package/lib/user-context.d.ts.map +1 -0
- package/lib/user-context.js +76 -0
- package/lib/user-context.js.map +1 -0
- package/package.json +13 -13
- package/src/errors.ts +5 -0
- package/src/loaders/buildLocaleMap.test.ts +14 -25
- package/src/loaders/buildLocaleMap.ts +1 -1
- package/src/loaders/buildTextMap.test.ts +9 -10
- package/src/loaders/index.ts +0 -1
- package/src/resolvers/mutations/products/addProductAssignment.ts +8 -1
- package/lib/express/mcpHandler.d.ts.map +0 -1
- package/lib/express/mcpHandler.js +0 -68
- package/lib/express/mcpHandler.js.map +0 -1
- package/lib/fastify/createMCPMiddleware.d.ts +0 -2
- package/lib/fastify/createMCPMiddleware.d.ts.map +0 -1
- package/lib/fastify/createMCPMiddleware.js +0 -2
- package/lib/fastify/createMCPMiddleware.js.map +0 -1
- package/lib/fastify/index copy.d.ts.map +0 -1
- package/lib/fastify/index copy.js +0 -157
- package/lib/fastify/index copy.js.map +0 -1
- package/lib/fastify/mcpHandler.d.ts +0 -8
- package/lib/fastify/mcpHandler.d.ts.map +0 -1
- package/lib/fastify/mcpHandler.js +0 -46
- package/lib/fastify/mcpHandler.js.map +0 -1
- package/lib/mcp/server.d.ts +0 -4
- package/lib/mcp/server.d.ts.map +0 -1
- package/lib/mcp/server.js +0 -60
- package/lib/mcp/server.js.map +0 -1
- package/lib/mcp/types.d.ts +0 -27
- package/lib/mcp/types.d.ts.map +0 -1
- package/lib/mcp/types.js +0 -5
- package/lib/mcp/types.js.map +0 -1
- package/lib/mcp/utils/html.d.ts +0 -16
- package/lib/mcp/utils/html.d.ts.map +0 -1
- package/lib/mcp/utils/html.js +0 -102
- package/lib/mcp/utils/html.js.map +0 -1
- package/lib/middleware/accountLockout.d.ts.map +0 -1
- package/lib/middleware/accountLockout.js +0 -84
- package/lib/middleware/accountLockout.js.map +0 -1
- package/lib/middleware/rateLimiter.d.ts.map +0 -1
- package/lib/middleware/rateLimiter.js +0 -91
- package/lib/middleware/rateLimiter.js.map +0 -1
- package/lib/plugins/inputValidation.d.ts.map +0 -1
- package/lib/plugins/inputValidation.js +0 -95
- package/lib/plugins/inputValidation.js.map +0 -1
- package/lib/utils/inputValidation.d.ts.map +0 -1
- package/lib/utils/inputValidation.js +0 -51
- package/lib/utils/inputValidation.js.map +0 -1
package/lib/mcp/utils/html.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTML generation utilities for MCP server responses
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Escape HTML special characters to prevent XSS
|
|
6
|
-
*/
|
|
7
|
-
export function escapeHtml(text) {
|
|
8
|
-
if (!text)
|
|
9
|
-
return '';
|
|
10
|
-
return text
|
|
11
|
-
.replace(/&/g, '&')
|
|
12
|
-
.replace(/</g, '<')
|
|
13
|
-
.replace(/>/g, '>')
|
|
14
|
-
.replace(/"/g, '"')
|
|
15
|
-
.replace(/'/g, ''');
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Generate HTML output for products list with Unchained styling
|
|
19
|
-
*/
|
|
20
|
-
export function generateProductsHTML(products, productTexts, pagination) {
|
|
21
|
-
const { offset, total } = pagination;
|
|
22
|
-
const resultsShown = products.length;
|
|
23
|
-
const startIndex = offset + 1;
|
|
24
|
-
const endIndex = offset + resultsShown;
|
|
25
|
-
return `
|
|
26
|
-
<!DOCTYPE html>
|
|
27
|
-
<html>
|
|
28
|
-
<head>
|
|
29
|
-
<meta charset="UTF-8" />
|
|
30
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
31
|
-
</head>
|
|
32
|
-
<body>
|
|
33
|
-
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui; max-width: 1200px;">
|
|
34
|
-
<div style="margin-bottom: 16px; display: flex; justify-content: space-between; align-items: center;">
|
|
35
|
-
<h3 style="color: #343a40; margin: 0;">Products</h3>
|
|
36
|
-
<span style="color: #6c757d; font-size: 14px;">Showing ${startIndex}-${endIndex} of ${total}</span>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<div style="background: white; border-radius: 6px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); overflow: hidden;">
|
|
40
|
-
<table style="width: 100%; border-collapse: collapse;">
|
|
41
|
-
<thead style="background: #f8f9fa; border-bottom: 1px solid #e9ecef;">
|
|
42
|
-
<tr>
|
|
43
|
-
<th style="padding: 12px; text-align: left; font-weight: 600; color: #343a40;">Image</th>
|
|
44
|
-
<th style="padding: 12px; text-align: left; font-weight: 600; color: #343a40;">Product</th>
|
|
45
|
-
<th style="padding: 12px; text-align: left; font-weight: 600; color: #343a40;">SKU</th>
|
|
46
|
-
<th style="padding: 12px; text-align: left; font-weight: 600; color: #343a40;">Status</th>
|
|
47
|
-
<th style="padding: 12px; text-align: left; font-weight: 600; color: #343a40;">ID</th>
|
|
48
|
-
</tr>
|
|
49
|
-
</thead>
|
|
50
|
-
<tbody>
|
|
51
|
-
${products.map((product, index) => generateProductRow(product, index)).join('')}
|
|
52
|
-
</tbody>
|
|
53
|
-
</table>
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
</body>
|
|
57
|
-
</html>`;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Generate a single product row for the HTML table
|
|
61
|
-
*/
|
|
62
|
-
function generateProductRow(product, index) {
|
|
63
|
-
const isEven = index % 2 === 0;
|
|
64
|
-
const backgroundColor = isEven ? '#ffffff' : '#f8f9fa';
|
|
65
|
-
// Get product title from texts
|
|
66
|
-
const title = product.texts?.find((t) => t.locale === 'en')?.title || product.title || 'Untitled Product';
|
|
67
|
-
// Get SKU from warehousing info
|
|
68
|
-
const sku = product.warehousing?.sku || 'N/A';
|
|
69
|
-
// Get status with proper formatting
|
|
70
|
-
const status = product.status || 'DRAFT';
|
|
71
|
-
const statusColor = status === 'ACTIVE' ? '#28a745' : status === 'DRAFT' ? '#ffc107' : '#6c757d';
|
|
72
|
-
// Product ID (shortened for display)
|
|
73
|
-
const productId = product._id?.toString() || 'N/A';
|
|
74
|
-
const shortId = productId.length > 12 ? `${productId.substring(0, 12)}...` : productId;
|
|
75
|
-
return `
|
|
76
|
-
<tr style="background: ${backgroundColor}; border-bottom: 1px solid #e9ecef;">
|
|
77
|
-
<td style="padding: 12px;">
|
|
78
|
-
<div style="width: 40px; height: 40px; background: #e9ecef; border-radius: 4px; display: flex; align-items: center; justify-content: center; color: #6c757d; font-size: 12px;">
|
|
79
|
-
IMG
|
|
80
|
-
</div>
|
|
81
|
-
</td>
|
|
82
|
-
<td style="padding: 12px;">
|
|
83
|
-
<div style="font-weight: 500; color: #343a40;">${escapeHtml(title)}</div>
|
|
84
|
-
${product.tags?.length
|
|
85
|
-
? `<div style="font-size: 12px; color: #6c757d; margin-top: 4px;">${product.tags
|
|
86
|
-
.slice(0, 3)
|
|
87
|
-
.map((tag) => `<span style="background: #e9ecef; padding: 2px 6px; border-radius: 3px; margin-right: 4px;">${escapeHtml(tag)}</span>`)
|
|
88
|
-
.join('')}</div>`
|
|
89
|
-
: ''}
|
|
90
|
-
</td>
|
|
91
|
-
<td style="padding: 12px;">
|
|
92
|
-
<span style="color: #343a40; font-family: monospace;">${escapeHtml(sku)}</span>
|
|
93
|
-
</td>
|
|
94
|
-
<td style="padding: 12px;">
|
|
95
|
-
<span style="color: ${statusColor}; font-weight: 500; font-size: 12px; text-transform: uppercase; background: ${statusColor}20; padding: 4px 8px; border-radius: 12px;">${status}</span>
|
|
96
|
-
</td>
|
|
97
|
-
<td style="padding: 12px;">
|
|
98
|
-
<span style="color: #6c757d; font-family: monospace; font-size: 12px;" title="${escapeHtml(productId)}">${escapeHtml(shortId)}</span>
|
|
99
|
-
</td>
|
|
100
|
-
</tr>`;
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=html.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/mcp/utils/html.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAe,EACf,YAAmB,EACnB,UAA4D;IAE5D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;IACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;IAEvC,OAAO;;;;;;;;;;;mEAW0D,UAAU,IAAI,QAAQ,OAAO,KAAK;;;;;;;;;;;;;;;gBAerF,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;;UAMnF,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAY,EAAE,KAAa;IACrD,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvD,+BAA+B;IAC/B,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAEnG,gCAAgC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,KAAK,CAAC;IAE9C,oCAAoC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEjG,qCAAqC;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,KAAK,CAAC;IACnD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvF,OAAO;iCACwB,eAAe;;;;;;;6DAOa,UAAU,CAAC,KAAK,CAAC;cAEhE,OAAO,CAAC,IAAI,EAAE,MAAM;QAClB,CAAC,CAAC,kEAAkE,OAAO,CAAC,IAAI;aAC3E,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CACF,CAAC,GAAW,EAAE,EAAE,CACd,+FAA+F,UAAU,CAAC,GAAG,CAAC,SAAS,CAC1H;aACA,IAAI,CAAC,EAAE,CAAC,QAAQ;QACrB,CAAC,CAAC,EACN;;;oEAGwD,UAAU,CAAC,GAAG,CAAC;;;kCAGjD,WAAW,+EAA+E,WAAW,+CAA+C,MAAM;;;4FAGhG,UAAU,CAAC,SAAS,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC;;cAE3H,CAAC;AACf,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accountLockout.d.ts","sourceRoot":"","sources":["../../src/middleware/accountLockout.ts"],"names":[],"mappings":"AAuCA,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB3E;AAED,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChF;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { GraphQLError } from 'graphql';
|
|
2
|
-
// Store login attempts by user identifier (username/email)
|
|
3
|
-
const loginAttempts = new Map();
|
|
4
|
-
// Configuration
|
|
5
|
-
const MAX_ATTEMPTS = 5;
|
|
6
|
-
const LOCKOUT_DURATION = 30 * 60 * 1000; // 30 minutes
|
|
7
|
-
const ATTEMPT_WINDOW = 15 * 60 * 1000; // 15 minutes
|
|
8
|
-
// Clean up old entries periodically
|
|
9
|
-
setInterval(() => {
|
|
10
|
-
const now = Date.now();
|
|
11
|
-
for (const [key, attempt] of loginAttempts.entries()) {
|
|
12
|
-
// Remove entries older than 24 hours
|
|
13
|
-
if (now - attempt.lastAttempt > 24 * 60 * 60 * 1000) {
|
|
14
|
-
loginAttempts.delete(key);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}, 60 * 60 * 1000); // Clean every hour
|
|
18
|
-
async function createIdentifierHash(identifier) {
|
|
19
|
-
const encoder = new TextEncoder();
|
|
20
|
-
const dataBuffer = encoder.encode(identifier.toLowerCase());
|
|
21
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);
|
|
22
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
23
|
-
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
24
|
-
}
|
|
25
|
-
export async function checkAccountLockout(identifier) {
|
|
26
|
-
const hashedIdentifier = await createIdentifierHash(identifier);
|
|
27
|
-
const attempt = loginAttempts.get(hashedIdentifier);
|
|
28
|
-
if (!attempt)
|
|
29
|
-
return;
|
|
30
|
-
const now = Date.now();
|
|
31
|
-
// Check if account is locked
|
|
32
|
-
if (attempt.lockedUntil && attempt.lockedUntil > now) {
|
|
33
|
-
const remainingMinutes = Math.ceil((attempt.lockedUntil - now) / 60000);
|
|
34
|
-
throw new GraphQLError(`Account is locked. Please try again in ${remainingMinutes} minutes.`, {
|
|
35
|
-
extensions: {
|
|
36
|
-
code: 'ACCOUNT_LOCKED',
|
|
37
|
-
lockedUntil: attempt.lockedUntil,
|
|
38
|
-
remainingMinutes,
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
// Reset attempts if outside the window
|
|
43
|
-
if (now - attempt.firstAttempt > ATTEMPT_WINDOW) {
|
|
44
|
-
loginAttempts.delete(hashedIdentifier);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export async function recordFailedLoginAttempt(identifier) {
|
|
48
|
-
const hashedIdentifier = await createIdentifierHash(identifier);
|
|
49
|
-
const now = Date.now();
|
|
50
|
-
let attempt = loginAttempts.get(hashedIdentifier);
|
|
51
|
-
if (!attempt || now - attempt.firstAttempt > ATTEMPT_WINDOW) {
|
|
52
|
-
// Create new attempt record or reset if outside window
|
|
53
|
-
attempt = {
|
|
54
|
-
count: 1,
|
|
55
|
-
firstAttempt: now,
|
|
56
|
-
lastAttempt: now,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
// Increment existing attempt
|
|
61
|
-
attempt.count++;
|
|
62
|
-
attempt.lastAttempt = now;
|
|
63
|
-
// Lock account if max attempts exceeded
|
|
64
|
-
if (attempt.count >= MAX_ATTEMPTS) {
|
|
65
|
-
attempt.lockedUntil = now + LOCKOUT_DURATION;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
loginAttempts.set(hashedIdentifier, attempt);
|
|
69
|
-
// Provide warning about remaining attempts
|
|
70
|
-
if (attempt.count >= 3 && attempt.count < MAX_ATTEMPTS) {
|
|
71
|
-
const remainingAttempts = MAX_ATTEMPTS - attempt.count;
|
|
72
|
-
throw new GraphQLError(`Invalid credentials. ${remainingAttempts} attempts remaining before account lockout.`, {
|
|
73
|
-
extensions: {
|
|
74
|
-
code: 'INVALID_CREDENTIALS',
|
|
75
|
-
remainingAttempts,
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
export async function clearLoginAttempts(identifier) {
|
|
81
|
-
const hashedIdentifier = await createIdentifierHash(identifier);
|
|
82
|
-
loginAttempts.delete(hashedIdentifier);
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=accountLockout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accountLockout.js","sourceRoot":"","sources":["../../src/middleware/accountLockout.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimiter.ts"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD;AAkCD,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,EAAE,UAAS,gBAAqB,MAmBnE,SAAS,GAAG,qBA8B3B,CAAC;AAGF,eAAO,MAAM,eAAe,YAjCH,GAAG,qBAqC1B,CAAC;AAEH,eAAO,MAAM,wBAAwB,YAvCZ,GAAG,qBAiD1B,CAAC;AAEH,eAAO,MAAM,uBAAuB,YAnDX,GAAG,qBA4D1B,CAAC"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { GraphQLError } from 'graphql';
|
|
2
|
-
const stores = {};
|
|
3
|
-
// Clean up expired entries periodically
|
|
4
|
-
setInterval(() => {
|
|
5
|
-
const now = Date.now();
|
|
6
|
-
Object.keys(stores).forEach((storeName) => {
|
|
7
|
-
const store = stores[storeName];
|
|
8
|
-
Object.keys(store).forEach((key) => {
|
|
9
|
-
if (store[key].resetTime < now) {
|
|
10
|
-
delete store[key];
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
}, 60000); // Clean every minute
|
|
15
|
-
// Helper to create hash using WebCrypto
|
|
16
|
-
async function createHash(data) {
|
|
17
|
-
const encoder = new TextEncoder();
|
|
18
|
-
const dataBuffer = encoder.encode(data);
|
|
19
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);
|
|
20
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
21
|
-
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
22
|
-
}
|
|
23
|
-
export const createRateLimiter = (storeName, options = {}) => {
|
|
24
|
-
const { windowMs = 15 * 60 * 1000, // 15 minutes default
|
|
25
|
-
max = 5, // 5 requests per window default
|
|
26
|
-
message = 'Too many requests, please try again later.', keyGenerator = async (context) => {
|
|
27
|
-
// Default key generator uses IP + userId
|
|
28
|
-
const ip = context.req?.ip || context.req?.connection?.remoteAddress || 'unknown';
|
|
29
|
-
const userId = context.userId || 'anonymous';
|
|
30
|
-
return createHash(`${ip}-${userId}`);
|
|
31
|
-
}, } = options;
|
|
32
|
-
// Initialize store for this limiter
|
|
33
|
-
if (!stores[storeName]) {
|
|
34
|
-
stores[storeName] = {};
|
|
35
|
-
}
|
|
36
|
-
const store = stores[storeName];
|
|
37
|
-
return async (context) => {
|
|
38
|
-
const key = await keyGenerator(context);
|
|
39
|
-
const now = Date.now();
|
|
40
|
-
// Get or create rate limit entry
|
|
41
|
-
let entry = store[key];
|
|
42
|
-
if (!entry || entry.resetTime < now) {
|
|
43
|
-
entry = {
|
|
44
|
-
count: 0,
|
|
45
|
-
resetTime: now + windowMs,
|
|
46
|
-
};
|
|
47
|
-
store[key] = entry;
|
|
48
|
-
}
|
|
49
|
-
// Increment counter
|
|
50
|
-
entry.count++;
|
|
51
|
-
// Check if limit exceeded
|
|
52
|
-
if (entry.count > max) {
|
|
53
|
-
const retryAfter = Math.ceil((entry.resetTime - now) / 1000);
|
|
54
|
-
throw new GraphQLError(message, {
|
|
55
|
-
extensions: {
|
|
56
|
-
code: 'RATE_LIMIT_EXCEEDED',
|
|
57
|
-
retryAfter,
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
return true;
|
|
62
|
-
};
|
|
63
|
-
};
|
|
64
|
-
// Pre-configured rate limiters for common use cases
|
|
65
|
-
export const authRateLimiter = createRateLimiter('auth', {
|
|
66
|
-
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
67
|
-
max: 5, // 5 attempts per 15 minutes
|
|
68
|
-
message: 'Too many authentication attempts. Please try again later.',
|
|
69
|
-
});
|
|
70
|
-
export const passwordResetRateLimiter = createRateLimiter('passwordReset', {
|
|
71
|
-
windowMs: 60 * 60 * 1000, // 1 hour
|
|
72
|
-
max: 3, // 3 attempts per hour
|
|
73
|
-
message: 'Too many password reset requests. Please try again later.',
|
|
74
|
-
keyGenerator: async (context) => {
|
|
75
|
-
// Rate limit by email/username instead of IP for password reset
|
|
76
|
-
const { email, username } = context.args || {};
|
|
77
|
-
const identifier = email || username || 'unknown';
|
|
78
|
-
return createHash(identifier.toLowerCase());
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
export const registrationRateLimiter = createRateLimiter('registration', {
|
|
82
|
-
windowMs: 60 * 60 * 1000, // 1 hour
|
|
83
|
-
max: 10, // 10 registrations per hour per IP
|
|
84
|
-
message: 'Too many registration attempts. Please try again later.',
|
|
85
|
-
keyGenerator: async (context) => {
|
|
86
|
-
// Rate limit by IP only for registrations
|
|
87
|
-
const ip = context.req?.ip || context.req?.connection?.remoteAddress || 'unknown';
|
|
88
|
-
return createHash(ip);
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
//# sourceMappingURL=rateLimiter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/middleware/rateLimiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inputValidation.d.ts","sourceRoot":"","sources":["../../src/plugins/inputValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA6DtC,MAAM,WAAW,sBAAsB;IAErC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAErD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,sBAA2B,GAAG,MAAM,CA6C/E"}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { GraphQLError } from 'graphql';
|
|
2
|
-
// Dangerous patterns to check for
|
|
3
|
-
const DANGEROUS_PATTERNS = [
|
|
4
|
-
/<script/i, // Script tags
|
|
5
|
-
/<iframe/i, // Iframes
|
|
6
|
-
/<object/i, // Object embeds
|
|
7
|
-
/<embed/i, // Embed tags
|
|
8
|
-
/<link/i, // Link tags (can load CSS)
|
|
9
|
-
/javascript:/i, // JavaScript protocol
|
|
10
|
-
/vbscript:/i, // VBScript protocol
|
|
11
|
-
/on\w+\s*=/i, // Event handlers (onclick, onload, etc)
|
|
12
|
-
/<meta/i, // Meta tags
|
|
13
|
-
/data:text\/html/i, // Data URLs with HTML
|
|
14
|
-
/<svg.*onload/i, // SVG with event handlers
|
|
15
|
-
/&#x?[0-9a-f]+;/i, // HTML entities (could be obfuscation)
|
|
16
|
-
/\\u[0-9a-f]{4}/i, // Unicode escapes
|
|
17
|
-
/expression\s*\(/i, // CSS expressions
|
|
18
|
-
/@import/i, // CSS imports
|
|
19
|
-
/<!--|-->/, // HTML comments
|
|
20
|
-
];
|
|
21
|
-
function checkForDangerousContent(value, path) {
|
|
22
|
-
for (const dangerous of DANGEROUS_PATTERNS) {
|
|
23
|
-
if (dangerous.test(value)) {
|
|
24
|
-
throw new GraphQLError(`Potentially dangerous content detected in ${path}`, {
|
|
25
|
-
extensions: {
|
|
26
|
-
code: 'DANGEROUS_INPUT',
|
|
27
|
-
path,
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function validateValue(value, path = '') {
|
|
34
|
-
if (value === null || value === undefined) {
|
|
35
|
-
return value;
|
|
36
|
-
}
|
|
37
|
-
if (typeof value === 'string') {
|
|
38
|
-
checkForDangerousContent(value, path);
|
|
39
|
-
return value;
|
|
40
|
-
}
|
|
41
|
-
if (Array.isArray(value)) {
|
|
42
|
-
return value.map((item, index) => validateValue(item, `${path}[${index}]`));
|
|
43
|
-
}
|
|
44
|
-
if (typeof value === 'object') {
|
|
45
|
-
const validated = {};
|
|
46
|
-
for (const [key, val] of Object.entries(value)) {
|
|
47
|
-
validated[key] = validateValue(val, path ? `${path}.${key}` : key);
|
|
48
|
-
}
|
|
49
|
-
return validated;
|
|
50
|
-
}
|
|
51
|
-
return value;
|
|
52
|
-
}
|
|
53
|
-
export function useInputValidation(options = {}) {
|
|
54
|
-
const { skipOperations = [], skipFields = [], customValidator, logErrors = false } = options;
|
|
55
|
-
return {
|
|
56
|
-
onParams({ params, setParams }) {
|
|
57
|
-
// Get operation name from the request
|
|
58
|
-
const operationName = params.operationName || '';
|
|
59
|
-
// Skip if operation is in skip list
|
|
60
|
-
if (operationName && skipOperations.includes(operationName)) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
try {
|
|
64
|
-
// Validate variables
|
|
65
|
-
if (params.variables) {
|
|
66
|
-
const validatedVariables = {};
|
|
67
|
-
for (const [key, value] of Object.entries(params.variables)) {
|
|
68
|
-
if (!skipFields.includes(key)) {
|
|
69
|
-
validatedVariables[key] = validateValue(value, `variables.${key}`);
|
|
70
|
-
// Run custom validator if provided
|
|
71
|
-
if (customValidator) {
|
|
72
|
-
customValidator(value, `variables.${key}`);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
validatedVariables[key] = value;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Update params with validated variables
|
|
80
|
-
setParams({
|
|
81
|
-
...params,
|
|
82
|
-
variables: validatedVariables,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
if (logErrors) {
|
|
88
|
-
console.error('Input validation error:', error);
|
|
89
|
-
}
|
|
90
|
-
throw error;
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=inputValidation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inputValidation.js","sourceRoot":"","sources":["../../src/plugins/inputValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inputValidation.d.ts","sourceRoot":"","sources":["../../src/utils/inputValidation.ts"],"names":[],"mappings":"AAuBA,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAU5D;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,SAAK,GAAG,GAAG,CAmBvD"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { GraphQLError } from 'graphql';
|
|
2
|
-
// Dangerous patterns to check for
|
|
3
|
-
const DANGEROUS_PATTERNS = [
|
|
4
|
-
/<script/i, // Script tags
|
|
5
|
-
/<iframe/i, // Iframes
|
|
6
|
-
/<object/i, // Object embeds
|
|
7
|
-
/<embed/i, // Embed tags
|
|
8
|
-
/<link/i, // Link tags (can load CSS)
|
|
9
|
-
/javascript:/i, // JavaScript protocol
|
|
10
|
-
/vbscript:/i, // VBScript protocol
|
|
11
|
-
/on\w+\s*=/i, // Event handlers (onclick, onload, etc)
|
|
12
|
-
/<meta/i, // Meta tags
|
|
13
|
-
/data:text\/html/i, // Data URLs with HTML
|
|
14
|
-
/<svg.*onload/i, // SVG with event handlers
|
|
15
|
-
/&#x?[0-9a-f]+;/i, // HTML entities (could be obfuscation)
|
|
16
|
-
/\\u[0-9a-f]{4}/i, // Unicode escapes
|
|
17
|
-
/expression\s*\(/i, // CSS expressions
|
|
18
|
-
/@import/i, // CSS imports
|
|
19
|
-
/<!--|-->/, // HTML comments
|
|
20
|
-
];
|
|
21
|
-
// Check for dangerous patterns in any string
|
|
22
|
-
export function checkForDangerousContent(value) {
|
|
23
|
-
if (!value)
|
|
24
|
-
return;
|
|
25
|
-
for (const dangerous of DANGEROUS_PATTERNS) {
|
|
26
|
-
if (dangerous.test(value)) {
|
|
27
|
-
throw new GraphQLError('Input contains potentially dangerous content', {
|
|
28
|
-
extensions: { code: 'SECURITY_VALIDATION_ERROR' },
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
// Validate an entire object recursively
|
|
34
|
-
export function validateObject(obj, path = '') {
|
|
35
|
-
if (typeof obj === 'string') {
|
|
36
|
-
checkForDangerousContent(obj);
|
|
37
|
-
return obj;
|
|
38
|
-
}
|
|
39
|
-
if (Array.isArray(obj)) {
|
|
40
|
-
return obj.map((item, index) => validateObject(item, `${path}[${index}]`));
|
|
41
|
-
}
|
|
42
|
-
if (obj && typeof obj === 'object') {
|
|
43
|
-
const validated = {};
|
|
44
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
45
|
-
validated[key] = validateObject(value, path ? `${path}.${key}` : key);
|
|
46
|
-
}
|
|
47
|
-
return validated;
|
|
48
|
-
}
|
|
49
|
-
return obj;
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=inputValidation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inputValidation.js","sourceRoot":"","sources":["../../src/utils/inputValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,kCAAkC;AAClC,MAAM,kBAAkB,GAAG;IACzB,UAAU,EAAE,cAAc;IAC1B,UAAU,EAAE,UAAU;IACtB,UAAU,EAAE,gBAAgB;IAC5B,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,2BAA2B;IACrC,cAAc,EAAE,sBAAsB;IACtC,YAAY,EAAE,oBAAoB;IAClC,YAAY,EAAE,wCAAwC;IACtD,QAAQ,EAAE,YAAY;IACtB,kBAAkB,EAAE,sBAAsB;IAC1C,eAAe,EAAE,0BAA0B;IAC3C,iBAAiB,EAAE,uCAAuC;IAC1D,iBAAiB,EAAE,kBAAkB;IACrC,kBAAkB,EAAE,kBAAkB;IACtC,UAAU,EAAE,cAAc;IAC1B,UAAU,EAAE,gBAAgB;CAC7B,CAAC;AAEF,6CAA6C;AAC7C,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QAC3C,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,YAAY,CAAC,8CAA8C,EAAE;gBACrE,UAAU,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAAC,GAAQ,EAAE,IAAI,GAAG,EAAE;IAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|