@structured-world/gitlab-mcp 5.7.0 → 5.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +236 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.js +6 -1
- package/dist/config.js.map +1 -1
- package/dist/entities/core/registry.js +53 -20
- package/dist/entities/core/registry.js.map +1 -1
- package/dist/entities/core/schema-readonly.d.ts +172 -442
- package/dist/entities/core/schema.d.ts +65 -173
- package/dist/entities/files/registry.js +42 -19
- package/dist/entities/files/registry.js.map +1 -1
- package/dist/entities/files/schema-readonly.d.ts +24 -124
- package/dist/entities/files/schema.d.ts +17 -82
- package/dist/entities/labels/registry.js +39 -6
- package/dist/entities/labels/registry.js.map +1 -1
- package/dist/entities/labels/schema-readonly.d.ts +6 -24
- package/dist/entities/labels/schema.d.ts +5 -37
- package/dist/entities/milestones/registry.js +44 -11
- package/dist/entities/milestones/registry.js.map +1 -1
- package/dist/entities/milestones/schema-readonly.d.ts +20 -100
- package/dist/entities/milestones/schema.d.ts +11 -48
- package/dist/entities/mrs/registry.js +56 -23
- package/dist/entities/mrs/registry.js.map +1 -1
- package/dist/entities/mrs/schema-readonly.d.ts +68 -243
- package/dist/entities/mrs/schema.d.ts +142 -885
- package/dist/entities/pipelines/registry.js +46 -13
- package/dist/entities/pipelines/registry.js.map +1 -1
- package/dist/entities/pipelines/schema-readonly.d.ts +115 -525
- package/dist/entities/pipelines/schema.d.ts +30 -104
- package/dist/entities/shared.d.ts +110 -787
- package/dist/entities/utils.d.ts +2 -2
- package/dist/entities/variables/registry.js +40 -7
- package/dist/entities/variables/registry.js.map +1 -1
- package/dist/entities/variables/schema-readonly.d.ts +3 -28
- package/dist/entities/variables/schema.d.ts +20 -80
- package/dist/entities/wiki/registry.js +39 -6
- package/dist/entities/wiki/registry.js.map +1 -1
- package/dist/entities/wiki/schema-readonly.d.ts +4 -35
- package/dist/entities/wiki/schema.d.ts +3 -31
- package/dist/entities/workitems/registry.js +40 -7
- package/dist/entities/workitems/registry.js.map +1 -1
- package/dist/entities/workitems/schema-readonly.d.ts +35 -32
- package/dist/entities/workitems/schema-readonly.js +1 -1
- package/dist/entities/workitems/schema-readonly.js.map +1 -1
- package/dist/entities/workitems/schema.d.ts +21 -45
- package/dist/middleware/index.d.ts +1 -0
- package/dist/middleware/index.js +8 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/oauth-auth.d.ts +4 -0
- package/dist/middleware/oauth-auth.js +135 -0
- package/dist/middleware/oauth-auth.js.map +1 -0
- package/dist/oauth/config.d.ts +19 -0
- package/dist/oauth/config.js +70 -0
- package/dist/oauth/config.js.map +1 -0
- package/dist/oauth/endpoints/authorize.d.ts +3 -0
- package/dist/oauth/endpoints/authorize.js +414 -0
- package/dist/oauth/endpoints/authorize.js.map +1 -0
- package/dist/oauth/endpoints/index.d.ts +3 -0
- package/dist/oauth/endpoints/index.js +13 -0
- package/dist/oauth/endpoints/index.js.map +1 -0
- package/dist/oauth/endpoints/metadata.d.ts +4 -0
- package/dist/oauth/endpoints/metadata.js +36 -0
- package/dist/oauth/endpoints/metadata.js.map +1 -0
- package/dist/oauth/endpoints/token.d.ts +2 -0
- package/dist/oauth/endpoints/token.js +159 -0
- package/dist/oauth/endpoints/token.js.map +1 -0
- package/dist/oauth/gitlab-device-flow.d.ts +8 -0
- package/dist/oauth/gitlab-device-flow.js +172 -0
- package/dist/oauth/gitlab-device-flow.js.map +1 -0
- package/dist/oauth/index.d.ts +8 -0
- package/dist/oauth/index.js +48 -0
- package/dist/oauth/index.js.map +1 -0
- package/dist/oauth/session-store.d.ts +37 -0
- package/dist/oauth/session-store.js +182 -0
- package/dist/oauth/session-store.js.map +1 -0
- package/dist/oauth/token-context.d.ts +8 -0
- package/dist/oauth/token-context.js +40 -0
- package/dist/oauth/token-context.js.map +1 -0
- package/dist/oauth/token-utils.d.ts +14 -0
- package/dist/oauth/token-utils.js +148 -0
- package/dist/oauth/token-utils.js.map +1 -0
- package/dist/oauth/types.d.ts +94 -0
- package/dist/oauth/types.js +3 -0
- package/dist/oauth/types.js.map +1 -0
- package/dist/server.js +147 -9
- package/dist/server.js.map +1 -1
- package/dist/structured-world-gitlab-mcp-5.8.0.tgz +0 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/fetch.d.ts +3 -7
- package/dist/utils/fetch.js +82 -54
- package/dist/utils/fetch.js.map +1 -1
- package/package.json +23 -23
- package/dist/structured-world-gitlab-mcp-5.7.0.tgz +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { OAuthConfig } from "./config";
|
|
2
|
+
import { GitLabDeviceResponse, GitLabTokenResponse, GitLabUserInfo } from "./types";
|
|
3
|
+
export declare function initiateDeviceFlow(config: OAuthConfig): Promise<GitLabDeviceResponse>;
|
|
4
|
+
export declare function pollDeviceFlowOnce(deviceCode: string, config: OAuthConfig): Promise<GitLabTokenResponse | null>;
|
|
5
|
+
export declare function pollForToken(deviceCode: string, config: OAuthConfig, onPending?: () => void): Promise<GitLabTokenResponse>;
|
|
6
|
+
export declare function refreshGitLabToken(refreshToken: string, config: OAuthConfig): Promise<GitLabTokenResponse>;
|
|
7
|
+
export declare function getGitLabUser(accessToken: string): Promise<GitLabUserInfo>;
|
|
8
|
+
export declare function validateGitLabToken(accessToken: string): Promise<boolean>;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initiateDeviceFlow = initiateDeviceFlow;
|
|
4
|
+
exports.pollDeviceFlowOnce = pollDeviceFlowOnce;
|
|
5
|
+
exports.pollForToken = pollForToken;
|
|
6
|
+
exports.refreshGitLabToken = refreshGitLabToken;
|
|
7
|
+
exports.getGitLabUser = getGitLabUser;
|
|
8
|
+
exports.validateGitLabToken = validateGitLabToken;
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
const logger_1 = require("../logger");
|
|
11
|
+
async function initiateDeviceFlow(config) {
|
|
12
|
+
const url = `${config_1.GITLAB_BASE_URL}/oauth/authorize_device`;
|
|
13
|
+
logger_1.logger.debug({ url, clientId: config.gitlabClientId }, "Initiating GitLab device flow");
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: {
|
|
17
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
18
|
+
Accept: "application/json",
|
|
19
|
+
},
|
|
20
|
+
body: new URLSearchParams({
|
|
21
|
+
client_id: config.gitlabClientId,
|
|
22
|
+
scope: config.gitlabScopes,
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
const errorText = await response.text();
|
|
27
|
+
logger_1.logger.error({ status: response.status, error: errorText }, "Failed to initiate device flow");
|
|
28
|
+
throw new Error(`Failed to initiate device flow: ${response.status} ${errorText}`);
|
|
29
|
+
}
|
|
30
|
+
const data = (await response.json());
|
|
31
|
+
logger_1.logger.info({
|
|
32
|
+
userCode: data.user_code,
|
|
33
|
+
verificationUri: data.verification_uri,
|
|
34
|
+
expiresIn: data.expires_in,
|
|
35
|
+
}, "Device flow initiated");
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
async function pollDeviceFlowOnce(deviceCode, config) {
|
|
39
|
+
const url = `${config_1.GITLAB_BASE_URL}/oauth/token`;
|
|
40
|
+
const params = {
|
|
41
|
+
client_id: config.gitlabClientId,
|
|
42
|
+
device_code: deviceCode,
|
|
43
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
44
|
+
};
|
|
45
|
+
if (config.gitlabClientSecret) {
|
|
46
|
+
params.client_secret = config.gitlabClientSecret;
|
|
47
|
+
}
|
|
48
|
+
const response = await fetch(url, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
headers: {
|
|
51
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
52
|
+
Accept: "application/json",
|
|
53
|
+
},
|
|
54
|
+
body: new URLSearchParams(params),
|
|
55
|
+
});
|
|
56
|
+
if (response.ok) {
|
|
57
|
+
const data = (await response.json());
|
|
58
|
+
logger_1.logger.info("Device flow authorization completed successfully");
|
|
59
|
+
return data;
|
|
60
|
+
}
|
|
61
|
+
const error = (await response.json());
|
|
62
|
+
switch (error.error) {
|
|
63
|
+
case "authorization_pending":
|
|
64
|
+
return null;
|
|
65
|
+
case "slow_down":
|
|
66
|
+
logger_1.logger.debug("Device flow: slow_down received, should increase poll interval");
|
|
67
|
+
return null;
|
|
68
|
+
case "expired_token":
|
|
69
|
+
throw new Error("Device code expired. Please start a new authorization.");
|
|
70
|
+
case "access_denied":
|
|
71
|
+
throw new Error("User denied the authorization request.");
|
|
72
|
+
case "invalid_grant":
|
|
73
|
+
throw new Error("Invalid device code or grant.");
|
|
74
|
+
default:
|
|
75
|
+
throw new Error(`Device flow error: ${error.error_description ?? error.error}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function pollForToken(deviceCode, config, onPending) {
|
|
79
|
+
const startTime = Date.now();
|
|
80
|
+
const timeout = config.deviceTimeout * 1000;
|
|
81
|
+
let interval = config.devicePollInterval * 1000;
|
|
82
|
+
while (Date.now() - startTime < timeout) {
|
|
83
|
+
await sleep(interval);
|
|
84
|
+
try {
|
|
85
|
+
const result = await pollDeviceFlowOnce(deviceCode, config);
|
|
86
|
+
if (result) {
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
onPending?.();
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error instanceof Error) {
|
|
93
|
+
if (error.message.includes("expired") ||
|
|
94
|
+
error.message.includes("denied") ||
|
|
95
|
+
error.message.includes("invalid")) {
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
logger_1.logger.warn({ err: error }, "Device flow poll error, will retry");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw new Error(`Device flow timeout after ${config.deviceTimeout} seconds`);
|
|
103
|
+
}
|
|
104
|
+
async function refreshGitLabToken(refreshToken, config) {
|
|
105
|
+
const url = `${config_1.GITLAB_BASE_URL}/oauth/token`;
|
|
106
|
+
const params = {
|
|
107
|
+
client_id: config.gitlabClientId,
|
|
108
|
+
refresh_token: refreshToken,
|
|
109
|
+
grant_type: "refresh_token",
|
|
110
|
+
};
|
|
111
|
+
if (config.gitlabClientSecret) {
|
|
112
|
+
params.client_secret = config.gitlabClientSecret;
|
|
113
|
+
}
|
|
114
|
+
logger_1.logger.debug("Refreshing GitLab token");
|
|
115
|
+
const response = await fetch(url, {
|
|
116
|
+
method: "POST",
|
|
117
|
+
headers: {
|
|
118
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
119
|
+
Accept: "application/json",
|
|
120
|
+
},
|
|
121
|
+
body: new URLSearchParams(params),
|
|
122
|
+
});
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const errorText = await response.text();
|
|
125
|
+
logger_1.logger.error({ status: response.status, error: errorText }, "Failed to refresh GitLab token");
|
|
126
|
+
throw new Error(`Failed to refresh token: ${response.status} ${errorText}`);
|
|
127
|
+
}
|
|
128
|
+
const data = (await response.json());
|
|
129
|
+
logger_1.logger.info("GitLab token refreshed successfully");
|
|
130
|
+
return data;
|
|
131
|
+
}
|
|
132
|
+
async function getGitLabUser(accessToken) {
|
|
133
|
+
const url = `${config_1.GITLAB_BASE_URL}/api/v4/user`;
|
|
134
|
+
const response = await fetch(url, {
|
|
135
|
+
headers: {
|
|
136
|
+
Authorization: `Bearer ${accessToken}`,
|
|
137
|
+
Accept: "application/json",
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
if (!response.ok) {
|
|
141
|
+
const errorText = await response.text();
|
|
142
|
+
logger_1.logger.error({ status: response.status, error: errorText }, "Failed to get GitLab user info");
|
|
143
|
+
throw new Error(`Failed to get GitLab user info: ${response.status}`);
|
|
144
|
+
}
|
|
145
|
+
const user = (await response.json());
|
|
146
|
+
logger_1.logger.debug({ userId: user.id, username: user.username }, "Retrieved GitLab user info");
|
|
147
|
+
return {
|
|
148
|
+
id: user.id,
|
|
149
|
+
username: user.username,
|
|
150
|
+
name: user.name,
|
|
151
|
+
email: user.email,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
async function validateGitLabToken(accessToken) {
|
|
155
|
+
try {
|
|
156
|
+
const url = `${config_1.GITLAB_BASE_URL}/api/v4/user`;
|
|
157
|
+
const response = await fetch(url, {
|
|
158
|
+
method: "HEAD",
|
|
159
|
+
headers: {
|
|
160
|
+
Authorization: `Bearer ${accessToken}`,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
return response.ok;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function sleep(ms) {
|
|
170
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=gitlab-device-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-device-flow.js","sourceRoot":"","sources":["../../src/oauth/gitlab-device-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { loadOAuthConfig, validateStaticConfig, isOAuthEnabled, getAuthModeDescription, resetOAuthConfigCache, } from "./config";
|
|
2
|
+
export type { OAuthConfig } from "./config";
|
|
3
|
+
export type { OAuthSession, DeviceFlowState, AuthorizationCode, GitLabTokenResponse, GitLabDeviceResponse, TokenContext, GitLabUserInfo, MCPTokenResponse, OAuthErrorResponse, DeviceFlowPollStatus, DeviceFlowPollResponse, MCPTokenPayload, } from "./types";
|
|
4
|
+
export { sessionStore } from "./session-store";
|
|
5
|
+
export { runWithTokenContext, getTokenContext, getGitLabTokenFromContext, getGitLabUserIdFromContext, getGitLabUsernameFromContext, getSessionIdFromContext, isInOAuthContext, } from "./token-context";
|
|
6
|
+
export { createJWT, verifyJWT, verifyMCPToken, generateCodeVerifier, generateCodeChallenge, verifyCodeChallenge, generateRandomString, generateUUID, generateAuthorizationCode, generateSessionId, generateRefreshToken, isTokenExpiringSoon, calculateTokenExpiry, } from "./token-utils";
|
|
7
|
+
export { initiateDeviceFlow, pollDeviceFlowOnce, pollForToken, refreshGitLabToken, getGitLabUser, validateGitLabToken, } from "./gitlab-device-flow";
|
|
8
|
+
export { metadataHandler, healthHandler, getBaseUrl, authorizeHandler, pollHandler, tokenHandler, } from "./endpoints/index";
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tokenHandler = exports.pollHandler = exports.authorizeHandler = exports.getBaseUrl = exports.healthHandler = exports.metadataHandler = exports.validateGitLabToken = exports.getGitLabUser = exports.refreshGitLabToken = exports.pollForToken = exports.pollDeviceFlowOnce = exports.initiateDeviceFlow = exports.calculateTokenExpiry = exports.isTokenExpiringSoon = exports.generateRefreshToken = exports.generateSessionId = exports.generateAuthorizationCode = exports.generateUUID = exports.generateRandomString = exports.verifyCodeChallenge = exports.generateCodeChallenge = exports.generateCodeVerifier = exports.verifyMCPToken = exports.verifyJWT = exports.createJWT = exports.isInOAuthContext = exports.getSessionIdFromContext = exports.getGitLabUsernameFromContext = exports.getGitLabUserIdFromContext = exports.getGitLabTokenFromContext = exports.getTokenContext = exports.runWithTokenContext = exports.sessionStore = exports.resetOAuthConfigCache = exports.getAuthModeDescription = exports.isOAuthEnabled = exports.validateStaticConfig = exports.loadOAuthConfig = void 0;
|
|
4
|
+
var config_1 = require("./config");
|
|
5
|
+
Object.defineProperty(exports, "loadOAuthConfig", { enumerable: true, get: function () { return config_1.loadOAuthConfig; } });
|
|
6
|
+
Object.defineProperty(exports, "validateStaticConfig", { enumerable: true, get: function () { return config_1.validateStaticConfig; } });
|
|
7
|
+
Object.defineProperty(exports, "isOAuthEnabled", { enumerable: true, get: function () { return config_1.isOAuthEnabled; } });
|
|
8
|
+
Object.defineProperty(exports, "getAuthModeDescription", { enumerable: true, get: function () { return config_1.getAuthModeDescription; } });
|
|
9
|
+
Object.defineProperty(exports, "resetOAuthConfigCache", { enumerable: true, get: function () { return config_1.resetOAuthConfigCache; } });
|
|
10
|
+
var session_store_1 = require("./session-store");
|
|
11
|
+
Object.defineProperty(exports, "sessionStore", { enumerable: true, get: function () { return session_store_1.sessionStore; } });
|
|
12
|
+
var token_context_1 = require("./token-context");
|
|
13
|
+
Object.defineProperty(exports, "runWithTokenContext", { enumerable: true, get: function () { return token_context_1.runWithTokenContext; } });
|
|
14
|
+
Object.defineProperty(exports, "getTokenContext", { enumerable: true, get: function () { return token_context_1.getTokenContext; } });
|
|
15
|
+
Object.defineProperty(exports, "getGitLabTokenFromContext", { enumerable: true, get: function () { return token_context_1.getGitLabTokenFromContext; } });
|
|
16
|
+
Object.defineProperty(exports, "getGitLabUserIdFromContext", { enumerable: true, get: function () { return token_context_1.getGitLabUserIdFromContext; } });
|
|
17
|
+
Object.defineProperty(exports, "getGitLabUsernameFromContext", { enumerable: true, get: function () { return token_context_1.getGitLabUsernameFromContext; } });
|
|
18
|
+
Object.defineProperty(exports, "getSessionIdFromContext", { enumerable: true, get: function () { return token_context_1.getSessionIdFromContext; } });
|
|
19
|
+
Object.defineProperty(exports, "isInOAuthContext", { enumerable: true, get: function () { return token_context_1.isInOAuthContext; } });
|
|
20
|
+
var token_utils_1 = require("./token-utils");
|
|
21
|
+
Object.defineProperty(exports, "createJWT", { enumerable: true, get: function () { return token_utils_1.createJWT; } });
|
|
22
|
+
Object.defineProperty(exports, "verifyJWT", { enumerable: true, get: function () { return token_utils_1.verifyJWT; } });
|
|
23
|
+
Object.defineProperty(exports, "verifyMCPToken", { enumerable: true, get: function () { return token_utils_1.verifyMCPToken; } });
|
|
24
|
+
Object.defineProperty(exports, "generateCodeVerifier", { enumerable: true, get: function () { return token_utils_1.generateCodeVerifier; } });
|
|
25
|
+
Object.defineProperty(exports, "generateCodeChallenge", { enumerable: true, get: function () { return token_utils_1.generateCodeChallenge; } });
|
|
26
|
+
Object.defineProperty(exports, "verifyCodeChallenge", { enumerable: true, get: function () { return token_utils_1.verifyCodeChallenge; } });
|
|
27
|
+
Object.defineProperty(exports, "generateRandomString", { enumerable: true, get: function () { return token_utils_1.generateRandomString; } });
|
|
28
|
+
Object.defineProperty(exports, "generateUUID", { enumerable: true, get: function () { return token_utils_1.generateUUID; } });
|
|
29
|
+
Object.defineProperty(exports, "generateAuthorizationCode", { enumerable: true, get: function () { return token_utils_1.generateAuthorizationCode; } });
|
|
30
|
+
Object.defineProperty(exports, "generateSessionId", { enumerable: true, get: function () { return token_utils_1.generateSessionId; } });
|
|
31
|
+
Object.defineProperty(exports, "generateRefreshToken", { enumerable: true, get: function () { return token_utils_1.generateRefreshToken; } });
|
|
32
|
+
Object.defineProperty(exports, "isTokenExpiringSoon", { enumerable: true, get: function () { return token_utils_1.isTokenExpiringSoon; } });
|
|
33
|
+
Object.defineProperty(exports, "calculateTokenExpiry", { enumerable: true, get: function () { return token_utils_1.calculateTokenExpiry; } });
|
|
34
|
+
var gitlab_device_flow_1 = require("./gitlab-device-flow");
|
|
35
|
+
Object.defineProperty(exports, "initiateDeviceFlow", { enumerable: true, get: function () { return gitlab_device_flow_1.initiateDeviceFlow; } });
|
|
36
|
+
Object.defineProperty(exports, "pollDeviceFlowOnce", { enumerable: true, get: function () { return gitlab_device_flow_1.pollDeviceFlowOnce; } });
|
|
37
|
+
Object.defineProperty(exports, "pollForToken", { enumerable: true, get: function () { return gitlab_device_flow_1.pollForToken; } });
|
|
38
|
+
Object.defineProperty(exports, "refreshGitLabToken", { enumerable: true, get: function () { return gitlab_device_flow_1.refreshGitLabToken; } });
|
|
39
|
+
Object.defineProperty(exports, "getGitLabUser", { enumerable: true, get: function () { return gitlab_device_flow_1.getGitLabUser; } });
|
|
40
|
+
Object.defineProperty(exports, "validateGitLabToken", { enumerable: true, get: function () { return gitlab_device_flow_1.validateGitLabToken; } });
|
|
41
|
+
var index_1 = require("./endpoints/index");
|
|
42
|
+
Object.defineProperty(exports, "metadataHandler", { enumerable: true, get: function () { return index_1.metadataHandler; } });
|
|
43
|
+
Object.defineProperty(exports, "healthHandler", { enumerable: true, get: function () { return index_1.healthHandler; } });
|
|
44
|
+
Object.defineProperty(exports, "getBaseUrl", { enumerable: true, get: function () { return index_1.getBaseUrl; } });
|
|
45
|
+
Object.defineProperty(exports, "authorizeHandler", { enumerable: true, get: function () { return index_1.authorizeHandler; } });
|
|
46
|
+
Object.defineProperty(exports, "pollHandler", { enumerable: true, get: function () { return index_1.pollHandler; } });
|
|
47
|
+
Object.defineProperty(exports, "tokenHandler", { enumerable: true, get: function () { return index_1.tokenHandler; } });
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":";;;AAQA,mCAMkB;AALhB,yGAAA,eAAe,OAAA;AACf,8GAAA,oBAAoB,OAAA;AACpB,wGAAA,cAAc,OAAA;AACd,gHAAA,sBAAsB,OAAA;AACtB,+GAAA,qBAAqB,OAAA;AAqBvB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAGrB,iDAQyB;AAPvB,oHAAA,mBAAmB,OAAA;AACnB,gHAAA,eAAe,OAAA;AACf,0HAAA,yBAAyB,OAAA;AACzB,2HAAA,0BAA0B,OAAA;AAC1B,6HAAA,4BAA4B,OAAA;AAC5B,wHAAA,uBAAuB,OAAA;AACvB,iHAAA,gBAAgB,OAAA;AAIlB,6CAcuB;AAbrB,wGAAA,SAAS,OAAA;AACT,wGAAA,SAAS,OAAA;AACT,6GAAA,cAAc,OAAA;AACd,mHAAA,oBAAoB,OAAA;AACpB,oHAAA,qBAAqB,OAAA;AACrB,kHAAA,mBAAmB,OAAA;AACnB,mHAAA,oBAAoB,OAAA;AACpB,2GAAA,YAAY,OAAA;AACZ,wHAAA,yBAAyB,OAAA;AACzB,gHAAA,iBAAiB,OAAA;AACjB,mHAAA,oBAAoB,OAAA;AACpB,kHAAA,mBAAmB,OAAA;AACnB,mHAAA,oBAAoB,OAAA;AAItB,2DAO8B;AAN5B,wHAAA,kBAAkB,OAAA;AAClB,wHAAA,kBAAkB,OAAA;AAClB,kHAAA,YAAY,OAAA;AACZ,wHAAA,kBAAkB,OAAA;AAClB,mHAAA,aAAa,OAAA;AACb,yHAAA,mBAAmB,OAAA;AAIrB,2CAO2B;AANzB,wGAAA,eAAe,OAAA;AACf,sGAAA,aAAa,OAAA;AACb,mGAAA,UAAU,OAAA;AACV,yGAAA,gBAAgB,OAAA;AAChB,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { OAuthSession, DeviceFlowState, AuthorizationCode } from "./types";
|
|
2
|
+
export declare class SessionStore {
|
|
3
|
+
private sessions;
|
|
4
|
+
private deviceFlows;
|
|
5
|
+
private authCodes;
|
|
6
|
+
private tokenToSession;
|
|
7
|
+
private refreshTokenToSession;
|
|
8
|
+
private cleanupIntervalId;
|
|
9
|
+
constructor();
|
|
10
|
+
createSession(session: OAuthSession): void;
|
|
11
|
+
getSession(sessionId: string): OAuthSession | undefined;
|
|
12
|
+
getSessionByToken(token: string): OAuthSession | undefined;
|
|
13
|
+
getSessionByRefreshToken(refreshToken: string): OAuthSession | undefined;
|
|
14
|
+
updateSession(sessionId: string, updates: Partial<OAuthSession>): boolean;
|
|
15
|
+
deleteSession(sessionId: string): boolean;
|
|
16
|
+
getAllSessions(): IterableIterator<OAuthSession>;
|
|
17
|
+
getSessionCount(): number;
|
|
18
|
+
storeDeviceFlow(state: string, flow: DeviceFlowState): void;
|
|
19
|
+
getDeviceFlow(state: string): DeviceFlowState | undefined;
|
|
20
|
+
getDeviceFlowByDeviceCode(deviceCode: string): DeviceFlowState | undefined;
|
|
21
|
+
deleteDeviceFlow(state: string): boolean;
|
|
22
|
+
getDeviceFlowCount(): number;
|
|
23
|
+
storeAuthCode(code: AuthorizationCode): void;
|
|
24
|
+
getAuthCode(code: string): AuthorizationCode | undefined;
|
|
25
|
+
deleteAuthCode(code: string): boolean;
|
|
26
|
+
getAuthCodeCount(): number;
|
|
27
|
+
cleanup(): void;
|
|
28
|
+
private startCleanupInterval;
|
|
29
|
+
stopCleanupInterval(): void;
|
|
30
|
+
clear(): void;
|
|
31
|
+
getStats(): {
|
|
32
|
+
sessions: number;
|
|
33
|
+
deviceFlows: number;
|
|
34
|
+
authCodes: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export declare const sessionStore: SessionStore;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sessionStore = exports.SessionStore = void 0;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
5
|
+
class SessionStore {
|
|
6
|
+
sessions = new Map();
|
|
7
|
+
deviceFlows = new Map();
|
|
8
|
+
authCodes = new Map();
|
|
9
|
+
tokenToSession = new Map();
|
|
10
|
+
refreshTokenToSession = new Map();
|
|
11
|
+
cleanupIntervalId = null;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.startCleanupInterval();
|
|
14
|
+
}
|
|
15
|
+
createSession(session) {
|
|
16
|
+
this.sessions.set(session.id, session);
|
|
17
|
+
if (session.mcpAccessToken) {
|
|
18
|
+
this.tokenToSession.set(session.mcpAccessToken, session.id);
|
|
19
|
+
}
|
|
20
|
+
if (session.mcpRefreshToken) {
|
|
21
|
+
this.refreshTokenToSession.set(session.mcpRefreshToken, session.id);
|
|
22
|
+
}
|
|
23
|
+
logger_1.logger.debug({ sessionId: session.id, userId: session.gitlabUserId }, "Session created");
|
|
24
|
+
}
|
|
25
|
+
getSession(sessionId) {
|
|
26
|
+
return this.sessions.get(sessionId);
|
|
27
|
+
}
|
|
28
|
+
getSessionByToken(token) {
|
|
29
|
+
const sessionId = this.tokenToSession.get(token);
|
|
30
|
+
return sessionId ? this.sessions.get(sessionId) : undefined;
|
|
31
|
+
}
|
|
32
|
+
getSessionByRefreshToken(refreshToken) {
|
|
33
|
+
const sessionId = this.refreshTokenToSession.get(refreshToken);
|
|
34
|
+
return sessionId ? this.sessions.get(sessionId) : undefined;
|
|
35
|
+
}
|
|
36
|
+
updateSession(sessionId, updates) {
|
|
37
|
+
const session = this.sessions.get(sessionId);
|
|
38
|
+
if (!session) {
|
|
39
|
+
logger_1.logger.warn({ sessionId }, "Attempted to update non-existent session");
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (updates.mcpAccessToken && updates.mcpAccessToken !== session.mcpAccessToken) {
|
|
43
|
+
this.tokenToSession.delete(session.mcpAccessToken);
|
|
44
|
+
this.tokenToSession.set(updates.mcpAccessToken, sessionId);
|
|
45
|
+
}
|
|
46
|
+
if (updates.mcpRefreshToken && updates.mcpRefreshToken !== session.mcpRefreshToken) {
|
|
47
|
+
this.refreshTokenToSession.delete(session.mcpRefreshToken);
|
|
48
|
+
this.refreshTokenToSession.set(updates.mcpRefreshToken, sessionId);
|
|
49
|
+
}
|
|
50
|
+
Object.assign(session, updates, { updatedAt: Date.now() });
|
|
51
|
+
logger_1.logger.debug({ sessionId }, "Session updated");
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
deleteSession(sessionId) {
|
|
55
|
+
const session = this.sessions.get(sessionId);
|
|
56
|
+
if (!session) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (session.mcpAccessToken) {
|
|
60
|
+
this.tokenToSession.delete(session.mcpAccessToken);
|
|
61
|
+
}
|
|
62
|
+
if (session.mcpRefreshToken) {
|
|
63
|
+
this.refreshTokenToSession.delete(session.mcpRefreshToken);
|
|
64
|
+
}
|
|
65
|
+
this.sessions.delete(sessionId);
|
|
66
|
+
logger_1.logger.debug({ sessionId }, "Session deleted");
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
getAllSessions() {
|
|
70
|
+
return this.sessions.values();
|
|
71
|
+
}
|
|
72
|
+
getSessionCount() {
|
|
73
|
+
return this.sessions.size;
|
|
74
|
+
}
|
|
75
|
+
storeDeviceFlow(state, flow) {
|
|
76
|
+
this.deviceFlows.set(state, flow);
|
|
77
|
+
logger_1.logger.debug({ state, userCode: flow.userCode }, "Device flow stored");
|
|
78
|
+
}
|
|
79
|
+
getDeviceFlow(state) {
|
|
80
|
+
return this.deviceFlows.get(state);
|
|
81
|
+
}
|
|
82
|
+
getDeviceFlowByDeviceCode(deviceCode) {
|
|
83
|
+
for (const flow of this.deviceFlows.values()) {
|
|
84
|
+
if (flow.deviceCode === deviceCode) {
|
|
85
|
+
return flow;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
deleteDeviceFlow(state) {
|
|
91
|
+
const deleted = this.deviceFlows.delete(state);
|
|
92
|
+
if (deleted) {
|
|
93
|
+
logger_1.logger.debug({ state }, "Device flow deleted");
|
|
94
|
+
}
|
|
95
|
+
return deleted;
|
|
96
|
+
}
|
|
97
|
+
getDeviceFlowCount() {
|
|
98
|
+
return this.deviceFlows.size;
|
|
99
|
+
}
|
|
100
|
+
storeAuthCode(code) {
|
|
101
|
+
this.authCodes.set(code.code, code);
|
|
102
|
+
logger_1.logger.debug({ code: code.code.substring(0, 8) + "..." }, "Auth code stored");
|
|
103
|
+
}
|
|
104
|
+
getAuthCode(code) {
|
|
105
|
+
return this.authCodes.get(code);
|
|
106
|
+
}
|
|
107
|
+
deleteAuthCode(code) {
|
|
108
|
+
const deleted = this.authCodes.delete(code);
|
|
109
|
+
if (deleted) {
|
|
110
|
+
logger_1.logger.debug({ code: code.substring(0, 8) + "..." }, "Auth code deleted");
|
|
111
|
+
}
|
|
112
|
+
return deleted;
|
|
113
|
+
}
|
|
114
|
+
getAuthCodeCount() {
|
|
115
|
+
return this.authCodes.size;
|
|
116
|
+
}
|
|
117
|
+
cleanup() {
|
|
118
|
+
const now = Date.now();
|
|
119
|
+
let expiredSessions = 0;
|
|
120
|
+
let expiredDeviceFlows = 0;
|
|
121
|
+
let expiredAuthCodes = 0;
|
|
122
|
+
for (const [id, session] of this.sessions) {
|
|
123
|
+
const maxAge = 7 * 24 * 60 * 60 * 1000;
|
|
124
|
+
if (session.createdAt + maxAge < now) {
|
|
125
|
+
this.deleteSession(id);
|
|
126
|
+
expiredSessions++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
for (const [state, flow] of this.deviceFlows) {
|
|
130
|
+
if (flow.expiresAt < now) {
|
|
131
|
+
this.deviceFlows.delete(state);
|
|
132
|
+
expiredDeviceFlows++;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const [code, auth] of this.authCodes) {
|
|
136
|
+
if (auth.expiresAt < now) {
|
|
137
|
+
this.authCodes.delete(code);
|
|
138
|
+
expiredAuthCodes++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (expiredSessions > 0 || expiredDeviceFlows > 0 || expiredAuthCodes > 0) {
|
|
142
|
+
logger_1.logger.debug({
|
|
143
|
+
expiredSessions,
|
|
144
|
+
expiredDeviceFlows,
|
|
145
|
+
expiredAuthCodes,
|
|
146
|
+
remainingSessions: this.sessions.size,
|
|
147
|
+
}, "Session store cleanup completed");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
startCleanupInterval() {
|
|
151
|
+
this.cleanupIntervalId = setInterval(() => {
|
|
152
|
+
this.cleanup();
|
|
153
|
+
}, 5 * 60 * 1000);
|
|
154
|
+
if (this.cleanupIntervalId.unref) {
|
|
155
|
+
this.cleanupIntervalId.unref();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
stopCleanupInterval() {
|
|
159
|
+
if (this.cleanupIntervalId) {
|
|
160
|
+
clearInterval(this.cleanupIntervalId);
|
|
161
|
+
this.cleanupIntervalId = null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
clear() {
|
|
165
|
+
this.sessions.clear();
|
|
166
|
+
this.deviceFlows.clear();
|
|
167
|
+
this.authCodes.clear();
|
|
168
|
+
this.tokenToSession.clear();
|
|
169
|
+
this.refreshTokenToSession.clear();
|
|
170
|
+
logger_1.logger.debug("Session store cleared");
|
|
171
|
+
}
|
|
172
|
+
getStats() {
|
|
173
|
+
return {
|
|
174
|
+
sessions: this.sessions.size,
|
|
175
|
+
deviceFlows: this.deviceFlows.size,
|
|
176
|
+
authCodes: this.authCodes.size,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.SessionStore = SessionStore;
|
|
181
|
+
exports.sessionStore = new SessionStore();
|
|
182
|
+
//# sourceMappingURL=session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/oauth/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TokenContext } from "./types";
|
|
2
|
+
export declare function runWithTokenContext<T>(context: TokenContext, fn: () => T | Promise<T>): T | Promise<T>;
|
|
3
|
+
export declare function getTokenContext(): TokenContext | undefined;
|
|
4
|
+
export declare function getGitLabTokenFromContext(): string;
|
|
5
|
+
export declare function getGitLabUserIdFromContext(): number | undefined;
|
|
6
|
+
export declare function getGitLabUsernameFromContext(): string | undefined;
|
|
7
|
+
export declare function getSessionIdFromContext(): string | undefined;
|
|
8
|
+
export declare function isInOAuthContext(): boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runWithTokenContext = runWithTokenContext;
|
|
4
|
+
exports.getTokenContext = getTokenContext;
|
|
5
|
+
exports.getGitLabTokenFromContext = getGitLabTokenFromContext;
|
|
6
|
+
exports.getGitLabUserIdFromContext = getGitLabUserIdFromContext;
|
|
7
|
+
exports.getGitLabUsernameFromContext = getGitLabUsernameFromContext;
|
|
8
|
+
exports.getSessionIdFromContext = getSessionIdFromContext;
|
|
9
|
+
exports.isInOAuthContext = isInOAuthContext;
|
|
10
|
+
const async_hooks_1 = require("async_hooks");
|
|
11
|
+
const asyncLocalStorage = new async_hooks_1.AsyncLocalStorage();
|
|
12
|
+
function runWithTokenContext(context, fn) {
|
|
13
|
+
return asyncLocalStorage.run(context, fn);
|
|
14
|
+
}
|
|
15
|
+
function getTokenContext() {
|
|
16
|
+
return asyncLocalStorage.getStore();
|
|
17
|
+
}
|
|
18
|
+
function getGitLabTokenFromContext() {
|
|
19
|
+
const context = asyncLocalStorage.getStore();
|
|
20
|
+
if (!context) {
|
|
21
|
+
throw new Error("No OAuth token context available - this code must be called within an authenticated request");
|
|
22
|
+
}
|
|
23
|
+
return context.gitlabToken;
|
|
24
|
+
}
|
|
25
|
+
function getGitLabUserIdFromContext() {
|
|
26
|
+
const context = asyncLocalStorage.getStore();
|
|
27
|
+
return context?.gitlabUserId;
|
|
28
|
+
}
|
|
29
|
+
function getGitLabUsernameFromContext() {
|
|
30
|
+
const context = asyncLocalStorage.getStore();
|
|
31
|
+
return context?.gitlabUsername;
|
|
32
|
+
}
|
|
33
|
+
function getSessionIdFromContext() {
|
|
34
|
+
const context = asyncLocalStorage.getStore();
|
|
35
|
+
return context?.sessionId;
|
|
36
|
+
}
|
|
37
|
+
function isInOAuthContext() {
|
|
38
|
+
return asyncLocalStorage.getStore() !== undefined;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=token-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-context.js","sourceRoot":"","sources":["../../src/oauth/token-context.ts"],"names":[],"mappings":";;AA0CA,kDAKC;AAUD,0CAEC;AAWD,8DAQC;AAOD,gEAGC;AAOD,oEAGC;AAOD,0DAGC;AAOD,4CAEC;AA3GD,6CAAgD;AAShD,MAAM,iBAAiB,GAAG,IAAI,+BAAiB,EAAgB,CAAC;AAuBhE,SAAgB,mBAAmB,CACjC,OAAqB,EACrB,EAAwB;IAExB,OAAO,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAUD,SAAgB,eAAe;IAC7B,OAAO,iBAAiB,CAAC,QAAQ,EAAE,CAAC;AACtC,CAAC;AAWD,SAAgB,yBAAyB;IACvC,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,CAAC;AAC7B,CAAC;AAOD,SAAgB,0BAA0B;IACxC,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC7C,OAAO,OAAO,EAAE,YAAY,CAAC;AAC/B,CAAC;AAOD,SAAgB,4BAA4B;IAC1C,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC7C,OAAO,OAAO,EAAE,cAAc,CAAC;AACjC,CAAC;AAOD,SAAgB,uBAAuB;IACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC7C,OAAO,OAAO,EAAE,SAAS,CAAC;AAC5B,CAAC;AAOD,SAAgB,gBAAgB;IAC9B,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MCPTokenPayload } from "./types";
|
|
2
|
+
export declare function createJWT(payload: Record<string, unknown>, secret: string, expiresIn: number): string;
|
|
3
|
+
export declare function verifyJWT(token: string, secret: string): Record<string, unknown> | null;
|
|
4
|
+
export declare function verifyMCPToken(token: string, secret: string): MCPTokenPayload | null;
|
|
5
|
+
export declare function generateCodeVerifier(): string;
|
|
6
|
+
export declare function generateCodeChallenge(verifier: string): string;
|
|
7
|
+
export declare function verifyCodeChallenge(verifier: string, challenge: string, method: string): boolean;
|
|
8
|
+
export declare function generateRandomString(length?: number): string;
|
|
9
|
+
export declare function generateUUID(): string;
|
|
10
|
+
export declare function generateAuthorizationCode(): string;
|
|
11
|
+
export declare function generateSessionId(): string;
|
|
12
|
+
export declare function generateRefreshToken(): string;
|
|
13
|
+
export declare function isTokenExpiringSoon(expiryMs: number, bufferMs?: number): boolean;
|
|
14
|
+
export declare function calculateTokenExpiry(expiresIn: number): number;
|