fa-mcp-sdk 0.2.38 → 0.2.78

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.
Files changed (121) hide show
  1. package/bin/fa-mcp.js +781 -0
  2. package/cli-template/.editorconfig +13 -0
  3. package/cli-template/.env.example +29 -0
  4. package/cli-template/.envrc +3 -0
  5. package/cli-template/.run/== START ==.run.xml +14 -0
  6. package/cli-template/.run/TEST HTTP.run.xml +5 -0
  7. package/cli-template/.run/TEST SSE.run.xml +5 -0
  8. package/cli-template/.run/TEST STDIO.run.xml +5 -0
  9. package/cli-template/.run/TEST search.run.xml +11 -0
  10. package/cli-template/.run/cb.run.xml +12 -0
  11. package/cli-template/.run/ci.run.xml +12 -0
  12. package/cli-template/.run/kill-port 3030.run.xml +5 -0
  13. package/cli-template/.run/lint.run.xml +12 -0
  14. package/cli-template/.run/lint_fix.run.xml +12 -0
  15. package/cli-template/.run/reinstall.run.xml +12 -0
  16. package/cli-template/.run/remove-nul.js.run.xml +5 -0
  17. package/cli-template/LICENSE +21 -0
  18. package/cli-template/config/_local.yaml +64 -0
  19. package/cli-template/config/custom-environment-variables.yaml +33 -0
  20. package/cli-template/config/default.yaml +101 -0
  21. package/cli-template/config/development.yaml +4 -0
  22. package/cli-template/config/production.yaml +4 -0
  23. package/cli-template/config/test.yaml +26 -0
  24. package/cli-template/deploy/.gitkeep +0 -0
  25. package/cli-template/deploy/config.example.yml +3 -0
  26. package/cli-template/deploy/mcp-template.com.conf +58 -0
  27. package/cli-template/deploy/pm2.config.js +30 -0
  28. package/cli-template/deploy/pm2reg.sh +49 -0
  29. package/cli-template/deploy/srv.sh +359 -0
  30. package/cli-template/deploy/srv.sh.readme.md +347 -0
  31. package/cli-template/eslint.config.js +139 -0
  32. package/cli-template/jest.config.js +30 -0
  33. package/cli-template/package.json +73 -0
  34. package/cli-template/scripts/kill-port.js +107 -0
  35. package/cli-template/scripts/npm/patch_node_modules.js +9 -0
  36. package/cli-template/scripts/npm/run.js +31 -0
  37. package/cli-template/scripts/npm/yarn-ci.ps1 +16 -0
  38. package/cli-template/scripts/npm/yarn-ci.sh +8 -0
  39. package/cli-template/scripts/npm/yarn-reinstall.ps1 +54 -0
  40. package/cli-template/scripts/npm/yarn-reinstall.sh +10 -0
  41. package/cli-template/scripts/pre-commit +58 -0
  42. package/cli-template/scripts/remove-nul.js +53 -0
  43. package/cli-template/src/_types_/common.d.ts +27 -0
  44. package/cli-template/src/api/router.ts +35 -0
  45. package/cli-template/src/api/swagger.ts +167 -0
  46. package/cli-template/src/asset/favicon.svg +4 -0
  47. package/cli-template/src/custom-resources.ts +11 -0
  48. package/cli-template/src/prompts/agent-brief.ts +8 -0
  49. package/cli-template/src/prompts/agent-prompt.ts +1 -0
  50. package/cli-template/src/prompts/custom-prompts.ts +12 -0
  51. package/cli-template/src/start.ts +84 -0
  52. package/cli-template/src/tools/handle-tool-call.ts +55 -0
  53. package/cli-template/src/tools/tools.ts +88 -0
  54. package/cli-template/tests/jest-simple-reporter.js +10 -0
  55. package/cli-template/tests/mcp/sse/mcp-sse-client-handling.md +111 -0
  56. package/cli-template/tests/mcp/sse/test-sse-npm-package.js +96 -0
  57. package/cli-template/tests/mcp/test-cases.js +143 -0
  58. package/cli-template/tests/mcp/test-http.js +63 -0
  59. package/cli-template/tests/mcp/test-sse.js +67 -0
  60. package/cli-template/tests/mcp/test-stdio.js +78 -0
  61. package/cli-template/tests/utils.ts +154 -0
  62. package/cli-template/tsconfig.json +48 -0
  63. package/cli-template/update.cjs +631 -0
  64. package/dist/core/_types_/active-directory-config.d.ts +24 -0
  65. package/dist/core/_types_/active-directory-config.d.ts.map +1 -0
  66. package/dist/core/_types_/active-directory-config.js +2 -0
  67. package/dist/core/_types_/active-directory-config.js.map +1 -0
  68. package/dist/core/bootstrap/init-config.d.ts.map +1 -1
  69. package/dist/core/bootstrap/init-config.js +14 -3
  70. package/dist/core/bootstrap/init-config.js.map +1 -1
  71. package/dist/core/bootstrap/startup-info.js +1 -1
  72. package/dist/core/bootstrap/startup-info.js.map +1 -1
  73. package/dist/core/index.d.ts +3 -2
  74. package/dist/core/index.d.ts.map +1 -1
  75. package/dist/core/index.js +5 -2
  76. package/dist/core/index.js.map +1 -1
  77. package/dist/core/init-mcp-server.js +1 -1
  78. package/dist/core/init-mcp-server.js.map +1 -1
  79. package/dist/core/token/gen-token-app/gen-token-server.d.ts.map +1 -1
  80. package/dist/core/token/gen-token-app/gen-token-server.js +85 -9
  81. package/dist/core/token/gen-token-app/gen-token-server.js.map +1 -1
  82. package/dist/core/token/gen-token-app/html.d.ts +8 -1
  83. package/dist/core/token/gen-token-app/html.d.ts.map +1 -1
  84. package/dist/core/token/gen-token-app/html.js +98 -2
  85. package/dist/core/token/gen-token-app/html.js.map +1 -1
  86. package/dist/core/token/gen-token-app/ntlm-auth-options.d.ts +4 -0
  87. package/dist/core/token/gen-token-app/ntlm-auth-options.d.ts.map +1 -0
  88. package/dist/core/token/gen-token-app/ntlm-auth-options.js +94 -0
  89. package/dist/core/token/gen-token-app/ntlm-auth-options.js.map +1 -0
  90. package/dist/core/token/gen-token-app/ntlm-domain-config.d.ts +16 -0
  91. package/dist/core/token/gen-token-app/ntlm-domain-config.d.ts.map +1 -0
  92. package/dist/core/token/gen-token-app/ntlm-domain-config.js +71 -0
  93. package/dist/core/token/gen-token-app/ntlm-domain-config.js.map +1 -0
  94. package/dist/core/token/gen-token-app/ntlm-integration.d.ts +3 -0
  95. package/dist/core/token/gen-token-app/ntlm-integration.d.ts.map +1 -0
  96. package/dist/core/token/gen-token-app/ntlm-integration.js +69 -0
  97. package/dist/core/token/gen-token-app/ntlm-integration.js.map +1 -0
  98. package/dist/core/token/gen-token-app/ntlm-session-storage.d.ts +16 -0
  99. package/dist/core/token/gen-token-app/ntlm-session-storage.d.ts.map +1 -0
  100. package/dist/core/token/gen-token-app/ntlm-session-storage.js +74 -0
  101. package/dist/core/token/gen-token-app/ntlm-session-storage.js.map +1 -0
  102. package/dist/core/token/gen-token-app/ntlm-templates.d.ts +21 -0
  103. package/dist/core/token/gen-token-app/ntlm-templates.d.ts.map +1 -0
  104. package/dist/core/token/gen-token-app/ntlm-templates.js +246 -0
  105. package/dist/core/token/gen-token-app/ntlm-templates.js.map +1 -0
  106. package/dist/core/token/{token.d.ts → token-auth.d.ts} +1 -1
  107. package/dist/core/token/token-auth.d.ts.map +1 -0
  108. package/dist/core/token/{token.js → token-auth.js} +4 -6
  109. package/dist/core/token/token-auth.js.map +1 -0
  110. package/dist/core/token/token-core.d.ts +5 -1
  111. package/dist/core/token/token-core.d.ts.map +1 -1
  112. package/dist/core/token/token-core.js +13 -3
  113. package/dist/core/token/token-core.js.map +1 -1
  114. package/dist/core/web/about-page/render.d.ts.map +1 -1
  115. package/dist/core/web/about-page/render.js +26 -3
  116. package/dist/core/web/about-page/render.js.map +1 -1
  117. package/dist/core/web/server-http.js +1 -1
  118. package/dist/core/web/server-http.js.map +1 -1
  119. package/package.json +10 -3
  120. package/dist/core/token/token.d.ts.map +0 -1
  121. package/dist/core/token/token.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ import { NTLMAuthError } from 'ya-express-ntlm';
2
+ import { isObject } from 'af-tools-ts';
3
+ import { appConfig } from '../../bootstrap/init-config.js';
4
+ // Check if AD configuration is available
5
+ export const isNTLMEnabled = () => {
6
+ return !!(appConfig.ad && isObject(appConfig.ad.domains) && Object.keys(appConfig.ad.domains).length);
7
+ };
8
+ // If AD config is null or undefined, NTLM authentication is disabled
9
+ if (!isNTLMEnabled()) {
10
+ console.log('[TOKEN-GEN] NTLM authentication is DISABLED - no AD configuration found');
11
+ }
12
+ else {
13
+ const { domains } = appConfig.ad;
14
+ if (!isObject(domains) || !Object.keys(domains).length) {
15
+ throw new NTLMAuthError('None of the Domain Controllers are specified');
16
+ }
17
+ }
18
+ export const defaultTokenGenDomainConfig = { controllers: [], username: '', password: '' };
19
+ export const tokenGenDomains = {};
20
+ // Process and validate all domains (same logic as main NTLM example)
21
+ if (isNTLMEnabled()) {
22
+ const { domains } = appConfig.ad;
23
+ Object.entries(domains).forEach(([domainName, item]) => {
24
+ const { controllers } = item;
25
+ if (!controllers?.length) {
26
+ throw new NTLMAuthError(`No domain controller was specified for "${domainName}"`);
27
+ }
28
+ if (!Array.isArray(controllers)) {
29
+ throw new NTLMAuthError(`Value of "${domainName}" must be an array`);
30
+ }
31
+ controllers.forEach((dc) => {
32
+ if (!dc.startsWith('ldap')) {
33
+ throw new NTLMAuthError(`Domain controller must be an AD and start with ldap:// | ldaps:// . Host: domain "${domainName}", DC: ${dc}`);
34
+ }
35
+ });
36
+ // Enrich domain config with name
37
+ item.name = domainName;
38
+ tokenGenDomains[domainName] = item;
39
+ // Set default domain configuration
40
+ if (item.default && !defaultTokenGenDomainConfig.name) {
41
+ Object.assign(defaultTokenGenDomainConfig, item);
42
+ defaultTokenGenDomainConfig.name = domainName;
43
+ }
44
+ });
45
+ if (!defaultTokenGenDomainConfig.name) {
46
+ throw new NTLMAuthError('No default domain controller specified for token generation');
47
+ }
48
+ }
49
+ // Export function to get domain config by name
50
+ export const getDomainConfig = (domainName) => {
51
+ if (!domainName) {
52
+ return defaultTokenGenDomainConfig;
53
+ }
54
+ return tokenGenDomains[domainName] || defaultTokenGenDomainConfig;
55
+ };
56
+ export const tokenGenDomainConfig = {
57
+ defaultDomain: isNTLMEnabled() ? defaultTokenGenDomainConfig.name : undefined,
58
+ domains: isNTLMEnabled() ? tokenGenDomains : {},
59
+ strategy: isNTLMEnabled() ? (appConfig.ad.strategy || 'NTLM') : undefined, // from config or default NTLM
60
+ tlsOptions: isNTLMEnabled() ? appConfig.ad.tlsOptions : undefined, // from config if specified
61
+ };
62
+ // Debug info VVR
63
+ if (isNTLMEnabled()) {
64
+ console.log(`[TOKEN-GEN] Configured domains: ${Object.keys(tokenGenDomains).join(', ')}`);
65
+ console.log(`[TOKEN-GEN] Default domain: ${tokenGenDomainConfig.defaultDomain}`);
66
+ console.log(`[TOKEN-GEN] Strategy: ${tokenGenDomainConfig.strategy}`);
67
+ }
68
+ else {
69
+ console.log('[TOKEN-GEN] NTLM authentication disabled - no domain configuration available');
70
+ }
71
+ //# sourceMappingURL=ntlm-domain-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntlm-domain-config.js","sourceRoot":"","sources":["../../../../src/core/token/gen-token-app/ntlm-domain-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare const setupNTLMAuthentication: () => ((req: Request, res: Response, next: NextFunction) => void)[];
3
+ //# sourceMappingURL=ntlm-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntlm-integration.d.ts","sourceRoot":"","sources":["../../../../src/core/token/gen-token-app/ntlm-integration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAU1D,eAAO,MAAM,uBAAuB,eAIlB,OAAO,OAAO,QAAQ,QAAQ,YAAY,YA8D3D,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { authNTLM } from 'ya-express-ntlm';
2
+ import { tokenGenNtlmOptions } from './ntlm-auth-options.js';
3
+ import { checkTokenGenSession, getSessionStats } from './ntlm-session-storage.js';
4
+ import { getLoginPageHTML } from './ntlm-templates.js';
5
+ import { isNTLMEnabled } from './ntlm-domain-config.js';
6
+ // Create NTLM middleware instance (only if NTLM is enabled)
7
+ const ntlmMiddleware = isNTLMEnabled() ? authNTLM(tokenGenNtlmOptions) : null;
8
+ // Main NTLM authentication setup function
9
+ export const setupNTLMAuthentication = () => {
10
+ if (!isNTLMEnabled()) {
11
+ console.log('[TOKEN-GEN] NTLM authentication is DISABLED - skipping middleware setup');
12
+ // Return middleware that just passes through
13
+ return [(req, res, next) => {
14
+ // Set dummy NTLM info for compatibility
15
+ req.ntlm = {
16
+ isAuthenticated: false,
17
+ username: 'Anonymous',
18
+ domain: 'NoAuth'
19
+ };
20
+ next();
21
+ }];
22
+ }
23
+ return [
24
+ // First check for existing session
25
+ checkTokenGenSession(),
26
+ // Then run NTLM authentication if needed
27
+ (req, res, next) => {
28
+ // Handle login page request
29
+ if (req.path === '/login') {
30
+ return res.send(getLoginPageHTML(req.ntlm?.username || ''));
31
+ }
32
+ // Handle logout request
33
+ if (req.path === '/logout') {
34
+ console.log(`[TOKEN-GEN] Logout requested by: ${req.ntlm?.domain || 'Unknown'}\\${req.ntlm?.username || 'Unknown'}`);
35
+ // Clear session and send 401 to trigger browser auth prompt
36
+ res.setHeader('WWW-Authenticate', 'NTLM');
37
+ res.setHeader('Clear-Site-Data', '"cookies", "storage"');
38
+ console.log('[TOKEN-GEN] Sending 401 response to trigger browser authentication prompt');
39
+ return res.status(401).send('Authentication required - please login again');
40
+ }
41
+ // Add session debug endpoint (only in development)
42
+ if (req.path === '/debug/sessions' && process.env.NODE_ENV !== 'production') {
43
+ const stats = getSessionStats();
44
+ return res.json({
45
+ message: 'Token Generation Server Session Statistics',
46
+ timestamp: new Date().toISOString(),
47
+ ...stats
48
+ });
49
+ }
50
+ // Skip authentication for health checks if needed
51
+ if (req.path === '/health') {
52
+ return res.json({
53
+ status: 'ok',
54
+ service: 'token-generation-server',
55
+ timestamp: new Date().toISOString()
56
+ });
57
+ }
58
+ // If user is already authenticated (from session), continue
59
+ if (req.ntlm?.isAuthenticated) {
60
+ console.log(`[TOKEN-GEN] Request from authenticated user: ${req.ntlm.domain}\\${req.ntlm.username} -> ${req.method} ${req.path}`);
61
+ return next();
62
+ }
63
+ // Run NTLM authentication
64
+ console.log(`[TOKEN-GEN] Starting NTLM authentication for: ${req.method} ${req.path}`);
65
+ ntlmMiddleware(req, res, next);
66
+ }
67
+ ];
68
+ };
69
+ //# sourceMappingURL=ntlm-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntlm-integration.js","sourceRoot":"","sources":["../../../../src/core/token/gen-token-app/ntlm-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { IUserData } from 'ya-express-ntlm';
3
+ export declare const getTokenGenSessionData: (req: Request) => Partial<IUserData>;
4
+ export declare const setTokenGenSessionData: (req: Request, userData: IUserData) => void;
5
+ export declare const removeTokenGenSession: (req: Request) => void;
6
+ export declare const checkTokenGenSession: () => (req: Request, res: Response, next: NextFunction) => void;
7
+ export declare const getSessionStats: () => {
8
+ activeSessions: number;
9
+ sessions: {
10
+ id: string;
11
+ username: string;
12
+ domain: string;
13
+ lastAccess: string;
14
+ }[];
15
+ };
16
+ //# sourceMappingURL=ntlm-session-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntlm-session-storage.d.ts","sourceRoot":"","sources":["../../../../src/core/token/gen-token-app/ntlm-session-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA6B5C,eAAO,MAAM,sBAAsB,GAAI,KAAK,OAAO,KAAG,OAAO,CAAC,SAAS,CAYtE,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAAI,KAAK,OAAO,EAAE,UAAU,SAAS,KAAG,IAS1E,CAAC;AAGF,eAAO,MAAM,qBAAqB,GAAI,KAAK,OAAO,KAAG,IAIpD,CAAC;AAGF,eAAO,MAAM,oBAAoB,SACvB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,SAWxD,CAAC;AAGF,eAAO,MAAM,eAAe;;;;;;;;CAW3B,CAAC"}
@@ -0,0 +1,74 @@
1
+ // In-memory session storage (resets on server restart as required)
2
+ const sessionStorage = new Map();
3
+ const SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes
4
+ // Generate session ID from request
5
+ const getSessionId = (req) => {
6
+ const ip = req.ip || req.connection.remoteAddress || req.socket.remoteAddress || 'unknown';
7
+ const userAgent = req.get('User-Agent') || 'unknown';
8
+ // Simple hash for session ID
9
+ return Buffer.from(`${ip}-${userAgent}`).toString('base64').substring(0, 32);
10
+ };
11
+ // Clean expired sessions
12
+ const cleanExpiredSessions = () => {
13
+ const now = Date.now();
14
+ for (const [sessionId, session] of sessionStorage.entries()) {
15
+ if (now - session.lastAccess > SESSION_TIMEOUT) {
16
+ sessionStorage.delete(sessionId);
17
+ }
18
+ }
19
+ };
20
+ // Get session data
21
+ export const getTokenGenSessionData = (req) => {
22
+ cleanExpiredSessions();
23
+ const sessionId = getSessionId(req);
24
+ const session = sessionStorage.get(sessionId);
25
+ if (session && session.isAuthenticated) {
26
+ session.lastAccess = Date.now();
27
+ sessionStorage.set(sessionId, session);
28
+ return session;
29
+ }
30
+ return {};
31
+ };
32
+ // Set session data
33
+ export const setTokenGenSessionData = (req, userData) => {
34
+ const sessionId = getSessionId(req);
35
+ const sessionData = {
36
+ ...userData,
37
+ lastAccess: Date.now(),
38
+ isAuthenticated: true,
39
+ };
40
+ sessionStorage.set(sessionId, sessionData);
41
+ console.log(`[TOKEN-GEN] Session created for user: ${userData.username} from domain: ${userData.domain}`);
42
+ };
43
+ // Remove session
44
+ export const removeTokenGenSession = (req) => {
45
+ const sessionId = getSessionId(req);
46
+ sessionStorage.delete(sessionId);
47
+ console.log(`[TOKEN-GEN] Session removed for ID: ${sessionId}`);
48
+ };
49
+ // Session middleware for checking authentication
50
+ export const checkTokenGenSession = () => {
51
+ return (req, res, next) => {
52
+ const sessionData = getTokenGenSessionData(req);
53
+ if (sessionData.isAuthenticated) {
54
+ req.ntlm = sessionData;
55
+ return next();
56
+ }
57
+ // No valid session, proceed with NTLM authentication
58
+ next();
59
+ };
60
+ };
61
+ // Get session statistics (for debugging)
62
+ export const getSessionStats = () => {
63
+ cleanExpiredSessions();
64
+ return {
65
+ activeSessions: sessionStorage.size,
66
+ sessions: Array.from(sessionStorage.entries()).map(([id, data]) => ({
67
+ id: id.substring(0, 8) + '...',
68
+ username: data.username,
69
+ domain: data.domain,
70
+ lastAccess: new Date(data.lastAccess).toISOString(),
71
+ }))
72
+ };
73
+ };
74
+ //# sourceMappingURL=ntlm-session-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntlm-session-storage.js","sourceRoot":"","sources":["../../../../src/core/token/gen-token-app/ntlm-session-storage.ts"],"names":[],"mappings":"AAGA,mEAAmE;AACnE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAqB,CAAC;AACpD,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAMrD,mCAAmC;AACnC,MAAM,YAAY,GAAG,CAAC,GAAY,EAAU,EAAE;IAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;IAC3F,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;IACrD,6BAA6B;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,yBAAyB;AACzB,MAAM,oBAAoB,GAAG,GAAG,EAAE;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,GAAG,GAAI,OAAuB,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;YAChE,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,mBAAmB;AACnB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAY,EAAsB,EAAE;IACzE,oBAAoB,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAgB,CAAC;IAE7D,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QACvC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,mBAAmB;AACnB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAY,EAAE,QAAmB,EAAQ,EAAE;IAChF,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,WAAW,GAAgB;QAC/B,GAAG,QAAQ;QACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,eAAe,EAAE,IAAI;KACtB,CAAC;IACF,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,yCAAyC,QAAQ,CAAC,QAAQ,iBAAiB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5G,CAAC,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAY,EAAQ,EAAE;IAC1D,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE;IACvC,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzD,MAAM,WAAW,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAEhD,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC;YACvB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,qDAAqD;QACrD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,oBAAoB,EAAE,CAAC;IACvB,OAAO;QACL,cAAc,EAAE,cAAc,CAAC,IAAI;QACnC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;YAC9B,QAAQ,EAAG,IAAoB,CAAC,QAAQ;YACxC,MAAM,EAAG,IAAoB,CAAC,MAAM;YACpC,UAAU,EAAE,IAAI,IAAI,CAAE,IAAoB,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;SACrE,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * NTLM Authentication HTML Templates
3
+ * Converted from pug templates in src/core/_ntlm_example/ntlm/views/
4
+ */
5
+ /**
6
+ * Basic login page template
7
+ */
8
+ export declare const getLoginPageHTML: (username?: string) => string;
9
+ /**
10
+ * Not authenticated page template (wrong login/password)
11
+ */
12
+ export declare const getNotAuthenticatedPageHTML: (title?: string, protocol?: string, hostname?: string, username?: string) => string;
13
+ /**
14
+ * Not authorized page template (user doesn't have access)
15
+ */
16
+ export declare const getNotAuthorizedPageHTML: (title?: string, username?: string) => string;
17
+ /**
18
+ * 404 page template
19
+ */
20
+ export declare const get404PageHTML: () => string;
21
+ //# sourceMappingURL=ntlm-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntlm-templates.d.ts","sourceRoot":"","sources":["../../../../src/core/token/gen-token-app/ntlm-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuFH;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAU,MAAW,KAAG,MAuEjD,CAAC;AAET;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAO,MAA4B,EAAE,WAAU,MAAW,EAAE,WAAU,MAAW,EAAE,WAAU,MAAW,KAAG,MAuC/I,CAAC;AAET;;GAEG;AACH,eAAO,MAAM,wBAAwB,GAAI,QAAO,MAAyB,EAAE,WAAU,MAAW,KAAG,MAgB3F,CAAC;AAET;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,MAgB1B,CAAC"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * NTLM Authentication HTML Templates
3
+ * Converted from pug templates in src/core/_ntlm_example/ntlm/views/
4
+ */
5
+ // CSS styles from src/core/_ntlm_example/style.css
6
+ const ntlmStyles = `
7
+ body, html {
8
+ height: 100%;
9
+ margin: 0;
10
+ font-family: "Roboto", "-apple-system", "Helvetica Neue", Helvetica, Arial, sans-serif;
11
+ }
12
+
13
+ .views-outer-container {
14
+ height: 100%;
15
+ display: flex;
16
+ justify-content: center;
17
+ align-items: center;
18
+ font-size: 14px;
19
+ }
20
+
21
+ .views-auth-container {
22
+ text-align: center;
23
+ position: absolute;
24
+ top: calc(38vh - 130px);
25
+ }
26
+
27
+ .views-auth-container svg {
28
+ width: 70px;
29
+ fill: rgba(194, 57, 52, 0.58);
30
+ }
31
+
32
+ .views-auth-block {
33
+ border: 1px solid #d0d0d0;
34
+ padding: 20px;
35
+ display: flex;
36
+ flex-direction: column;
37
+ align-items: center;
38
+ }
39
+
40
+ .views-input-group {
41
+ display: flex;
42
+ align-items: center;
43
+ margin-bottom: 10px;
44
+ }
45
+
46
+ .views-input-group label {
47
+ width: 80px;
48
+ text-align: left;
49
+ margin-right: 10px;
50
+ }
51
+
52
+ .views-input-group input {
53
+ padding: 5px;
54
+ width: 200px;
55
+ }
56
+
57
+ .views-input-group input::placeholder {
58
+ color: #e5e5e5;
59
+ }
60
+
61
+ input {
62
+ outline: none;
63
+ border: 1px solid #b0b0b0;
64
+ }
65
+
66
+ input:focus {
67
+ border: 1px solid #ff5500;
68
+ }
69
+
70
+ .views-button-container {
71
+ display: flex;
72
+ width: 100%;
73
+ flex-direction: column;
74
+ align-items: end;
75
+ }
76
+
77
+ .views-button-container button {
78
+ padding: 3px;
79
+ width: 105px;
80
+ }
81
+ `;
82
+ // SVG icon from src/core/_ntlm_example/block-visitor.svg
83
+ const blockVisitorSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
84
+ <path fill="#c23934" d="M29.9 8.8V9v-.2z"/>
85
+ <path fill="#c23934"
86
+ d="M10.2 17.1c0-1.3.4-2.7 1-3.8.8-1.4 1.7-1.9 2.4-3 1.1-1.7 1.4-4.1.6-6-.7-1.9-2.5-3-4.5-2.9S6 2.7 5.4 4.6c-.8 2-.5 4.5 1.2 6.1.7.7 1.3 1.7 1 2.6-.4 1-1.5 1.4-2.2 1.7-1.8.8-4 1.9-4.4 4.1-.4 1.7.8 3.5 2.7 3.5h7.9c.4 0 .6-.4.4-.7-1.2-1.4-1.8-3.1-1.8-4.8zm11.3-3.9c-2.2-2.2-5.7-2.2-7.9 0s-2.2 5.6 0 7.8 5.7 2.2 7.9 0 2.1-5.7 0-7.8zm-6.6 1.2c1.3-1.2 3.1-1.4 4.5-.5l-5 5.1c-.9-1.5-.7-3.3.5-4.6zm5.3 5.3c-1.3 1.2-3.1 1.4-4.6.6l5.1-5.1c.9 1.4.7 3.3-.5 4.5z"/>
87
+ </svg>`;
88
+ /**
89
+ * Basic login page template
90
+ */
91
+ export const getLoginPageHTML = (username = '') => `<!DOCTYPE html>
92
+ <html>
93
+ <head>
94
+ <meta charset="UTF-8">
95
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
96
+ <title>Sign in</title>
97
+ <style>${ntlmStyles}</style>
98
+ </head>
99
+ <body>
100
+ <script>
101
+ const username = '${username}';
102
+ function authenticate() {
103
+ const wl = window.location;
104
+ const login = document.getElementById('login').value;
105
+ const password = document.getElementById('password').value;
106
+
107
+ // Special handling for NTLM authentication
108
+ // The @ symbol in passwords breaks URL construction, so we need proper URL encoding
109
+ try {
110
+ // Properly encode the credentials for URL
111
+ const encodedLogin = encodeURIComponent(login);
112
+ const encodedPassword = encodeURIComponent(password);
113
+
114
+ console.log('Attempting authentication with:', { login: encodedLogin, passwordLength: password.length });
115
+
116
+ // Navigate with properly encoded credentials
117
+ window.location.href = wl.protocol + '//' + encodedLogin + ':' + encodedPassword + '@' + wl.hostname + ':' + wl.port;
118
+ } catch (error) {
119
+ console.error('Authentication error:', error);
120
+ alert('Authentication failed: ' + error.message);
121
+ }
122
+ }
123
+
124
+ // For testing: add direct NTLM trigger function
125
+ function triggerNTLM() {
126
+ // This will trigger the browser's native NTLM authentication dialog
127
+ const wl = window.location;
128
+ window.location.href = wl.origin + '/';
129
+ }
130
+
131
+ // Add additional button for testing
132
+ document.addEventListener('DOMContentLoaded', function() {
133
+ const buttonContainer = document.querySelector('.views-button-container');
134
+ if (buttonContainer) {
135
+ const ntlmButton = document.createElement('button');
136
+ ntlmButton.type = 'button';
137
+ ntlmButton.textContent = 'Trigger NTLM Dialog';
138
+ ntlmButton.style.marginTop = '10px';
139
+ ntlmButton.onclick = triggerNTLM;
140
+ buttonContainer.appendChild(ntlmButton);
141
+ }
142
+ });
143
+ </script>
144
+ <div class="views-outer-container">
145
+ <div class="views-auth-container">
146
+ <div class="views-auth-block">
147
+ <div class="views-input-group">
148
+ <label for="login">Login:</label>
149
+ <input type="text" id="login" value="${username}">
150
+ </div>
151
+ <div class="views-input-group">
152
+ <label for="password">Password:</label>
153
+ <input type="password" id="password">
154
+ </div>
155
+ <div class="views-button-container">
156
+ <button type="button" onclick="authenticate()">Sign in</button>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </body>
162
+ </html>`;
163
+ /**
164
+ * Not authenticated page template (wrong login/password)
165
+ */
166
+ export const getNotAuthenticatedPageHTML = (title = 'NOT AUTHENTICATED', protocol = '', hostname = '', username = '') => `<!DOCTYPE html>
167
+ <html>
168
+ <head>
169
+ <meta charset="UTF-8">
170
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
171
+ <title>${title}</title>
172
+ <style>${ntlmStyles}</style>
173
+ </head>
174
+ <body>
175
+ <script>
176
+ const username = '${username}';
177
+ function authenticate() {
178
+ const protocol = '${protocol}';
179
+ const hostname = '${hostname}';
180
+ const login = document.getElementById('login').value;
181
+ const password = document.getElementById('password').value;
182
+ window.location.href = protocol + '://' + login + ':' + password + '@' + hostname;
183
+ }
184
+ </script>
185
+ <div class="views-outer-container">
186
+ <div class="views-auth-container">
187
+ ${blockVisitorSvg}
188
+ <p>Wrong login or password</p>
189
+ <div class="views-auth-block">
190
+ <div class="views-input-group">
191
+ <label for="login">Login:</label>
192
+ <input type="text" id="login" value="${username}">
193
+ </div>
194
+ <div class="views-input-group">
195
+ <label for="password">Password:</label>
196
+ <input type="password" id="password">
197
+ </div>
198
+ <div class="views-button-container">
199
+ <button type="button" onclick="authenticate()">Sign in</button>
200
+ </div>
201
+ </div>
202
+ </div>
203
+ </div>
204
+ </body>
205
+ </html>`;
206
+ /**
207
+ * Not authorized page template (user doesn't have access)
208
+ */
209
+ export const getNotAuthorizedPageHTML = (title = 'NOT AUTHORIZED', username = '') => `<!DOCTYPE html>
210
+ <html>
211
+ <head>
212
+ <meta charset="UTF-8">
213
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
214
+ <title>${title}</title>
215
+ <style>${ntlmStyles}</style>
216
+ </head>
217
+ <body>
218
+ <div class="views-outer-container">
219
+ <div class="views-auth-container">
220
+ ${blockVisitorSvg}
221
+ <p>No access for "${username}"</p>
222
+ </div>
223
+ </div>
224
+ </body>
225
+ </html>`;
226
+ /**
227
+ * 404 page template
228
+ */
229
+ export const get404PageHTML = () => `<!DOCTYPE html>
230
+ <html>
231
+ <head>
232
+ <meta charset="UTF-8">
233
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
234
+ <title>404 - Page Not Found</title>
235
+ <style>${ntlmStyles}</style>
236
+ </head>
237
+ <body>
238
+ <div class="views-outer-container">
239
+ <div class="views-auth-container">
240
+ ${blockVisitorSvg}
241
+ <p>404 - Page Not Found</p>
242
+ </div>
243
+ </div>
244
+ </body>
245
+ </html>`;
246
+ //# sourceMappingURL=ntlm-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntlm-templates.js","sourceRoot":"","sources":["../../../../src/core/token/gen-token-app/ntlm-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ElB,CAAC;AAEF,yDAAyD;AACzD,MAAM,eAAe,GAAG;;;;OAIjB,CAAC;AAER;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAE,EAAU,EAAE,CAAC;;;;;;WAMxD,UAAU;;;;wBAIG,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAgDiB,QAAQ;;;;;;;;;;;;;QAajD,CAAC;AAET;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,QAAgB,mBAAmB,EAAE,WAAmB,EAAE,EAAE,WAAmB,EAAE,EAAE,WAAmB,EAAE,EAAU,EAAE,CAAC;;;;;WAKtJ,KAAK;WACL,UAAU;;;;wBAIG,QAAQ;;0BAEN,QAAQ;0BACR,QAAQ;;;;;;;;QAQ1B,eAAe;;;;;iDAK0B,QAAQ;;;;;;;;;;;;;QAajD,CAAC;AAET;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAgB,gBAAgB,EAAE,WAAmB,EAAE,EAAU,EAAE,CAAC;;;;;WAKlG,KAAK;WACL,UAAU;;;;;QAKb,eAAe;0BACG,QAAQ;;;;QAI1B,CAAC;AAET;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAW,EAAE,CAAC;;;;;;WAMjC,UAAU;;;;;QAKb,eAAe;;;;;QAKf,CAAC"}
@@ -14,4 +14,4 @@ export declare const getAuthByTokenError: (req: Request) => {
14
14
  } | undefined;
15
15
  export declare const authByToken: (req: Request, res: Response) => boolean;
16
16
  export declare const authTokenMW: (req: Request, res: Response, next: NextFunction) => void;
17
- //# sourceMappingURL=token.d.ts.map
17
+ //# sourceMappingURL=token-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-auth.d.ts","sourceRoot":"","sources":["../../../src/core/token/token-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAc1D,eAAO,MAAM,SAAS,GAAI,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CActG,CAAC;AAGF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,OAAO,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAatF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,YAOtD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,SAO1E,CAAC"}
@@ -4,9 +4,7 @@ import { debugTokenAuth } from '../debug.js';
4
4
  import { appConfig } from '../bootstrap/init-config.js';
5
5
  const { enabled } = appConfig.webServer.auth;
6
6
  const getTokenFromHttpHeader = (req) => {
7
- const { authorization = '', user = '' } = req.headers;
8
- const token = authorization.replace(/^Bearer */, '');
9
- return { user: String(user).toLowerCase(), token };
7
+ return (req.headers.authorization || '').replace(/^Bearer */, '');
10
8
  };
11
9
  const SHOW_HEADERS_SET = new Set(['user', 'authorization', 'x-real-ip', 'x-mode', 'host']);
12
10
  export const debugAuth = (req, code, message) => {
@@ -33,11 +31,11 @@ export const getAuthByTokenError = (req) => {
33
31
  if (!enabled) {
34
32
  return undefined;
35
33
  }
36
- const { token, user } = getTokenFromHttpHeader(req);
34
+ const token = getTokenFromHttpHeader(req);
37
35
  if (!token) {
38
36
  return debugAuth(req, 400, 'Missing authorization header');
39
37
  }
40
- const checkResult = checkToken(token, user);
38
+ const checkResult = checkToken({ token });
41
39
  if (checkResult.errorReason) {
42
40
  return debugAuth(req, 401, checkResult.errorReason);
43
41
  }
@@ -59,4 +57,4 @@ export const authTokenMW = (req, res, next) => {
59
57
  }
60
58
  next();
61
59
  };
62
- //# sourceMappingURL=token.js.map
60
+ //# sourceMappingURL=token-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-auth.js","sourceRoot":"","sources":["../../../src/core/token/token-auth.ts"],"names":[],"mappings":"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"}
@@ -20,5 +20,9 @@ export declare const generateToken: (user: string, liveTimeSec: number, payload?
20
20
  * - the obsolescence time must not be expired
21
21
  * - If a user is transferred, it must match
22
22
  */
23
- export declare const checkToken: (token: string, expectedUser?: string) => ICheckTokenResult;
23
+ export declare const checkToken: (arg: {
24
+ token: string;
25
+ expectedUser?: string;
26
+ expectedService?: string;
27
+ }) => ICheckTokenResult;
24
28
  //# sourceMappingURL=token-core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-core.d.ts","sourceRoot":"","sources":["../../../src/core/token/token-core.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,cAAc,CAAC;AAkBhE,eAAO,MAAM,OAAO,QAAmC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,MAStC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,cAAc,MAAM,WAW3C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,aAAa,MAAM,EAAE,UAAU,GAAG,KAAG,MAYhF,CAAC;AAGF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,EAAE,eAAe,MAAM,KAAG,iBAiEjE,CAAC"}
1
+ {"version":3,"file":"token-core.d.ts","sourceRoot":"","sources":["../../../src/core/token/token-core.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,cAAc,CAAC;AAkBhE,eAAO,MAAM,OAAO,QAAmC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,MAStC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,cAAc,MAAM,WAW3C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,aAAa,MAAM,EAAE,UAAU,GAAG,KAAG,MAYhF,CAAC;AAGF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,KAAG,iBA2EH,CAAC"}
@@ -5,12 +5,12 @@ import { logger as lgr } from '../logger.js';
5
5
  import { isObject, trim } from '../utils/utils.js';
6
6
  import chalk from 'chalk';
7
7
  const logger = lgr.getSubLogger({ name: chalk.cyan('token-auth') });
8
- const { permanentServerTokens: pt, tokenEncryptKey } = appConfig.webServer.auth;
8
+ const { permanentServerTokens: pt, token: tokenCfg } = appConfig.webServer.auth;
9
9
  const permanentServerTokensSet = new Set(Array.isArray(pt) ? pt : [pt]);
10
10
  const ALGORITHM = 'aes-256-ctr';
11
11
  const KEY = crypto
12
12
  .createHash('sha256')
13
- .update(String(tokenEncryptKey))
13
+ .update(String(tokenCfg.encryptKey))
14
14
  .digest('base64')
15
15
  .substring(0, 32);
16
16
  export const tokenRE = /^(\d{13,})\.([\da-fA-F]{32,})$/;
@@ -66,7 +66,8 @@ export const generateToken = (user, liveTimeSec, payload) => {
66
66
  * - the obsolescence time must not be expired
67
67
  * - If a user is transferred, it must match
68
68
  */
69
- export const checkToken = (token, expectedUser) => {
69
+ export const checkToken = (arg) => {
70
+ let { token, expectedUser, expectedService = appConfig.name } = arg;
70
71
  token = (token || '').trim();
71
72
  if (!token) {
72
73
  return {
@@ -114,6 +115,15 @@ export const checkToken = (token, expectedUser) => {
114
115
  errorReason: `JWT Token: user not match :: Expected '${expectedUser}' / obtained from the token: '${payload.user}'`,
115
116
  };
116
117
  }
118
+ if (tokenCfg.checkMCPName) {
119
+ if (expectedService && payload.service !== expectedService) {
120
+ return {
121
+ isTokenDecrypted: true,
122
+ inTokenType: 'JWT',
123
+ errorReason: `JWT Token: service not match :: Expected '${expectedService}' / obtained from the token: '${payload.service}'`,
124
+ };
125
+ }
126
+ }
117
127
  let expire = Number(expirePartStr) || 0;
118
128
  const expiredOn = Date.now() - expire;
119
129
  if (expiredOn > 0) {