couchloop-eq-mcp 1.0.4 → 1.1.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 +24 -11
- package/dist/developer/analyzers/bloat-detector.d.ts +89 -0
- package/dist/developer/analyzers/bloat-detector.d.ts.map +1 -0
- package/dist/developer/analyzers/bloat-detector.js +483 -0
- package/dist/developer/analyzers/bloat-detector.js.map +1 -0
- package/dist/developer/backup/auto-backup.d.ts +96 -0
- package/dist/developer/backup/auto-backup.d.ts.map +1 -0
- package/dist/developer/backup/auto-backup.js +346 -0
- package/dist/developer/backup/auto-backup.js.map +1 -0
- package/dist/developer/blockers/package-blocker.d.ts +33 -0
- package/dist/developer/blockers/package-blocker.d.ts.map +1 -0
- package/dist/developer/blockers/package-blocker.js +224 -0
- package/dist/developer/blockers/package-blocker.js.map +1 -0
- package/dist/developer/evaluators/ai-error-preventer.d.ts +54 -0
- package/dist/developer/evaluators/ai-error-preventer.d.ts.map +1 -0
- package/dist/developer/evaluators/ai-error-preventer.js +270 -0
- package/dist/developer/evaluators/ai-error-preventer.js.map +1 -0
- package/dist/developer/evaluators/build-context-detector.d.ts +44 -0
- package/dist/developer/evaluators/build-context-detector.d.ts.map +1 -0
- package/dist/developer/evaluators/build-context-detector.js +258 -0
- package/dist/developer/evaluators/build-context-detector.js.map +1 -0
- package/dist/developer/evaluators/package-evaluator.d.ts +37 -0
- package/dist/developer/evaluators/package-evaluator.d.ts.map +1 -0
- package/dist/developer/evaluators/package-evaluator.js +278 -0
- package/dist/developer/evaluators/package-evaluator.js.map +1 -0
- package/dist/developer/guards/file-guardian.d.ts +79 -0
- package/dist/developer/guards/file-guardian.d.ts.map +1 -0
- package/dist/developer/guards/file-guardian.js +309 -0
- package/dist/developer/guards/file-guardian.js.map +1 -0
- package/dist/developer/managers/context-manager.d.ts +61 -0
- package/dist/developer/managers/context-manager.d.ts.map +1 -0
- package/dist/developer/managers/context-manager.js +302 -0
- package/dist/developer/managers/context-manager.js.map +1 -0
- package/dist/developer/metrics/complexity-calculator.d.ts +52 -0
- package/dist/developer/metrics/complexity-calculator.d.ts.map +1 -0
- package/dist/developer/metrics/complexity-calculator.js +259 -0
- package/dist/developer/metrics/complexity-calculator.js.map +1 -0
- package/dist/developer/reports/review-summary.d.ts +49 -0
- package/dist/developer/reports/review-summary.d.ts.map +1 -0
- package/dist/developer/reports/review-summary.js +249 -0
- package/dist/developer/reports/review-summary.js.map +1 -0
- package/dist/developer/scanners/review-assistant.d.ts +41 -0
- package/dist/developer/scanners/review-assistant.d.ts.map +1 -0
- package/dist/developer/scanners/review-assistant.js +374 -0
- package/dist/developer/scanners/review-assistant.js.map +1 -0
- package/dist/developer/scanners/secret-scanner.d.ts +66 -0
- package/dist/developer/scanners/secret-scanner.d.ts.map +1 -0
- package/dist/developer/scanners/secret-scanner.js +287 -0
- package/dist/developer/scanners/secret-scanner.js.map +1 -0
- package/dist/developer/scanners/sql-injection-detector.d.ts +54 -0
- package/dist/developer/scanners/sql-injection-detector.d.ts.map +1 -0
- package/dist/developer/scanners/sql-injection-detector.js +174 -0
- package/dist/developer/scanners/sql-injection-detector.js.map +1 -0
- package/dist/developer/scanners/xss-detector.d.ts +60 -0
- package/dist/developer/scanners/xss-detector.d.ts.map +1 -0
- package/dist/developer/scanners/xss-detector.js +229 -0
- package/dist/developer/scanners/xss-detector.js.map +1 -0
- package/dist/developer/types/ai-errors.d.ts +34 -0
- package/dist/developer/types/ai-errors.d.ts.map +1 -0
- package/dist/developer/types/ai-errors.js +271 -0
- package/dist/developer/types/ai-errors.js.map +1 -0
- package/dist/developer/types/package.d.ts +32 -0
- package/dist/developer/types/package.d.ts.map +1 -0
- package/dist/developer/types/package.js +5 -0
- package/dist/developer/types/package.js.map +1 -0
- package/dist/developer/updaters/dependency-updater.d.ts +102 -0
- package/dist/developer/updaters/dependency-updater.d.ts.map +1 -0
- package/dist/developer/updaters/dependency-updater.js +472 -0
- package/dist/developer/updaters/dependency-updater.js.map +1 -0
- package/dist/developer/validators/cargo.d.ts +14 -0
- package/dist/developer/validators/cargo.d.ts.map +1 -0
- package/dist/developer/validators/cargo.js +132 -0
- package/dist/developer/validators/cargo.js.map +1 -0
- package/dist/developer/validators/gem.d.ts +14 -0
- package/dist/developer/validators/gem.d.ts.map +1 -0
- package/dist/developer/validators/gem.js +85 -0
- package/dist/developer/validators/gem.js.map +1 -0
- package/dist/developer/validators/go.d.ts +14 -0
- package/dist/developer/validators/go.d.ts.map +1 -0
- package/dist/developer/validators/go.js +138 -0
- package/dist/developer/validators/go.js.map +1 -0
- package/dist/developer/validators/maven.d.ts +14 -0
- package/dist/developer/validators/maven.d.ts.map +1 -0
- package/dist/developer/validators/maven.js +99 -0
- package/dist/developer/validators/maven.js.map +1 -0
- package/dist/developer/validators/npm.d.ts +14 -0
- package/dist/developer/validators/npm.d.ts.map +1 -0
- package/dist/developer/validators/npm.js +96 -0
- package/dist/developer/validators/npm.js.map +1 -0
- package/dist/developer/validators/nuget.d.ts +15 -0
- package/dist/developer/validators/nuget.d.ts.map +1 -0
- package/dist/developer/validators/nuget.js +107 -0
- package/dist/developer/validators/nuget.js.map +1 -0
- package/dist/developer/validators/pypi.d.ts +14 -0
- package/dist/developer/validators/pypi.d.ts.map +1 -0
- package/dist/developer/validators/pypi.js +118 -0
- package/dist/developer/validators/pypi.js.map +1 -0
- package/dist/developer/validators/registry-manager.d.ts +37 -0
- package/dist/developer/validators/registry-manager.d.ts.map +1 -0
- package/dist/developer/validators/registry-manager.js +89 -0
- package/dist/developer/validators/registry-manager.js.map +1 -0
- package/dist/developer/validators/version-checker.d.ts +145 -0
- package/dist/developer/validators/version-checker.d.ts.map +1 -0
- package/dist/developer/validators/version-checker.js +529 -0
- package/dist/developer/validators/version-checker.js.map +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/auth.d.ts +7 -9
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/auth.js.map +1 -1
- package/dist/tools/check-versions.d.ts +100 -0
- package/dist/tools/check-versions.d.ts.map +1 -0
- package/dist/tools/check-versions.js +328 -0
- package/dist/tools/check-versions.js.map +1 -0
- package/dist/tools/detect-code-smell.d.ts +9 -0
- package/dist/tools/detect-code-smell.d.ts.map +1 -0
- package/dist/tools/detect-code-smell.js +231 -0
- package/dist/tools/detect-code-smell.js.map +1 -0
- package/dist/tools/index.d.ts +471 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +178 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/journey.js +1 -1
- package/dist/tools/journey.js.map +1 -1
- package/dist/tools/pre-review-code.d.ts +71 -0
- package/dist/tools/pre-review-code.d.ts.map +1 -0
- package/dist/tools/pre-review-code.js +159 -0
- package/dist/tools/pre-review-code.js.map +1 -0
- package/dist/tools/preserve-context.d.ts +27 -0
- package/dist/tools/preserve-context.d.ts.map +1 -0
- package/dist/tools/preserve-context.js +98 -0
- package/dist/tools/preserve-context.js.map +1 -0
- package/dist/tools/protect-files.d.ts +224 -0
- package/dist/tools/protect-files.d.ts.map +1 -0
- package/dist/tools/protect-files.js +286 -0
- package/dist/tools/protect-files.js.map +1 -0
- package/dist/tools/scan-security.d.ts +38 -0
- package/dist/tools/scan-security.d.ts.map +1 -0
- package/dist/tools/scan-security.js +237 -0
- package/dist/tools/scan-security.js.map +1 -0
- package/dist/tools/validate_packages.d.ts +8 -0
- package/dist/tools/validate_packages.d.ts.map +1 -0
- package/dist/tools/validate_packages.js +159 -0
- package/dist/tools/validate_packages.js.map +1 -0
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/auth.js +1 -2
- package/dist/types/auth.js.map +1 -1
- package/dist/types/context.d.ts +46 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +17 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/file-protection.d.ts +50 -0
- package/dist/types/file-protection.d.ts.map +1 -0
- package/dist/types/file-protection.js +9 -0
- package/dist/types/file-protection.js.map +1 -0
- package/dist/utils/errorHandler.d.ts.map +1 -1
- package/dist/utils/errorHandler.js +2 -1
- package/dist/utils/errorHandler.js.map +1 -1
- package/package.json +30 -4
- package/dist/db/migrate.d.ts +0 -4
- package/dist/db/migrate.d.ts.map +0 -1
- package/dist/db/migrate.js +0 -34
- package/dist/db/migrate.js.map +0 -1
- package/dist/db/migrations/schema.d.ts +0 -1074
- package/dist/db/migrations/schema.d.ts.map +0 -1
- package/dist/db/migrations/schema.js +0 -160
- package/dist/db/migrations/schema.js.map +0 -1
- package/dist/db/schema.d.ts +0 -1576
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -204
- package/dist/db/schema.js.map +0 -1
- package/dist/db/seed.d.ts +0 -4
- package/dist/db/seed.d.ts.map +0 -1
- package/dist/db/seed.js +0 -57
- package/dist/db/seed.js.map +0 -1
- package/dist/db/seedOAuth.d.ts +0 -4
- package/dist/db/seedOAuth.d.ts.map +0 -1
- package/dist/db/seedOAuth.js +0 -76
- package/dist/db/seedOAuth.js.map +0 -1
- package/dist/governance/config.d.ts +0 -66
- package/dist/governance/config.d.ts.map +0 -1
- package/dist/governance/config.js +0 -238
- package/dist/governance/config.js.map +0 -1
- package/dist/governance/detectors/hallucination.d.ts +0 -61
- package/dist/governance/detectors/hallucination.d.ts.map +0 -1
- package/dist/governance/detectors/hallucination.js +0 -338
- package/dist/governance/detectors/hallucination.js.map +0 -1
- package/dist/governance/detectors/inconsistency.d.ts +0 -99
- package/dist/governance/detectors/inconsistency.d.ts.map +0 -1
- package/dist/governance/detectors/inconsistency.js +0 -548
- package/dist/governance/detectors/inconsistency.js.map +0 -1
- package/dist/governance/detectors/toneDrift.d.ts +0 -63
- package/dist/governance/detectors/toneDrift.d.ts.map +0 -1
- package/dist/governance/detectors/toneDrift.js +0 -421
- package/dist/governance/detectors/toneDrift.js.map +0 -1
- package/dist/governance/detectors/unsafeReasoning.d.ts +0 -54
- package/dist/governance/detectors/unsafeReasoning.d.ts.map +0 -1
- package/dist/governance/detectors/unsafeReasoning.js +0 -473
- package/dist/governance/detectors/unsafeReasoning.js.map +0 -1
- package/dist/governance/evaluationEngine.d.ts +0 -112
- package/dist/governance/evaluationEngine.d.ts.map +0 -1
- package/dist/governance/evaluationEngine.js +0 -265
- package/dist/governance/evaluationEngine.js.map +0 -1
- package/dist/governance/intervention.d.ts +0 -81
- package/dist/governance/intervention.d.ts.map +0 -1
- package/dist/governance/intervention.js +0 -405
- package/dist/governance/intervention.js.map +0 -1
- package/dist/server/oauth/anomalyDetection.d.ts +0 -146
- package/dist/server/oauth/anomalyDetection.d.ts.map +0 -1
- package/dist/server/oauth/anomalyDetection.js +0 -405
- package/dist/server/oauth/anomalyDetection.js.map +0 -1
- package/dist/server/oauth/authServer.d.ts +0 -61
- package/dist/server/oauth/authServer.d.ts.map +0 -1
- package/dist/server/oauth/authServer.js +0 -283
- package/dist/server/oauth/authServer.js.map +0 -1
- package/dist/server/oauth/dpop.d.ts +0 -135
- package/dist/server/oauth/dpop.d.ts.map +0 -1
- package/dist/server/oauth/dpop.js +0 -338
- package/dist/server/oauth/dpop.js.map +0 -1
- package/dist/server/oauth/gdpr/consent.d.ts +0 -173
- package/dist/server/oauth/gdpr/consent.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/consent.js +0 -388
- package/dist/server/oauth/gdpr/consent.js.map +0 -1
- package/dist/server/oauth/gdpr/dataPortability.d.ts +0 -214
- package/dist/server/oauth/gdpr/dataPortability.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/dataPortability.js +0 -486
- package/dist/server/oauth/gdpr/dataPortability.js.map +0 -1
- package/dist/server/oauth/gdpr/index.d.ts +0 -103
- package/dist/server/oauth/gdpr/index.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/index.js +0 -273
- package/dist/server/oauth/gdpr/index.js.map +0 -1
- package/dist/server/oauth/gdpr/rightToErasure.d.ts +0 -184
- package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/rightToErasure.js +0 -527
- package/dist/server/oauth/gdpr/rightToErasure.js.map +0 -1
- package/dist/server/oauth/monitoring/securityMonitor.d.ts +0 -218
- package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +0 -1
- package/dist/server/oauth/monitoring/securityMonitor.js +0 -615
- package/dist/server/oauth/monitoring/securityMonitor.js.map +0 -1
- package/dist/server/oauth/pkce.d.ts +0 -61
- package/dist/server/oauth/pkce.d.ts.map +0 -1
- package/dist/server/oauth/pkce.js +0 -157
- package/dist/server/oauth/pkce.js.map +0 -1
- package/dist/server/oauth/providers/base.d.ts +0 -147
- package/dist/server/oauth/providers/base.d.ts.map +0 -1
- package/dist/server/oauth/providers/base.js +0 -312
- package/dist/server/oauth/providers/base.js.map +0 -1
- package/dist/server/oauth/providers/github.d.ts +0 -55
- package/dist/server/oauth/providers/github.d.ts.map +0 -1
- package/dist/server/oauth/providers/github.js +0 -225
- package/dist/server/oauth/providers/github.js.map +0 -1
- package/dist/server/oauth/providers/google.d.ts +0 -49
- package/dist/server/oauth/providers/google.d.ts.map +0 -1
- package/dist/server/oauth/providers/google.js +0 -153
- package/dist/server/oauth/providers/google.js.map +0 -1
- package/dist/server/oauth/providers/index.d.ts +0 -9
- package/dist/server/oauth/providers/index.d.ts.map +0 -1
- package/dist/server/oauth/providers/index.js +0 -24
- package/dist/server/oauth/providers/index.js.map +0 -1
- package/dist/server/oauth/refreshTokenRotation.d.ts +0 -114
- package/dist/server/oauth/refreshTokenRotation.d.ts.map +0 -1
- package/dist/server/oauth/refreshTokenRotation.js +0 -344
- package/dist/server/oauth/refreshTokenRotation.js.map +0 -1
- package/dist/server/oauth/security.d.ts +0 -101
- package/dist/server/oauth/security.d.ts.map +0 -1
- package/dist/server/oauth/security.js +0 -268
- package/dist/server/oauth/security.js.map +0 -1
- package/dist/server/oauth/tokenEncryption.d.ts +0 -80
- package/dist/server/oauth/tokenEncryption.d.ts.map +0 -1
- package/dist/server/oauth/tokenEncryption.js +0 -218
- package/dist/server/oauth/tokenEncryption.js.map +0 -1
- package/dist/tools/sendMessage-complex-backup.d.ts +0 -6
- package/dist/tools/sendMessage-complex-backup.d.ts.map +0 -1
- package/dist/tools/sendMessage-complex-backup.js +0 -545
- package/dist/tools/sendMessage-complex-backup.js.map +0 -1
- package/dist/tools/sendMessage-revised.d.ts +0 -11
- package/dist/tools/sendMessage-revised.d.ts.map +0 -1
- package/dist/tools/sendMessage-revised.js +0 -429
- package/dist/tools/sendMessage-revised.js.map +0 -1
- package/dist/tools/sendMessage-truly-simple.d.ts +0 -8
- package/dist/tools/sendMessage-truly-simple.d.ts.map +0 -1
- package/dist/tools/sendMessage-truly-simple.js +0 -299
- package/dist/tools/sendMessage-truly-simple.js.map +0 -1
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
import { jwtVerify, importJWK } from 'jose';
|
|
2
|
-
import { logger } from '../../../utils/logger.js';
|
|
3
|
-
import { oauthSecurity } from '../security.js';
|
|
4
|
-
/**
|
|
5
|
-
* Abstract base class for OAuth providers
|
|
6
|
-
* Implements common OAuth 2.0/OIDC functionality
|
|
7
|
-
*/
|
|
8
|
-
export class OAuthProvider {
|
|
9
|
-
config;
|
|
10
|
-
jwksCache = null;
|
|
11
|
-
JWKS_CACHE_TTL = 3600000; // 1 hour
|
|
12
|
-
constructor(config) {
|
|
13
|
-
this.config = config;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Build authorization URL with required parameters
|
|
17
|
-
*/
|
|
18
|
-
buildAuthorizationUrl(params) {
|
|
19
|
-
const url = new URL(this.authorizationUrl);
|
|
20
|
-
// Required OAuth parameters
|
|
21
|
-
url.searchParams.set('response_type', 'code');
|
|
22
|
-
url.searchParams.set('client_id', this.config.clientId);
|
|
23
|
-
url.searchParams.set('redirect_uri', this.config.redirectUri);
|
|
24
|
-
url.searchParams.set('state', params.state);
|
|
25
|
-
// Scope
|
|
26
|
-
const scope = params.scope || this.getDefaultScopes().join(' ');
|
|
27
|
-
url.searchParams.set('scope', scope);
|
|
28
|
-
// PKCE parameters
|
|
29
|
-
if (params.codeChallenge) {
|
|
30
|
-
url.searchParams.set('code_challenge', params.codeChallenge);
|
|
31
|
-
url.searchParams.set('code_challenge_method', params.codeChallengeMethod || 'S256');
|
|
32
|
-
}
|
|
33
|
-
// OpenID Connect nonce
|
|
34
|
-
if (params.nonce) {
|
|
35
|
-
url.searchParams.set('nonce', params.nonce);
|
|
36
|
-
}
|
|
37
|
-
// Provider-specific additional parameters
|
|
38
|
-
if (this.config.additionalParams) {
|
|
39
|
-
Object.entries(this.config.additionalParams).forEach(([key, value]) => {
|
|
40
|
-
url.searchParams.set(key, value);
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
// Additional parameters from request
|
|
44
|
-
if (params.additionalParams) {
|
|
45
|
-
Object.entries(params.additionalParams).forEach(([key, value]) => {
|
|
46
|
-
url.searchParams.set(key, value);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
logger.debug(`Built authorization URL for ${this.name}: ${url.toString()}`);
|
|
50
|
-
return url.toString();
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Exchange authorization code for tokens
|
|
54
|
-
*/
|
|
55
|
-
async exchangeCode(code, codeVerifier) {
|
|
56
|
-
const params = new URLSearchParams({
|
|
57
|
-
grant_type: 'authorization_code',
|
|
58
|
-
code,
|
|
59
|
-
client_id: this.config.clientId,
|
|
60
|
-
client_secret: this.config.clientSecret,
|
|
61
|
-
redirect_uri: this.config.redirectUri,
|
|
62
|
-
});
|
|
63
|
-
// Add PKCE verifier if provided
|
|
64
|
-
if (codeVerifier) {
|
|
65
|
-
params.set('code_verifier', codeVerifier);
|
|
66
|
-
}
|
|
67
|
-
try {
|
|
68
|
-
const response = await fetch(this.tokenUrl, {
|
|
69
|
-
method: 'POST',
|
|
70
|
-
headers: {
|
|
71
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
72
|
-
'Accept': 'application/json',
|
|
73
|
-
},
|
|
74
|
-
body: params.toString(),
|
|
75
|
-
});
|
|
76
|
-
if (!response.ok) {
|
|
77
|
-
const error = await response.text();
|
|
78
|
-
logger.error(`Token exchange failed for ${this.name}: ${error}`);
|
|
79
|
-
throw new Error(`Token exchange failed: ${response.status}`);
|
|
80
|
-
}
|
|
81
|
-
const tokens = await response.json();
|
|
82
|
-
// Validate ID token if present (OIDC)
|
|
83
|
-
if (tokens.id_token) {
|
|
84
|
-
await this.validateIdToken(tokens.id_token);
|
|
85
|
-
}
|
|
86
|
-
logger.info(`Successfully exchanged code for tokens with ${this.name}`);
|
|
87
|
-
return tokens;
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
logger.error(`Error exchanging code with ${this.name}:`, error);
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Refresh access token
|
|
96
|
-
*/
|
|
97
|
-
async refreshToken(refreshToken) {
|
|
98
|
-
const params = new URLSearchParams({
|
|
99
|
-
grant_type: 'refresh_token',
|
|
100
|
-
refresh_token: refreshToken,
|
|
101
|
-
client_id: this.config.clientId,
|
|
102
|
-
client_secret: this.config.clientSecret,
|
|
103
|
-
});
|
|
104
|
-
try {
|
|
105
|
-
const response = await fetch(this.tokenUrl, {
|
|
106
|
-
method: 'POST',
|
|
107
|
-
headers: {
|
|
108
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
109
|
-
'Accept': 'application/json',
|
|
110
|
-
},
|
|
111
|
-
body: params.toString(),
|
|
112
|
-
});
|
|
113
|
-
if (!response.ok) {
|
|
114
|
-
const error = await response.text();
|
|
115
|
-
logger.error(`Token refresh failed for ${this.name}: ${error}`);
|
|
116
|
-
throw new Error(`Token refresh failed: ${response.status}`);
|
|
117
|
-
}
|
|
118
|
-
const tokens = await response.json();
|
|
119
|
-
logger.info(`Successfully refreshed token with ${this.name}`);
|
|
120
|
-
return tokens;
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
logger.error(`Error refreshing token with ${this.name}:`, error);
|
|
124
|
-
throw error;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Get user information from provider
|
|
129
|
-
*/
|
|
130
|
-
async getUserInfo(accessToken) {
|
|
131
|
-
try {
|
|
132
|
-
const response = await fetch(this.userInfoUrl, {
|
|
133
|
-
headers: {
|
|
134
|
-
'Authorization': `Bearer ${accessToken}`,
|
|
135
|
-
'Accept': 'application/json',
|
|
136
|
-
},
|
|
137
|
-
});
|
|
138
|
-
if (!response.ok) {
|
|
139
|
-
const error = await response.text();
|
|
140
|
-
logger.error(`Failed to get user info from ${this.name}: ${error}`);
|
|
141
|
-
throw new Error(`Failed to get user info: ${response.status}`);
|
|
142
|
-
}
|
|
143
|
-
const data = await response.json();
|
|
144
|
-
const userInfo = this.normalizeUserInfo(data);
|
|
145
|
-
logger.info(`Retrieved user info from ${this.name} for user ${userInfo.id}`);
|
|
146
|
-
return userInfo;
|
|
147
|
-
}
|
|
148
|
-
catch (error) {
|
|
149
|
-
logger.error(`Error getting user info from ${this.name}:`, error);
|
|
150
|
-
throw error;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Revoke token (if supported by provider)
|
|
155
|
-
*/
|
|
156
|
-
async revokeToken(token, tokenType = 'access_token') {
|
|
157
|
-
if (!this.revokeUrl) {
|
|
158
|
-
logger.warn(`Token revocation not supported by ${this.name}`);
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
const params = new URLSearchParams({
|
|
162
|
-
token,
|
|
163
|
-
token_type_hint: tokenType,
|
|
164
|
-
client_id: this.config.clientId,
|
|
165
|
-
client_secret: this.config.clientSecret,
|
|
166
|
-
});
|
|
167
|
-
try {
|
|
168
|
-
const response = await fetch(this.revokeUrl, {
|
|
169
|
-
method: 'POST',
|
|
170
|
-
headers: {
|
|
171
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
172
|
-
},
|
|
173
|
-
body: params.toString(),
|
|
174
|
-
});
|
|
175
|
-
if (!response.ok) {
|
|
176
|
-
logger.warn(`Token revocation failed for ${this.name}: ${response.status}`);
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
logger.info(`Successfully revoked token with ${this.name}`);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
catch (error) {
|
|
183
|
-
logger.error(`Error revoking token with ${this.name}:`, error);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Validate ID token (OpenID Connect)
|
|
188
|
-
*/
|
|
189
|
-
async validateIdToken(idToken) {
|
|
190
|
-
if (!this.jwksUrl) {
|
|
191
|
-
throw new Error(`JWKS URL not configured for ${this.name}`);
|
|
192
|
-
}
|
|
193
|
-
try {
|
|
194
|
-
// Get JWKS (with caching)
|
|
195
|
-
const jwks = await this.getJWKS();
|
|
196
|
-
// Parse token header to get kid
|
|
197
|
-
const [header] = idToken.split('.');
|
|
198
|
-
const decodedHeader = JSON.parse(Buffer.from(header, 'base64').toString());
|
|
199
|
-
const kid = decodedHeader.kid;
|
|
200
|
-
// Find matching key
|
|
201
|
-
const key = jwks.keys.find(k => k.kid === kid);
|
|
202
|
-
if (!key) {
|
|
203
|
-
throw new Error('No matching key found in JWKS');
|
|
204
|
-
}
|
|
205
|
-
// Import and verify
|
|
206
|
-
const publicKey = await importJWK(key);
|
|
207
|
-
const { payload } = await jwtVerify(idToken, publicKey, {
|
|
208
|
-
issuer: this.getExpectedIssuer(),
|
|
209
|
-
audience: this.config.clientId,
|
|
210
|
-
});
|
|
211
|
-
const claims = payload;
|
|
212
|
-
// Additional validations
|
|
213
|
-
this.validateIdTokenClaims(claims);
|
|
214
|
-
logger.debug(`ID token validated successfully for ${this.name}`);
|
|
215
|
-
return claims;
|
|
216
|
-
}
|
|
217
|
-
catch (error) {
|
|
218
|
-
logger.error(`ID token validation failed for ${this.name}:`, error);
|
|
219
|
-
throw new Error('Invalid ID token');
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Get JWKS from provider (with caching)
|
|
224
|
-
*/
|
|
225
|
-
async getJWKS() {
|
|
226
|
-
if (!this.jwksUrl) {
|
|
227
|
-
throw new Error(`JWKS URL not configured for ${this.name}`);
|
|
228
|
-
}
|
|
229
|
-
// Check cache
|
|
230
|
-
if (this.jwksCache &&
|
|
231
|
-
Date.now() - this.jwksCache.cachedAt < this.JWKS_CACHE_TTL) {
|
|
232
|
-
return { keys: this.jwksCache.keys };
|
|
233
|
-
}
|
|
234
|
-
try {
|
|
235
|
-
const response = await fetch(this.jwksUrl);
|
|
236
|
-
if (!response.ok) {
|
|
237
|
-
throw new Error(`Failed to fetch JWKS: ${response.status}`);
|
|
238
|
-
}
|
|
239
|
-
const jwks = await response.json();
|
|
240
|
-
// Cache the keys
|
|
241
|
-
this.jwksCache = {
|
|
242
|
-
keys: jwks.keys,
|
|
243
|
-
cachedAt: Date.now(),
|
|
244
|
-
};
|
|
245
|
-
logger.debug(`Fetched and cached JWKS for ${this.name}`);
|
|
246
|
-
return jwks;
|
|
247
|
-
}
|
|
248
|
-
catch (error) {
|
|
249
|
-
logger.error(`Error fetching JWKS for ${this.name}:`, error);
|
|
250
|
-
throw error;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Validate redirect URI
|
|
255
|
-
*/
|
|
256
|
-
validateRedirectUri(uri) {
|
|
257
|
-
return oauthSecurity.validateRedirectUri(uri, this.config.clientId);
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Additional ID token claims validation
|
|
261
|
-
*/
|
|
262
|
-
validateIdTokenClaims(claims) {
|
|
263
|
-
// Check expiration
|
|
264
|
-
const now = Math.floor(Date.now() / 1000);
|
|
265
|
-
if (claims.exp < now) {
|
|
266
|
-
throw new Error('ID token expired');
|
|
267
|
-
}
|
|
268
|
-
// Check issued at (not in the future)
|
|
269
|
-
if (claims.iat > now + 60) { // Allow 1 minute clock skew
|
|
270
|
-
throw new Error('ID token issued in the future');
|
|
271
|
-
}
|
|
272
|
-
// Provider-specific additional validations can be added in subclasses
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Handle provider-specific errors
|
|
276
|
-
*/
|
|
277
|
-
handleProviderError(error) {
|
|
278
|
-
// Can be overridden in subclasses for provider-specific error handling
|
|
279
|
-
throw error;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Provider factory
|
|
284
|
-
*/
|
|
285
|
-
export class ProviderFactory {
|
|
286
|
-
static providers = new Map();
|
|
287
|
-
/**
|
|
288
|
-
* Register a provider
|
|
289
|
-
*/
|
|
290
|
-
static register(name, providerClass) {
|
|
291
|
-
this.providers.set(name.toLowerCase(), providerClass);
|
|
292
|
-
logger.info(`Registered OAuth provider: ${name}`);
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Create provider instance
|
|
296
|
-
*/
|
|
297
|
-
static create(name, config) {
|
|
298
|
-
const ProviderClass = this.providers.get(name.toLowerCase());
|
|
299
|
-
if (!ProviderClass) {
|
|
300
|
-
throw new Error(`Unknown OAuth provider: ${name}`);
|
|
301
|
-
}
|
|
302
|
-
// @ts-ignore - TypeScript doesn't understand dynamic class instantiation
|
|
303
|
-
return new ProviderClass(config);
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Get list of registered providers
|
|
307
|
-
*/
|
|
308
|
-
static getProviders() {
|
|
309
|
-
return Array.from(this.providers.keys());
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
//# sourceMappingURL=base.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/server/oauth/providers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { OAuthProvider, UserInfo, TokenResponse, ProviderConfig } from './base.js';
|
|
2
|
-
/**
|
|
3
|
-
* GitHub OAuth Provider
|
|
4
|
-
* Note: GitHub doesn't support OpenID Connect, so no ID tokens
|
|
5
|
-
*/
|
|
6
|
-
export declare class GitHubOAuthProvider extends OAuthProvider {
|
|
7
|
-
readonly name = "github";
|
|
8
|
-
readonly authorizationUrl = "https://github.com/login/oauth/authorize";
|
|
9
|
-
readonly tokenUrl = "https://github.com/login/oauth/access_token";
|
|
10
|
-
readonly userInfoUrl = "https://api.github.com/user";
|
|
11
|
-
readonly revokeUrl: undefined;
|
|
12
|
-
readonly jwksUrl: undefined;
|
|
13
|
-
constructor(config: ProviderConfig);
|
|
14
|
-
/**
|
|
15
|
-
* Get default scopes for GitHub
|
|
16
|
-
*/
|
|
17
|
-
protected getDefaultScopes(): string[];
|
|
18
|
-
/**
|
|
19
|
-
* GitHub doesn't use OIDC, so no issuer
|
|
20
|
-
*/
|
|
21
|
-
protected getExpectedIssuer(): string;
|
|
22
|
-
/**
|
|
23
|
-
* Exchange code for token (GitHub-specific)
|
|
24
|
-
*/
|
|
25
|
-
exchangeCode(code: string, codeVerifier?: string): Promise<TokenResponse>;
|
|
26
|
-
/**
|
|
27
|
-
* GitHub doesn't support refresh tokens
|
|
28
|
-
*/
|
|
29
|
-
refreshToken(refreshToken: string): Promise<TokenResponse>;
|
|
30
|
-
/**
|
|
31
|
-
* Get GitHub user info with email addresses
|
|
32
|
-
*/
|
|
33
|
-
getUserInfo(accessToken: string): Promise<UserInfo>;
|
|
34
|
-
/**
|
|
35
|
-
* Normalize GitHub user info
|
|
36
|
-
*/
|
|
37
|
-
protected normalizeUserInfo(data: any): UserInfo;
|
|
38
|
-
/**
|
|
39
|
-
* Check if user has access to specific organization
|
|
40
|
-
*/
|
|
41
|
-
checkOrganizationMembership(accessToken: string, org: string): Promise<boolean>;
|
|
42
|
-
/**
|
|
43
|
-
* Get user's organizations
|
|
44
|
-
*/
|
|
45
|
-
getUserOrganizations(accessToken: string): Promise<any[]>;
|
|
46
|
-
/**
|
|
47
|
-
* Check repository access
|
|
48
|
-
*/
|
|
49
|
-
checkRepositoryAccess(accessToken: string, owner: string, repo: string): Promise<boolean>;
|
|
50
|
-
/**
|
|
51
|
-
* Handle GitHub-specific errors
|
|
52
|
-
*/
|
|
53
|
-
protected handleProviderError(error: any): never;
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=github.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/server/oauth/providers/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGnF;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,gBAAgB,8CAA8C;IACvE,QAAQ,CAAC,QAAQ,iDAAiD;IAClE,QAAQ,CAAC,WAAW,iCAAiC;IACrD,QAAQ,CAAC,SAAS,YAAa;IAC/B,QAAQ,CAAC,OAAO,YAAa;gBAEjB,MAAM,EAAE,cAAc;IAQlC;;OAEG;IACH,SAAS,CAAC,gBAAgB,IAAI,MAAM,EAAE;IAUtC;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA0C/E;;OAEG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAIhE;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsDzD;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG,QAAQ;IAahD;;OAEG;IACG,2BAA2B,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IAoBnB;;OAEG;IACG,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAoB/D;;OAEG;IACG,qBAAqB,CACzB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC;IAkBnB;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK;CAejD"}
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import { OAuthProvider } from './base.js';
|
|
2
|
-
import { logger } from '../../../utils/logger.js';
|
|
3
|
-
/**
|
|
4
|
-
* GitHub OAuth Provider
|
|
5
|
-
* Note: GitHub doesn't support OpenID Connect, so no ID tokens
|
|
6
|
-
*/
|
|
7
|
-
export class GitHubOAuthProvider extends OAuthProvider {
|
|
8
|
-
name = 'github';
|
|
9
|
-
authorizationUrl = 'https://github.com/login/oauth/authorize';
|
|
10
|
-
tokenUrl = 'https://github.com/login/oauth/access_token';
|
|
11
|
-
userInfoUrl = 'https://api.github.com/user';
|
|
12
|
-
revokeUrl = undefined; // GitHub doesn't support token revocation via API
|
|
13
|
-
jwksUrl = undefined; // GitHub doesn't use OIDC
|
|
14
|
-
constructor(config) {
|
|
15
|
-
super(config);
|
|
16
|
-
if (!this.config.scopes || this.config.scopes.length === 0) {
|
|
17
|
-
this.config.scopes = this.getDefaultScopes();
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Get default scopes for GitHub
|
|
22
|
-
*/
|
|
23
|
-
getDefaultScopes() {
|
|
24
|
-
return [
|
|
25
|
-
'read:user', // Read user profile
|
|
26
|
-
'user:email', // Access email addresses
|
|
27
|
-
// Additional scopes as needed:
|
|
28
|
-
// 'repo', // Full repository access
|
|
29
|
-
// 'read:org', // Read organization membership
|
|
30
|
-
];
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* GitHub doesn't use OIDC, so no issuer
|
|
34
|
-
*/
|
|
35
|
-
getExpectedIssuer() {
|
|
36
|
-
return '';
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Exchange code for token (GitHub-specific)
|
|
40
|
-
*/
|
|
41
|
-
async exchangeCode(code, codeVerifier) {
|
|
42
|
-
const params = new URLSearchParams({
|
|
43
|
-
client_id: this.config.clientId,
|
|
44
|
-
client_secret: this.config.clientSecret,
|
|
45
|
-
code,
|
|
46
|
-
redirect_uri: this.config.redirectUri,
|
|
47
|
-
});
|
|
48
|
-
try {
|
|
49
|
-
const response = await fetch(this.tokenUrl, {
|
|
50
|
-
method: 'POST',
|
|
51
|
-
headers: {
|
|
52
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
53
|
-
'Accept': 'application/json', // GitHub requires this for JSON response
|
|
54
|
-
},
|
|
55
|
-
body: params.toString(),
|
|
56
|
-
});
|
|
57
|
-
if (!response.ok) {
|
|
58
|
-
const error = await response.text();
|
|
59
|
-
logger.error(`GitHub token exchange failed: ${error}`);
|
|
60
|
-
throw new Error(`Token exchange failed: ${response.status}`);
|
|
61
|
-
}
|
|
62
|
-
const data = await response.json();
|
|
63
|
-
// GitHub returns a different format, normalize it
|
|
64
|
-
const tokens = {
|
|
65
|
-
access_token: data.access_token,
|
|
66
|
-
token_type: data.token_type || 'Bearer',
|
|
67
|
-
scope: data.scope,
|
|
68
|
-
// GitHub doesn't provide refresh tokens or expiry
|
|
69
|
-
};
|
|
70
|
-
logger.info('Successfully exchanged code for GitHub token');
|
|
71
|
-
return tokens;
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
logger.error('Error exchanging GitHub code:', error);
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* GitHub doesn't support refresh tokens
|
|
80
|
-
*/
|
|
81
|
-
async refreshToken(refreshToken) {
|
|
82
|
-
throw new Error('GitHub does not support refresh tokens');
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Get GitHub user info with email addresses
|
|
86
|
-
*/
|
|
87
|
-
async getUserInfo(accessToken) {
|
|
88
|
-
try {
|
|
89
|
-
// Get basic user info
|
|
90
|
-
const userResponse = await fetch(this.userInfoUrl, {
|
|
91
|
-
headers: {
|
|
92
|
-
'Authorization': `Bearer ${accessToken}`,
|
|
93
|
-
'Accept': 'application/vnd.github.v3+json',
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
if (!userResponse.ok) {
|
|
97
|
-
throw new Error(`Failed to get user info: ${userResponse.status}`);
|
|
98
|
-
}
|
|
99
|
-
const userData = await userResponse.json();
|
|
100
|
-
// Get email addresses (separate endpoint)
|
|
101
|
-
let primaryEmail = userData.email;
|
|
102
|
-
let emailVerified = false;
|
|
103
|
-
try {
|
|
104
|
-
const emailResponse = await fetch('https://api.github.com/user/emails', {
|
|
105
|
-
headers: {
|
|
106
|
-
'Authorization': `Bearer ${accessToken}`,
|
|
107
|
-
'Accept': 'application/vnd.github.v3+json',
|
|
108
|
-
},
|
|
109
|
-
});
|
|
110
|
-
if (emailResponse.ok) {
|
|
111
|
-
const emails = await emailResponse.json();
|
|
112
|
-
const primary = emails.find((e) => e.primary);
|
|
113
|
-
if (primary) {
|
|
114
|
-
primaryEmail = primary.email;
|
|
115
|
-
emailVerified = primary.verified;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
logger.warn('Failed to fetch GitHub email addresses:', error);
|
|
121
|
-
}
|
|
122
|
-
const userInfo = this.normalizeUserInfo({
|
|
123
|
-
...userData,
|
|
124
|
-
email: primaryEmail,
|
|
125
|
-
email_verified: emailVerified,
|
|
126
|
-
});
|
|
127
|
-
logger.info(`Retrieved GitHub user info for user ${userInfo.id}`);
|
|
128
|
-
return userInfo;
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
logger.error('Error getting GitHub user info:', error);
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Normalize GitHub user info
|
|
137
|
-
*/
|
|
138
|
-
normalizeUserInfo(data) {
|
|
139
|
-
return {
|
|
140
|
-
id: data.id?.toString() || '',
|
|
141
|
-
email: data.email,
|
|
142
|
-
email_verified: data.email_verified || false,
|
|
143
|
-
name: data.name || data.login,
|
|
144
|
-
picture: data.avatar_url,
|
|
145
|
-
locale: undefined, // GitHub doesn't provide locale
|
|
146
|
-
provider: this.name,
|
|
147
|
-
raw: data,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Check if user has access to specific organization
|
|
152
|
-
*/
|
|
153
|
-
async checkOrganizationMembership(accessToken, org) {
|
|
154
|
-
try {
|
|
155
|
-
const response = await fetch(`https://api.github.com/orgs/${org}/members`, {
|
|
156
|
-
headers: {
|
|
157
|
-
'Authorization': `Bearer ${accessToken}`,
|
|
158
|
-
'Accept': 'application/vnd.github.v3+json',
|
|
159
|
-
},
|
|
160
|
-
});
|
|
161
|
-
if (response.status === 204) {
|
|
162
|
-
return true; // User is a member
|
|
163
|
-
}
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
catch (error) {
|
|
167
|
-
logger.error(`Error checking GitHub org membership:`, error);
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Get user's organizations
|
|
173
|
-
*/
|
|
174
|
-
async getUserOrganizations(accessToken) {
|
|
175
|
-
try {
|
|
176
|
-
const response = await fetch('https://api.github.com/user/orgs', {
|
|
177
|
-
headers: {
|
|
178
|
-
'Authorization': `Bearer ${accessToken}`,
|
|
179
|
-
'Accept': 'application/vnd.github.v3+json',
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
if (!response.ok) {
|
|
183
|
-
throw new Error(`Failed to get organizations: ${response.status}`);
|
|
184
|
-
}
|
|
185
|
-
return await response.json();
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
logger.error('Error getting GitHub organizations:', error);
|
|
189
|
-
return [];
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Check repository access
|
|
194
|
-
*/
|
|
195
|
-
async checkRepositoryAccess(accessToken, owner, repo) {
|
|
196
|
-
try {
|
|
197
|
-
const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {
|
|
198
|
-
headers: {
|
|
199
|
-
'Authorization': `Bearer ${accessToken}`,
|
|
200
|
-
'Accept': 'application/vnd.github.v3+json',
|
|
201
|
-
},
|
|
202
|
-
});
|
|
203
|
-
return response.ok;
|
|
204
|
-
}
|
|
205
|
-
catch {
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Handle GitHub-specific errors
|
|
211
|
-
*/
|
|
212
|
-
handleProviderError(error) {
|
|
213
|
-
if (error.error === 'bad_verification_code') {
|
|
214
|
-
throw new Error('Invalid or expired authorization code');
|
|
215
|
-
}
|
|
216
|
-
if (error.error === 'incorrect_client_credentials') {
|
|
217
|
-
throw new Error('Invalid client credentials');
|
|
218
|
-
}
|
|
219
|
-
if (error.error === 'redirect_uri_mismatch') {
|
|
220
|
-
throw new Error('Redirect URI mismatch');
|
|
221
|
-
}
|
|
222
|
-
throw error;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
//# sourceMappingURL=github.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/server/oauth/providers/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { OAuthProvider, UserInfo, IdTokenClaims, ProviderConfig } from './base.js';
|
|
2
|
-
/**
|
|
3
|
-
* Google OAuth 2.0 Provider
|
|
4
|
-
* Implements Google Sign-In with OpenID Connect
|
|
5
|
-
*/
|
|
6
|
-
export declare class GoogleOAuthProvider extends OAuthProvider {
|
|
7
|
-
readonly name = "google";
|
|
8
|
-
readonly authorizationUrl = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
9
|
-
readonly tokenUrl = "https://oauth2.googleapis.com/token";
|
|
10
|
-
readonly userInfoUrl = "https://www.googleapis.com/oauth2/v2/userinfo";
|
|
11
|
-
readonly revokeUrl = "https://oauth2.googleapis.com/revoke";
|
|
12
|
-
readonly jwksUrl = "https://www.googleapis.com/oauth2/v3/certs";
|
|
13
|
-
constructor(config: ProviderConfig);
|
|
14
|
-
/**
|
|
15
|
-
* Get default scopes for Google
|
|
16
|
-
*/
|
|
17
|
-
protected getDefaultScopes(): string[];
|
|
18
|
-
/**
|
|
19
|
-
* Get expected issuer for Google
|
|
20
|
-
*/
|
|
21
|
-
protected getExpectedIssuer(): string;
|
|
22
|
-
/**
|
|
23
|
-
* Normalize Google user info to common format
|
|
24
|
-
*/
|
|
25
|
-
protected normalizeUserInfo(data: any): UserInfo;
|
|
26
|
-
/**
|
|
27
|
-
* Additional Google-specific ID token validation
|
|
28
|
-
*/
|
|
29
|
-
protected validateIdTokenClaims(claims: IdTokenClaims): void;
|
|
30
|
-
/**
|
|
31
|
-
* Google-specific user info enrichment
|
|
32
|
-
* Can fetch additional profile data if needed
|
|
33
|
-
*/
|
|
34
|
-
getEnrichedUserInfo(accessToken: string): Promise<UserInfo>;
|
|
35
|
-
/**
|
|
36
|
-
* Check if user has specific Google service access
|
|
37
|
-
*/
|
|
38
|
-
checkServiceAccess(accessToken: string, service: 'calendar' | 'drive' | 'gmail'): Promise<boolean>;
|
|
39
|
-
/**
|
|
40
|
-
* Revoke Google tokens
|
|
41
|
-
* Google supports revoking both access and refresh tokens
|
|
42
|
-
*/
|
|
43
|
-
revokeToken(token: string, tokenType?: 'access_token' | 'refresh_token'): Promise<void>;
|
|
44
|
-
/**
|
|
45
|
-
* Handle Google-specific errors
|
|
46
|
-
*/
|
|
47
|
-
protected handleProviderError(error: any): never;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=google.d.ts.map
|