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,338 +0,0 @@
|
|
|
1
|
-
import { createHash, generateKeyPairSync } from 'crypto';
|
|
2
|
-
import { SignJWT, jwtVerify, importJWK, exportJWK } from 'jose';
|
|
3
|
-
import { logger } from '../../utils/logger.js';
|
|
4
|
-
/**
|
|
5
|
-
* DPoP Manager for Demonstration of Proof of Possession
|
|
6
|
-
* Implements sender-constrained tokens to prevent token theft
|
|
7
|
-
* Based on OAuth 2.0 DPoP draft specification
|
|
8
|
-
*/
|
|
9
|
-
export class DPoPManager {
|
|
10
|
-
jtiCache = new Map();
|
|
11
|
-
nonceCache = new Map();
|
|
12
|
-
JTI_TTL = 3600000; // 1 hour
|
|
13
|
-
NONCE_TTL = 600000; // 10 minutes
|
|
14
|
-
MAX_TIME_SKEW = 300; // 5 minutes in seconds
|
|
15
|
-
/**
|
|
16
|
-
* Generate a DPoP key pair for client
|
|
17
|
-
*/
|
|
18
|
-
generateKeyPair(algorithm = 'ES256') {
|
|
19
|
-
let keyPair;
|
|
20
|
-
if (algorithm === 'RS256') {
|
|
21
|
-
keyPair = generateKeyPairSync('rsa', {
|
|
22
|
-
modulusLength: 2048,
|
|
23
|
-
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
24
|
-
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
keyPair = generateKeyPairSync('ec', {
|
|
29
|
-
namedCurve: 'P-256',
|
|
30
|
-
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
31
|
-
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const publicKey = keyPair.publicKey;
|
|
35
|
-
const privateKey = keyPair.privateKey;
|
|
36
|
-
logger.info(`Generated DPoP ${algorithm} key pair`);
|
|
37
|
-
return {
|
|
38
|
-
publicKey,
|
|
39
|
-
privateKey,
|
|
40
|
-
jwk: {} // Would need to convert to JWK format
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Create a DPoP proof JWT
|
|
45
|
-
*/
|
|
46
|
-
async createDPoPProof(privateKey, httpMethod, httpUri, options) {
|
|
47
|
-
const algorithm = options?.algorithm || 'ES256';
|
|
48
|
-
const jti = this.generateJti();
|
|
49
|
-
const now = Math.floor(Date.now() / 1000);
|
|
50
|
-
// Create JWK from public key
|
|
51
|
-
const jwk = await exportJWK(privateKey);
|
|
52
|
-
const payload = {
|
|
53
|
-
jti,
|
|
54
|
-
htm: httpMethod.toUpperCase(),
|
|
55
|
-
htu: this.normalizeUri(httpUri),
|
|
56
|
-
iat: now,
|
|
57
|
-
};
|
|
58
|
-
// Add access token hash if provided
|
|
59
|
-
if (options?.accessToken) {
|
|
60
|
-
payload.ath = await this.hashToken(options.accessToken);
|
|
61
|
-
}
|
|
62
|
-
// Add nonce if provided
|
|
63
|
-
if (options?.nonce) {
|
|
64
|
-
payload.nonce = options.nonce;
|
|
65
|
-
}
|
|
66
|
-
// Create the proof JWT
|
|
67
|
-
const proof = await new SignJWT(payload)
|
|
68
|
-
.setProtectedHeader({
|
|
69
|
-
typ: 'dpop+jwt',
|
|
70
|
-
alg: algorithm,
|
|
71
|
-
jwk,
|
|
72
|
-
})
|
|
73
|
-
.sign(privateKey);
|
|
74
|
-
logger.debug(`Created DPoP proof for ${httpMethod} ${httpUri}`);
|
|
75
|
-
return proof;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Validate a DPoP proof
|
|
79
|
-
*/
|
|
80
|
-
async validateDPoPProof(dpopProof, httpMethod, httpUri, options) {
|
|
81
|
-
try {
|
|
82
|
-
// Parse the JWT header to get the public key
|
|
83
|
-
const [headerB64] = dpopProof.split('.');
|
|
84
|
-
const header = JSON.parse(Buffer.from(headerB64, 'base64url').toString());
|
|
85
|
-
if (header.typ !== 'dpop+jwt') {
|
|
86
|
-
return { valid: false, error: 'Invalid typ header' };
|
|
87
|
-
}
|
|
88
|
-
if (!header.jwk) {
|
|
89
|
-
return { valid: false, error: 'Missing jwk in header' };
|
|
90
|
-
}
|
|
91
|
-
// Import the public key from JWK
|
|
92
|
-
const publicKey = await importJWK(header.jwk, header.alg);
|
|
93
|
-
// Verify the signature
|
|
94
|
-
const { payload } = await jwtVerify(dpopProof, publicKey, {
|
|
95
|
-
algorithms: [header.alg],
|
|
96
|
-
});
|
|
97
|
-
const claims = payload;
|
|
98
|
-
// Validate HTTP method
|
|
99
|
-
if (claims.htm !== httpMethod.toUpperCase()) {
|
|
100
|
-
return { valid: false, error: `HTTP method mismatch: expected ${httpMethod}, got ${claims.htm}` };
|
|
101
|
-
}
|
|
102
|
-
// Validate HTTP URI
|
|
103
|
-
if (claims.htu !== this.normalizeUri(httpUri)) {
|
|
104
|
-
return { valid: false, error: `HTTP URI mismatch` };
|
|
105
|
-
}
|
|
106
|
-
// Check time window (prevent replay)
|
|
107
|
-
const now = Math.floor(Date.now() / 1000);
|
|
108
|
-
if (Math.abs(now - claims.iat) > this.MAX_TIME_SKEW) {
|
|
109
|
-
return { valid: false, error: 'DPoP proof too old or from future' };
|
|
110
|
-
}
|
|
111
|
-
// Check JTI uniqueness (prevent replay)
|
|
112
|
-
if (await this.isJtiUsed(claims.jti)) {
|
|
113
|
-
return { valid: false, error: 'DPoP proof jti already used (replay attack)' };
|
|
114
|
-
}
|
|
115
|
-
// Validate access token binding if provided
|
|
116
|
-
if (options?.accessToken) {
|
|
117
|
-
const expectedAth = await this.hashToken(options.accessToken);
|
|
118
|
-
if (claims.ath !== expectedAth) {
|
|
119
|
-
return { valid: false, error: 'Access token hash mismatch' };
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
else if (claims.ath) {
|
|
123
|
-
return { valid: false, error: 'Unexpected access token hash in proof' };
|
|
124
|
-
}
|
|
125
|
-
// Validate nonce if required
|
|
126
|
-
if (options?.requireNonce || options?.expectedNonce) {
|
|
127
|
-
if (!claims.nonce) {
|
|
128
|
-
return { valid: false, error: 'Missing required nonce' };
|
|
129
|
-
}
|
|
130
|
-
if (options.expectedNonce && claims.nonce !== options.expectedNonce) {
|
|
131
|
-
return { valid: false, error: 'Nonce mismatch' };
|
|
132
|
-
}
|
|
133
|
-
if (!await this.validateNonce(claims.nonce)) {
|
|
134
|
-
return { valid: false, error: 'Invalid or expired nonce' };
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// Store JTI to prevent replay
|
|
138
|
-
await this.storeJti(claims.jti);
|
|
139
|
-
// Calculate JWK thumbprint for token binding
|
|
140
|
-
const jkt = await this.calculateJwkThumbprint(header.jwk);
|
|
141
|
-
logger.info(`DPoP proof validated successfully`);
|
|
142
|
-
return { valid: true, jkt };
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
logger.error('DPoP validation error:', error);
|
|
146
|
-
return { valid: false, error: 'DPoP validation failed' };
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Generate a server nonce for enhanced security
|
|
151
|
-
*/
|
|
152
|
-
generateNonce() {
|
|
153
|
-
const nonce = Buffer.from(crypto.randomUUID()).toString('base64url');
|
|
154
|
-
const expires = Date.now() + this.NONCE_TTL;
|
|
155
|
-
this.nonceCache.set(nonce, expires);
|
|
156
|
-
this.cleanupExpiredNonces();
|
|
157
|
-
logger.debug('Generated DPoP nonce');
|
|
158
|
-
return nonce;
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Validate a nonce
|
|
162
|
-
*/
|
|
163
|
-
async validateNonce(nonce) {
|
|
164
|
-
const expires = this.nonceCache.get(nonce);
|
|
165
|
-
if (!expires) {
|
|
166
|
-
return false;
|
|
167
|
-
}
|
|
168
|
-
if (Date.now() > expires) {
|
|
169
|
-
this.nonceCache.delete(nonce);
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
// Nonce is valid, remove it (single use)
|
|
173
|
-
this.nonceCache.delete(nonce);
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Bind an access token to a DPoP key
|
|
178
|
-
*/
|
|
179
|
-
createDPoPBoundToken(token, jkt) {
|
|
180
|
-
return {
|
|
181
|
-
...token,
|
|
182
|
-
cnf: {
|
|
183
|
-
jkt, // JWK thumbprint
|
|
184
|
-
},
|
|
185
|
-
token_type: 'DPoP', // Instead of 'Bearer'
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Validate that a token is bound to the correct DPoP key
|
|
190
|
-
*/
|
|
191
|
-
validateTokenBinding(token, dpopJkt) {
|
|
192
|
-
if (!token.cnf?.jkt) {
|
|
193
|
-
logger.warn('Token missing DPoP binding');
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
if (token.cnf.jkt !== dpopJkt) {
|
|
197
|
-
logger.warn('DPoP key mismatch');
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Hash a token for the 'ath' claim
|
|
204
|
-
*/
|
|
205
|
-
async hashToken(token) {
|
|
206
|
-
const hash = createHash('sha256')
|
|
207
|
-
.update(token, 'ascii')
|
|
208
|
-
.digest('base64url');
|
|
209
|
-
return hash;
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Calculate JWK thumbprint (RFC 7638)
|
|
213
|
-
*/
|
|
214
|
-
async calculateJwkThumbprint(jwk) {
|
|
215
|
-
// Create canonical JSON representation
|
|
216
|
-
const canonical = {};
|
|
217
|
-
// Required members in lexicographic order
|
|
218
|
-
if (jwk.kty === 'RSA') {
|
|
219
|
-
canonical.e = jwk.e;
|
|
220
|
-
canonical.kty = jwk.kty;
|
|
221
|
-
canonical.n = jwk.n;
|
|
222
|
-
}
|
|
223
|
-
else if (jwk.kty === 'EC') {
|
|
224
|
-
canonical.crv = jwk.crv;
|
|
225
|
-
canonical.kty = jwk.kty;
|
|
226
|
-
canonical.x = jwk.x;
|
|
227
|
-
canonical.y = jwk.y;
|
|
228
|
-
}
|
|
229
|
-
const json = JSON.stringify(canonical);
|
|
230
|
-
const hash = createHash('sha256')
|
|
231
|
-
.update(json, 'utf8')
|
|
232
|
-
.digest('base64url');
|
|
233
|
-
return hash;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Normalize URI for comparison
|
|
237
|
-
*/
|
|
238
|
-
normalizeUri(uri) {
|
|
239
|
-
const url = new URL(uri);
|
|
240
|
-
// Remove fragment, normalize path
|
|
241
|
-
return `${url.protocol}//${url.host}${url.pathname}${url.search}`;
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Generate unique JTI
|
|
245
|
-
*/
|
|
246
|
-
generateJti() {
|
|
247
|
-
return crypto.randomUUID();
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Check if JTI has been used
|
|
251
|
-
*/
|
|
252
|
-
async isJtiUsed(jti) {
|
|
253
|
-
return this.jtiCache.has(jti);
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Store JTI to prevent replay
|
|
257
|
-
*/
|
|
258
|
-
async storeJti(jti) {
|
|
259
|
-
const expires = Date.now() + this.JTI_TTL;
|
|
260
|
-
this.jtiCache.set(jti, expires);
|
|
261
|
-
this.cleanupExpiredJtis();
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Clean up expired JTIs
|
|
265
|
-
*/
|
|
266
|
-
cleanupExpiredJtis() {
|
|
267
|
-
const now = Date.now();
|
|
268
|
-
for (const [jti, expires] of this.jtiCache.entries()) {
|
|
269
|
-
if (now > expires) {
|
|
270
|
-
this.jtiCache.delete(jti);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Clean up expired nonces
|
|
276
|
-
*/
|
|
277
|
-
cleanupExpiredNonces() {
|
|
278
|
-
const now = Date.now();
|
|
279
|
-
for (const [nonce, expires] of this.nonceCache.entries()) {
|
|
280
|
-
if (now > expires) {
|
|
281
|
-
this.nonceCache.delete(nonce);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Middleware for Express to validate DPoP proofs
|
|
287
|
-
*/
|
|
288
|
-
middleware(options) {
|
|
289
|
-
return async (req, res, next) => {
|
|
290
|
-
const dpopHeader = req.headers['dpop'];
|
|
291
|
-
if (!dpopHeader) {
|
|
292
|
-
if (options?.requireDPoP) {
|
|
293
|
-
return res.status(401).json({ error: 'DPoP proof required' });
|
|
294
|
-
}
|
|
295
|
-
return next();
|
|
296
|
-
}
|
|
297
|
-
// Get access token from Authorization header
|
|
298
|
-
const authHeader = req.headers['authorization'];
|
|
299
|
-
const accessToken = authHeader?.replace(/^DPoP /, '');
|
|
300
|
-
// Validate DPoP proof
|
|
301
|
-
const validation = await this.validateDPoPProof(dpopHeader, req.method, `${req.protocol}://${req.get('host')}${req.originalUrl}`, {
|
|
302
|
-
accessToken,
|
|
303
|
-
expectedNonce: req.headers['dpop-nonce'],
|
|
304
|
-
requireNonce: options?.requireNonce,
|
|
305
|
-
});
|
|
306
|
-
if (!validation.valid) {
|
|
307
|
-
logger.warn(`DPoP validation failed: ${validation.error}`);
|
|
308
|
-
// If nonce is required, send one in response
|
|
309
|
-
if (validation.error?.includes('nonce')) {
|
|
310
|
-
const nonce = this.generateNonce();
|
|
311
|
-
res.setHeader('DPoP-Nonce', nonce);
|
|
312
|
-
}
|
|
313
|
-
return res.status(401).json({
|
|
314
|
-
error: 'Invalid DPoP proof',
|
|
315
|
-
detail: validation.error
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
// Add JKT to request for token binding validation
|
|
319
|
-
req.dpopJkt = validation.jkt;
|
|
320
|
-
next();
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Get statistics about DPoP usage
|
|
325
|
-
*/
|
|
326
|
-
getStats() {
|
|
327
|
-
this.cleanupExpiredJtis();
|
|
328
|
-
this.cleanupExpiredNonces();
|
|
329
|
-
return {
|
|
330
|
-
activeJtis: this.jtiCache.size,
|
|
331
|
-
activeNonces: this.nonceCache.size,
|
|
332
|
-
totalValidations: 0, // Would need to track this
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
// Export singleton instance
|
|
337
|
-
export const dpopManager = new DPoPManager();
|
|
338
|
-
//# sourceMappingURL=dpop.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dpop.js","sourceRoot":"","sources":["../../../src/server/oauth/dpop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Consent types as per GDPR Article 6
|
|
3
|
-
*/
|
|
4
|
-
export declare enum ConsentType {
|
|
5
|
-
NECESSARY = "necessary",// Contract fulfillment
|
|
6
|
-
LEGITIMATE_INTEREST = "legitimate",// Legitimate business interest
|
|
7
|
-
CONSENT = "consent",// Explicit user consent
|
|
8
|
-
LEGAL_OBLIGATION = "legal",// Legal requirement
|
|
9
|
-
VITAL_INTERESTS = "vital",// Protect vital interests
|
|
10
|
-
PUBLIC_TASK = "public"
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Processing purposes requiring consent
|
|
14
|
-
*/
|
|
15
|
-
export declare enum ProcessingPurpose {
|
|
16
|
-
AUTHENTICATION = "authentication",
|
|
17
|
-
PROFILE_DATA = "profile_data",
|
|
18
|
-
ANALYTICS = "analytics",
|
|
19
|
-
MARKETING = "marketing",
|
|
20
|
-
THIRD_PARTY_SHARING = "third_party",
|
|
21
|
-
DATA_RETENTION = "data_retention",
|
|
22
|
-
COOKIES = "cookies",
|
|
23
|
-
LOCATION = "location",
|
|
24
|
-
BIOMETRIC = "biometric",
|
|
25
|
-
HEALTH_DATA = "health_data"
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Consent record structure
|
|
29
|
-
*/
|
|
30
|
-
export interface ConsentRecord {
|
|
31
|
-
id: string;
|
|
32
|
-
userId: string;
|
|
33
|
-
purpose: ProcessingPurpose;
|
|
34
|
-
lawfulBasis: ConsentType;
|
|
35
|
-
granted: boolean;
|
|
36
|
-
grantedAt?: Date;
|
|
37
|
-
revokedAt?: Date;
|
|
38
|
-
expiresAt?: Date;
|
|
39
|
-
version: string;
|
|
40
|
-
ipAddress?: string;
|
|
41
|
-
userAgent?: string;
|
|
42
|
-
parentalConsent?: boolean;
|
|
43
|
-
metadata?: {
|
|
44
|
-
consentText: string;
|
|
45
|
-
privacyPolicyVersion: string;
|
|
46
|
-
termsVersion: string;
|
|
47
|
-
language: string;
|
|
48
|
-
channel: 'web' | 'mobile' | 'api';
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Consent preferences
|
|
53
|
-
*/
|
|
54
|
-
export interface ConsentPreferences {
|
|
55
|
-
userId: string;
|
|
56
|
-
consents: Map<ProcessingPurpose, ConsentRecord>;
|
|
57
|
-
globalOptOut: boolean;
|
|
58
|
-
communicationPreferences: {
|
|
59
|
-
email: boolean;
|
|
60
|
-
sms: boolean;
|
|
61
|
-
push: boolean;
|
|
62
|
-
phone: boolean;
|
|
63
|
-
};
|
|
64
|
-
dataRetentionPeriod?: number;
|
|
65
|
-
lastUpdated: Date;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* GDPR Consent Manager
|
|
69
|
-
* Manages user consent per GDPR Articles 6, 7, and 8
|
|
70
|
-
*/
|
|
71
|
-
export declare class ConsentManager {
|
|
72
|
-
private readonly CONSENT_VERSION;
|
|
73
|
-
private readonly PRIVACY_POLICY_VERSION;
|
|
74
|
-
private readonly MINIMUM_AGE_EU;
|
|
75
|
-
private readonly MINIMUM_AGE_US;
|
|
76
|
-
private readonly CONSENT_EXPIRY_DAYS;
|
|
77
|
-
private consentCache;
|
|
78
|
-
private readonly CACHE_TTL;
|
|
79
|
-
/**
|
|
80
|
-
* Record user consent
|
|
81
|
-
*/
|
|
82
|
-
recordConsent(userId: string, purpose: ProcessingPurpose, granted: boolean, options?: {
|
|
83
|
-
ipAddress?: string;
|
|
84
|
-
userAgent?: string;
|
|
85
|
-
parentalConsent?: boolean;
|
|
86
|
-
expiryDays?: number;
|
|
87
|
-
metadata?: ConsentRecord['metadata'];
|
|
88
|
-
}): Promise<ConsentRecord>;
|
|
89
|
-
/**
|
|
90
|
-
* Bulk consent update
|
|
91
|
-
*/
|
|
92
|
-
updateBulkConsent(userId: string, consents: Map<ProcessingPurpose, boolean>, context?: {
|
|
93
|
-
ipAddress?: string;
|
|
94
|
-
userAgent?: string;
|
|
95
|
-
}): Promise<ConsentPreferences>;
|
|
96
|
-
/**
|
|
97
|
-
* Check if user has valid consent for purpose
|
|
98
|
-
*/
|
|
99
|
-
hasValidConsent(userId: string, purpose: ProcessingPurpose): Promise<boolean>;
|
|
100
|
-
/**
|
|
101
|
-
* Get all user consents
|
|
102
|
-
*/
|
|
103
|
-
getUserConsents(userId: string): Promise<ConsentPreferences>;
|
|
104
|
-
/**
|
|
105
|
-
* Withdraw consent
|
|
106
|
-
*/
|
|
107
|
-
withdrawConsent(userId: string, purpose: ProcessingPurpose, reason?: string): Promise<void>;
|
|
108
|
-
/**
|
|
109
|
-
* Withdraw all consents (global opt-out)
|
|
110
|
-
*/
|
|
111
|
-
withdrawAllConsents(userId: string): Promise<void>;
|
|
112
|
-
/**
|
|
113
|
-
* Check parental consent requirement
|
|
114
|
-
*/
|
|
115
|
-
requiresParentalConsent(birthDate: Date, country: string): Promise<boolean>;
|
|
116
|
-
/**
|
|
117
|
-
* Verify parental consent
|
|
118
|
-
*/
|
|
119
|
-
verifyParentalConsent(childUserId: string, parentEmail: string, verificationCode: string): Promise<boolean>;
|
|
120
|
-
/**
|
|
121
|
-
* Generate consent request for special category data
|
|
122
|
-
*/
|
|
123
|
-
requestSpecialCategoryConsent(userId: string, dataTypes: string[], justification: string): Promise<string>;
|
|
124
|
-
/**
|
|
125
|
-
* Export consent history for data portability
|
|
126
|
-
*/
|
|
127
|
-
exportConsentHistory(userId: string): Promise<{
|
|
128
|
-
consents: ConsentRecord[];
|
|
129
|
-
preferences: ConsentPreferences;
|
|
130
|
-
exportDate: Date;
|
|
131
|
-
}>;
|
|
132
|
-
/**
|
|
133
|
-
* Check consent validity
|
|
134
|
-
*/
|
|
135
|
-
private isConsentValid;
|
|
136
|
-
/**
|
|
137
|
-
* Determine lawful basis for processing purpose
|
|
138
|
-
*/
|
|
139
|
-
private determineLawfulBasis;
|
|
140
|
-
/**
|
|
141
|
-
* Get consent text for purpose
|
|
142
|
-
*/
|
|
143
|
-
private getConsentText;
|
|
144
|
-
/**
|
|
145
|
-
* Check if purpose requires confirmation
|
|
146
|
-
*/
|
|
147
|
-
private requiresConfirmation;
|
|
148
|
-
/**
|
|
149
|
-
* Check if withdrawal requires data deletion
|
|
150
|
-
*/
|
|
151
|
-
private requiresDataDeletion;
|
|
152
|
-
/**
|
|
153
|
-
* Generate consent ID
|
|
154
|
-
*/
|
|
155
|
-
private generateConsentId;
|
|
156
|
-
/**
|
|
157
|
-
* Calculate age from birthdate
|
|
158
|
-
*/
|
|
159
|
-
private calculateAge;
|
|
160
|
-
/**
|
|
161
|
-
* Check if country is in EU
|
|
162
|
-
*/
|
|
163
|
-
private isEUCountry;
|
|
164
|
-
private storeConsentRecord;
|
|
165
|
-
private loadUserConsents;
|
|
166
|
-
private loadAllUserConsentHistory;
|
|
167
|
-
private storeSpecialConsentRequest;
|
|
168
|
-
private checkParentalVerification;
|
|
169
|
-
private triggerDataDeletion;
|
|
170
|
-
private sendConsentConfirmation;
|
|
171
|
-
}
|
|
172
|
-
export declare const consentManager: ConsentManager;
|
|
173
|
-
//# sourceMappingURL=consent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../src/server/oauth/gdpr/consent.ts"],"names":[],"mappings":"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"}
|