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.
- package/bin/fa-mcp.js +781 -0
- package/cli-template/.editorconfig +13 -0
- package/cli-template/.env.example +29 -0
- package/cli-template/.envrc +3 -0
- package/cli-template/.run/== START ==.run.xml +14 -0
- package/cli-template/.run/TEST HTTP.run.xml +5 -0
- package/cli-template/.run/TEST SSE.run.xml +5 -0
- package/cli-template/.run/TEST STDIO.run.xml +5 -0
- package/cli-template/.run/TEST search.run.xml +11 -0
- package/cli-template/.run/cb.run.xml +12 -0
- package/cli-template/.run/ci.run.xml +12 -0
- package/cli-template/.run/kill-port 3030.run.xml +5 -0
- package/cli-template/.run/lint.run.xml +12 -0
- package/cli-template/.run/lint_fix.run.xml +12 -0
- package/cli-template/.run/reinstall.run.xml +12 -0
- package/cli-template/.run/remove-nul.js.run.xml +5 -0
- package/cli-template/LICENSE +21 -0
- package/cli-template/config/_local.yaml +64 -0
- package/cli-template/config/custom-environment-variables.yaml +33 -0
- package/cli-template/config/default.yaml +101 -0
- package/cli-template/config/development.yaml +4 -0
- package/cli-template/config/production.yaml +4 -0
- package/cli-template/config/test.yaml +26 -0
- package/cli-template/deploy/.gitkeep +0 -0
- package/cli-template/deploy/config.example.yml +3 -0
- package/cli-template/deploy/mcp-template.com.conf +58 -0
- package/cli-template/deploy/pm2.config.js +30 -0
- package/cli-template/deploy/pm2reg.sh +49 -0
- package/cli-template/deploy/srv.sh +359 -0
- package/cli-template/deploy/srv.sh.readme.md +347 -0
- package/cli-template/eslint.config.js +139 -0
- package/cli-template/jest.config.js +30 -0
- package/cli-template/package.json +73 -0
- package/cli-template/scripts/kill-port.js +107 -0
- package/cli-template/scripts/npm/patch_node_modules.js +9 -0
- package/cli-template/scripts/npm/run.js +31 -0
- package/cli-template/scripts/npm/yarn-ci.ps1 +16 -0
- package/cli-template/scripts/npm/yarn-ci.sh +8 -0
- package/cli-template/scripts/npm/yarn-reinstall.ps1 +54 -0
- package/cli-template/scripts/npm/yarn-reinstall.sh +10 -0
- package/cli-template/scripts/pre-commit +58 -0
- package/cli-template/scripts/remove-nul.js +53 -0
- package/cli-template/src/_types_/common.d.ts +27 -0
- package/cli-template/src/api/router.ts +35 -0
- package/cli-template/src/api/swagger.ts +167 -0
- package/cli-template/src/asset/favicon.svg +4 -0
- package/cli-template/src/custom-resources.ts +11 -0
- package/cli-template/src/prompts/agent-brief.ts +8 -0
- package/cli-template/src/prompts/agent-prompt.ts +1 -0
- package/cli-template/src/prompts/custom-prompts.ts +12 -0
- package/cli-template/src/start.ts +84 -0
- package/cli-template/src/tools/handle-tool-call.ts +55 -0
- package/cli-template/src/tools/tools.ts +88 -0
- package/cli-template/tests/jest-simple-reporter.js +10 -0
- package/cli-template/tests/mcp/sse/mcp-sse-client-handling.md +111 -0
- package/cli-template/tests/mcp/sse/test-sse-npm-package.js +96 -0
- package/cli-template/tests/mcp/test-cases.js +143 -0
- package/cli-template/tests/mcp/test-http.js +63 -0
- package/cli-template/tests/mcp/test-sse.js +67 -0
- package/cli-template/tests/mcp/test-stdio.js +78 -0
- package/cli-template/tests/utils.ts +154 -0
- package/cli-template/tsconfig.json +48 -0
- package/cli-template/update.cjs +631 -0
- package/dist/core/_types_/active-directory-config.d.ts +24 -0
- package/dist/core/_types_/active-directory-config.d.ts.map +1 -0
- package/dist/core/_types_/active-directory-config.js +2 -0
- package/dist/core/_types_/active-directory-config.js.map +1 -0
- package/dist/core/bootstrap/init-config.d.ts.map +1 -1
- package/dist/core/bootstrap/init-config.js +14 -3
- package/dist/core/bootstrap/init-config.js.map +1 -1
- package/dist/core/bootstrap/startup-info.js +1 -1
- package/dist/core/bootstrap/startup-info.js.map +1 -1
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/init-mcp-server.js +1 -1
- package/dist/core/init-mcp-server.js.map +1 -1
- package/dist/core/token/gen-token-app/gen-token-server.d.ts.map +1 -1
- package/dist/core/token/gen-token-app/gen-token-server.js +85 -9
- package/dist/core/token/gen-token-app/gen-token-server.js.map +1 -1
- package/dist/core/token/gen-token-app/html.d.ts +8 -1
- package/dist/core/token/gen-token-app/html.d.ts.map +1 -1
- package/dist/core/token/gen-token-app/html.js +98 -2
- package/dist/core/token/gen-token-app/html.js.map +1 -1
- package/dist/core/token/gen-token-app/ntlm-auth-options.d.ts +4 -0
- package/dist/core/token/gen-token-app/ntlm-auth-options.d.ts.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-auth-options.js +94 -0
- package/dist/core/token/gen-token-app/ntlm-auth-options.js.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-domain-config.d.ts +16 -0
- package/dist/core/token/gen-token-app/ntlm-domain-config.d.ts.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-domain-config.js +71 -0
- package/dist/core/token/gen-token-app/ntlm-domain-config.js.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-integration.d.ts +3 -0
- package/dist/core/token/gen-token-app/ntlm-integration.d.ts.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-integration.js +69 -0
- package/dist/core/token/gen-token-app/ntlm-integration.js.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-session-storage.d.ts +16 -0
- package/dist/core/token/gen-token-app/ntlm-session-storage.d.ts.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-session-storage.js +74 -0
- package/dist/core/token/gen-token-app/ntlm-session-storage.js.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-templates.d.ts +21 -0
- package/dist/core/token/gen-token-app/ntlm-templates.d.ts.map +1 -0
- package/dist/core/token/gen-token-app/ntlm-templates.js +246 -0
- package/dist/core/token/gen-token-app/ntlm-templates.js.map +1 -0
- package/dist/core/token/{token.d.ts → token-auth.d.ts} +1 -1
- package/dist/core/token/token-auth.d.ts.map +1 -0
- package/dist/core/token/{token.js → token-auth.js} +4 -6
- package/dist/core/token/token-auth.js.map +1 -0
- package/dist/core/token/token-core.d.ts +5 -1
- package/dist/core/token/token-core.d.ts.map +1 -1
- package/dist/core/token/token-core.js +13 -3
- package/dist/core/token/token-core.js.map +1 -1
- package/dist/core/web/about-page/render.d.ts.map +1 -1
- package/dist/core/web/about-page/render.js +26 -3
- package/dist/core/web/about-page/render.js.map +1 -1
- package/dist/core/web/server-http.js +1 -1
- package/dist/core/web/server-http.js.map +1 -1
- package/package.json +10 -3
- package/dist/core/token/token.d.ts.map +0 -1
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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: (
|
|
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,
|
|
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,
|
|
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(
|
|
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 = (
|
|
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) {
|