couchloop-eq-mcp 1.0.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.
Files changed (222) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +358 -0
  3. package/assets/logo/README.md +12 -0
  4. package/assets/logo/couchloop_EQ-IconLogo.png +0 -0
  5. package/dist/auth/middleware.d.ts +8 -0
  6. package/dist/auth/middleware.d.ts.map +1 -0
  7. package/dist/auth/middleware.js +59 -0
  8. package/dist/auth/middleware.js.map +1 -0
  9. package/dist/clients/shrinkChatClient.d.ts +195 -0
  10. package/dist/clients/shrinkChatClient.d.ts.map +1 -0
  11. package/dist/clients/shrinkChatClient.js +349 -0
  12. package/dist/clients/shrinkChatClient.js.map +1 -0
  13. package/dist/db/client.d.ts +23 -0
  14. package/dist/db/client.d.ts.map +1 -0
  15. package/dist/db/client.js +78 -0
  16. package/dist/db/client.js.map +1 -0
  17. package/dist/db/migrate.d.ts +4 -0
  18. package/dist/db/migrate.d.ts.map +1 -0
  19. package/dist/db/migrate.js +34 -0
  20. package/dist/db/migrate.js.map +1 -0
  21. package/dist/db/migrations/schema.d.ts +1074 -0
  22. package/dist/db/migrations/schema.d.ts.map +1 -0
  23. package/dist/db/migrations/schema.js +160 -0
  24. package/dist/db/migrations/schema.js.map +1 -0
  25. package/dist/db/schema.d.ts +1213 -0
  26. package/dist/db/schema.d.ts.map +1 -0
  27. package/dist/db/schema.js +157 -0
  28. package/dist/db/schema.js.map +1 -0
  29. package/dist/db/seed.d.ts +4 -0
  30. package/dist/db/seed.d.ts.map +1 -0
  31. package/dist/db/seed.js +57 -0
  32. package/dist/db/seed.js.map +1 -0
  33. package/dist/db/seedOAuth.d.ts +4 -0
  34. package/dist/db/seedOAuth.d.ts.map +1 -0
  35. package/dist/db/seedOAuth.js +76 -0
  36. package/dist/db/seedOAuth.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +93 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/resources/index.d.ts +11 -0
  42. package/dist/resources/index.d.ts.map +1 -0
  43. package/dist/resources/index.js +56 -0
  44. package/dist/resources/index.js.map +1 -0
  45. package/dist/resources/journey-status.d.ts +2 -0
  46. package/dist/resources/journey-status.d.ts.map +1 -0
  47. package/dist/resources/journey-status.js +42 -0
  48. package/dist/resources/journey-status.js.map +1 -0
  49. package/dist/resources/session-summary.d.ts +2 -0
  50. package/dist/resources/session-summary.d.ts.map +1 -0
  51. package/dist/resources/session-summary.js +85 -0
  52. package/dist/resources/session-summary.js.map +1 -0
  53. package/dist/resources/user-context.d.ts +2 -0
  54. package/dist/resources/user-context.d.ts.map +1 -0
  55. package/dist/resources/user-context.js +79 -0
  56. package/dist/resources/user-context.js.map +1 -0
  57. package/dist/server/index.d.ts +3 -0
  58. package/dist/server/index.d.ts.map +1 -0
  59. package/dist/server/index.js +385 -0
  60. package/dist/server/index.js.map +1 -0
  61. package/dist/server/middleware/auth.d.ts +30 -0
  62. package/dist/server/middleware/auth.d.ts.map +1 -0
  63. package/dist/server/middleware/auth.js +157 -0
  64. package/dist/server/middleware/auth.js.map +1 -0
  65. package/dist/server/oauth/anomalyDetection.d.ts +146 -0
  66. package/dist/server/oauth/anomalyDetection.d.ts.map +1 -0
  67. package/dist/server/oauth/anomalyDetection.js +405 -0
  68. package/dist/server/oauth/anomalyDetection.js.map +1 -0
  69. package/dist/server/oauth/authServer.d.ts +61 -0
  70. package/dist/server/oauth/authServer.d.ts.map +1 -0
  71. package/dist/server/oauth/authServer.js +283 -0
  72. package/dist/server/oauth/authServer.js.map +1 -0
  73. package/dist/server/oauth/dpop.d.ts +135 -0
  74. package/dist/server/oauth/dpop.d.ts.map +1 -0
  75. package/dist/server/oauth/dpop.js +338 -0
  76. package/dist/server/oauth/dpop.js.map +1 -0
  77. package/dist/server/oauth/gdpr/consent.d.ts +173 -0
  78. package/dist/server/oauth/gdpr/consent.d.ts.map +1 -0
  79. package/dist/server/oauth/gdpr/consent.js +388 -0
  80. package/dist/server/oauth/gdpr/consent.js.map +1 -0
  81. package/dist/server/oauth/gdpr/dataPortability.d.ts +214 -0
  82. package/dist/server/oauth/gdpr/dataPortability.d.ts.map +1 -0
  83. package/dist/server/oauth/gdpr/dataPortability.js +486 -0
  84. package/dist/server/oauth/gdpr/dataPortability.js.map +1 -0
  85. package/dist/server/oauth/gdpr/index.d.ts +103 -0
  86. package/dist/server/oauth/gdpr/index.d.ts.map +1 -0
  87. package/dist/server/oauth/gdpr/index.js +273 -0
  88. package/dist/server/oauth/gdpr/index.js.map +1 -0
  89. package/dist/server/oauth/gdpr/rightToErasure.d.ts +184 -0
  90. package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +1 -0
  91. package/dist/server/oauth/gdpr/rightToErasure.js +527 -0
  92. package/dist/server/oauth/gdpr/rightToErasure.js.map +1 -0
  93. package/dist/server/oauth/monitoring/securityMonitor.d.ts +218 -0
  94. package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +1 -0
  95. package/dist/server/oauth/monitoring/securityMonitor.js +615 -0
  96. package/dist/server/oauth/monitoring/securityMonitor.js.map +1 -0
  97. package/dist/server/oauth/pkce.d.ts +61 -0
  98. package/dist/server/oauth/pkce.d.ts.map +1 -0
  99. package/dist/server/oauth/pkce.js +157 -0
  100. package/dist/server/oauth/pkce.js.map +1 -0
  101. package/dist/server/oauth/providers/base.d.ts +147 -0
  102. package/dist/server/oauth/providers/base.d.ts.map +1 -0
  103. package/dist/server/oauth/providers/base.js +312 -0
  104. package/dist/server/oauth/providers/base.js.map +1 -0
  105. package/dist/server/oauth/providers/github.d.ts +55 -0
  106. package/dist/server/oauth/providers/github.d.ts.map +1 -0
  107. package/dist/server/oauth/providers/github.js +225 -0
  108. package/dist/server/oauth/providers/github.js.map +1 -0
  109. package/dist/server/oauth/providers/google.d.ts +49 -0
  110. package/dist/server/oauth/providers/google.d.ts.map +1 -0
  111. package/dist/server/oauth/providers/google.js +153 -0
  112. package/dist/server/oauth/providers/google.js.map +1 -0
  113. package/dist/server/oauth/providers/index.d.ts +9 -0
  114. package/dist/server/oauth/providers/index.d.ts.map +1 -0
  115. package/dist/server/oauth/providers/index.js +24 -0
  116. package/dist/server/oauth/providers/index.js.map +1 -0
  117. package/dist/server/oauth/refreshTokenRotation.d.ts +114 -0
  118. package/dist/server/oauth/refreshTokenRotation.d.ts.map +1 -0
  119. package/dist/server/oauth/refreshTokenRotation.js +344 -0
  120. package/dist/server/oauth/refreshTokenRotation.js.map +1 -0
  121. package/dist/server/oauth/security.d.ts +101 -0
  122. package/dist/server/oauth/security.d.ts.map +1 -0
  123. package/dist/server/oauth/security.js +268 -0
  124. package/dist/server/oauth/security.js.map +1 -0
  125. package/dist/server/oauth/tokenEncryption.d.ts +80 -0
  126. package/dist/server/oauth/tokenEncryption.d.ts.map +1 -0
  127. package/dist/server/oauth/tokenEncryption.js +218 -0
  128. package/dist/server/oauth/tokenEncryption.js.map +1 -0
  129. package/dist/tools/checkpoint.d.ts +35 -0
  130. package/dist/tools/checkpoint.d.ts.map +1 -0
  131. package/dist/tools/checkpoint.js +125 -0
  132. package/dist/tools/checkpoint.js.map +1 -0
  133. package/dist/tools/index.d.ts +412 -0
  134. package/dist/tools/index.d.ts.map +1 -0
  135. package/dist/tools/index.js +262 -0
  136. package/dist/tools/index.js.map +1 -0
  137. package/dist/tools/insight.d.ts +65 -0
  138. package/dist/tools/insight.d.ts.map +1 -0
  139. package/dist/tools/insight.js +190 -0
  140. package/dist/tools/insight.js.map +1 -0
  141. package/dist/tools/journey.d.ts +45 -0
  142. package/dist/tools/journey.d.ts.map +1 -0
  143. package/dist/tools/journey.js +115 -0
  144. package/dist/tools/journey.js.map +1 -0
  145. package/dist/tools/sendMessage.d.ts +6 -0
  146. package/dist/tools/sendMessage.d.ts.map +1 -0
  147. package/dist/tools/sendMessage.js +278 -0
  148. package/dist/tools/sendMessage.js.map +1 -0
  149. package/dist/tools/session.d.ts +106 -0
  150. package/dist/tools/session.d.ts.map +1 -0
  151. package/dist/tools/session.js +161 -0
  152. package/dist/tools/session.js.map +1 -0
  153. package/dist/types/auth.d.ts +37 -0
  154. package/dist/types/auth.d.ts.map +1 -0
  155. package/dist/types/auth.js +44 -0
  156. package/dist/types/auth.js.map +1 -0
  157. package/dist/types/checkpoint.d.ts +25 -0
  158. package/dist/types/checkpoint.d.ts.map +1 -0
  159. package/dist/types/checkpoint.js +8 -0
  160. package/dist/types/checkpoint.js.map +1 -0
  161. package/dist/types/insight.d.ts +83 -0
  162. package/dist/types/insight.d.ts.map +1 -0
  163. package/dist/types/insight.js +14 -0
  164. package/dist/types/insight.js.map +1 -0
  165. package/dist/types/journey.d.ts +155 -0
  166. package/dist/types/journey.d.ts.map +1 -0
  167. package/dist/types/journey.js +29 -0
  168. package/dist/types/journey.js.map +1 -0
  169. package/dist/types/session.d.ts +82 -0
  170. package/dist/types/session.d.ts.map +1 -0
  171. package/dist/types/session.js +13 -0
  172. package/dist/types/session.js.map +1 -0
  173. package/dist/utils/circuitBreaker.d.ts +86 -0
  174. package/dist/utils/circuitBreaker.d.ts.map +1 -0
  175. package/dist/utils/circuitBreaker.js +234 -0
  176. package/dist/utils/circuitBreaker.js.map +1 -0
  177. package/dist/utils/errorHandler.d.ts +101 -0
  178. package/dist/utils/errorHandler.d.ts.map +1 -0
  179. package/dist/utils/errorHandler.js +348 -0
  180. package/dist/utils/errorHandler.js.map +1 -0
  181. package/dist/utils/errors.d.ts +36 -0
  182. package/dist/utils/errors.d.ts.map +1 -0
  183. package/dist/utils/errors.js +77 -0
  184. package/dist/utils/errors.js.map +1 -0
  185. package/dist/utils/logger.d.ts +13 -0
  186. package/dist/utils/logger.d.ts.map +1 -0
  187. package/dist/utils/logger.js +49 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/performanceMonitor.d.ts +106 -0
  190. package/dist/utils/performanceMonitor.d.ts.map +1 -0
  191. package/dist/utils/performanceMonitor.js +312 -0
  192. package/dist/utils/performanceMonitor.js.map +1 -0
  193. package/dist/utils/responseCache.d.ts +88 -0
  194. package/dist/utils/responseCache.d.ts.map +1 -0
  195. package/dist/utils/responseCache.js +245 -0
  196. package/dist/utils/responseCache.js.map +1 -0
  197. package/dist/utils/retryStrategy.d.ts +49 -0
  198. package/dist/utils/retryStrategy.d.ts.map +1 -0
  199. package/dist/utils/retryStrategy.js +167 -0
  200. package/dist/utils/retryStrategy.js.map +1 -0
  201. package/dist/workflows/definitions/daily-reflection.d.ts +3 -0
  202. package/dist/workflows/definitions/daily-reflection.d.ts.map +1 -0
  203. package/dist/workflows/definitions/daily-reflection.js +52 -0
  204. package/dist/workflows/definitions/daily-reflection.js.map +1 -0
  205. package/dist/workflows/definitions/gratitude-practice.d.ts +3 -0
  206. package/dist/workflows/definitions/gratitude-practice.d.ts.map +1 -0
  207. package/dist/workflows/definitions/gratitude-practice.js +52 -0
  208. package/dist/workflows/definitions/gratitude-practice.js.map +1 -0
  209. package/dist/workflows/definitions/weekly-review.d.ts +3 -0
  210. package/dist/workflows/definitions/weekly-review.d.ts.map +1 -0
  211. package/dist/workflows/definitions/weekly-review.js +74 -0
  212. package/dist/workflows/definitions/weekly-review.js.map +1 -0
  213. package/dist/workflows/engine.d.ts +21 -0
  214. package/dist/workflows/engine.d.ts.map +1 -0
  215. package/dist/workflows/engine.js +149 -0
  216. package/dist/workflows/engine.js.map +1 -0
  217. package/dist/workflows/index.d.ts +26 -0
  218. package/dist/workflows/index.d.ts.map +1 -0
  219. package/dist/workflows/index.js +14 -0
  220. package/dist/workflows/index.js.map +1 -0
  221. package/package.json +98 -0
  222. package/run-mcp-server.sh +16 -0
@@ -0,0 +1,338 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpop.js","sourceRoot":"","sources":["../../../src/server/oauth/dpop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAA2B,MAAM,QAAQ,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAO,SAAS,EAAE,MAAM,MAAM,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAiC/C;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACL,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,OAAO,GAAG,OAAO,CAAC,CAAC,SAAS;IAC5B,SAAS,GAAG,MAAM,CAAC,CAAC,aAAa;IACjC,aAAa,GAAG,GAAG,CAAC,CAAC,uBAAuB;IAE7D;;OAEG;IACH,eAAe,CAAC,YAA+B,OAAO;QAKpD,IAAI,OAAO,CAAC;QAEZ,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE;gBACnC,aAAa,EAAE,IAAI;gBACnB,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;gBAClD,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;aACrD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE;gBAClC,UAAU,EAAE,OAAO;gBACnB,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;gBAClD,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;aACrD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAiC,CAAC;QAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAkC,CAAC;QAE9D,MAAM,CAAC,IAAI,CAAC,kBAAkB,SAAS,WAAW,CAAC,CAAC;QAEpD,OAAO;YACL,SAAS;YACT,UAAU;YACV,GAAG,EAAE,EAAS,CAAC,sCAAsC;SACtD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,UAAqB,EACrB,UAAkB,EAClB,OAAe,EACf,OAIC;QAED,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE1C,6BAA6B;QAC7B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAExC,MAAM,OAAO,GAAgB;YAC3B,GAAG;YACH,GAAG,EAAE,UAAU,CAAC,WAAW,EAAE;YAC7B,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YAC/B,GAAG,EAAE,GAAG;SACT,CAAC;QAEF,oCAAoC;QACpC,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1D,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,CAAC;QAED,uBAAuB;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;aACrC,kBAAkB,CAAC;YAClB,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,SAAS;YACd,GAAG;SACJ,CAAC;aACD,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpB,MAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,IAAI,OAAO,EAAE,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,SAAiB,EACjB,UAAkB,EAClB,OAAe,EACf,OAIC;QAED,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE1E,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC9B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;YAC1D,CAAC;YAED,iCAAiC;YACjC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1D,uBAAuB;YACvB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE;gBACxD,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;aACzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAiC,CAAC;YAEjD,uBAAuB;YACvB,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;YACpG,CAAC;YAED,oBAAoB;YACpB,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YACtD,CAAC;YAED,qCAAqC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;YACtE,CAAC;YAED,wCAAwC;YACxC,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;YAChF,CAAC;YAED,4CAA4C;YAC5C,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;gBACzB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC9D,IAAI,MAAM,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;oBAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;gBAC/D,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACtB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC;YAC1E,CAAC;YAED,6BAA6B;YAC7B,IAAI,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;gBAC3D,CAAC;gBACD,IAAI,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;oBACpE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;gBACnD,CAAC;gBACD,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;gBAC7D,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEhC,6CAA6C;YAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1D,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAE9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAE5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,oBAAoB,CAClB,KAAU,EACV,GAAW;QAEX,OAAO;YACL,GAAG,KAAK;YACR,GAAG,EAAE;gBACH,GAAG,EAAE,iBAAiB;aACvB;YACD,UAAU,EAAE,MAAM,EAAE,sBAAsB;SAC3C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,oBAAoB,CAClB,KAAU,EACV,OAAe;QAEf,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,KAAa;QACnC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;aAC9B,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;aACtB,MAAM,CAAC,WAAW,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,GAAQ;QAC3C,uCAAuC;QACvC,MAAM,SAAS,GAAQ,EAAE,CAAC;QAE1B,0CAA0C;QAC1C,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACtB,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACpB,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5B,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YACxB,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACpB,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;aAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;aACpB,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAW;QAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,kCAAkC;QAClC,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IACpE,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,GAAW;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,GAAW;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACzD,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAA2D;QACpE,OAAO,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;oBACzB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBAChE,CAAC;gBACD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,6CAA6C;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAEtD,sBAAsB;YACtB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAC7C,UAAU,EACV,GAAG,CAAC,MAAM,EACV,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,EACxD;gBACE,WAAW;gBACX,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;gBACxC,YAAY,EAAE,OAAO,EAAE,YAAY;aACpC,CACF,CAAC;YAEF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,2BAA2B,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;gBAE3D,6CAA6C;gBAC7C,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;gBAED,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,oBAAoB;oBAC3B,MAAM,EAAE,UAAU,CAAC,KAAK;iBACzB,CAAC,CAAC;YACL,CAAC;YAED,kDAAkD;YAClD,GAAG,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC;YAE7B,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ;QAKN,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC9B,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAClC,gBAAgB,EAAE,CAAC,EAAE,2BAA2B;SACjD,CAAC;IACJ,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,173 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../src/server/oauth/gdpr/consent.ts"],"names":[],"mappings":"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"}