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.
- package/LICENSE +21 -0
- package/README.md +358 -0
- package/assets/logo/README.md +12 -0
- package/assets/logo/couchloop_EQ-IconLogo.png +0 -0
- package/dist/auth/middleware.d.ts +8 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +59 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/clients/shrinkChatClient.d.ts +195 -0
- package/dist/clients/shrinkChatClient.d.ts.map +1 -0
- package/dist/clients/shrinkChatClient.js +349 -0
- package/dist/clients/shrinkChatClient.js.map +1 -0
- package/dist/db/client.d.ts +23 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +78 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrate.d.ts +4 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +34 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/schema.d.ts +1074 -0
- package/dist/db/migrations/schema.d.ts.map +1 -0
- package/dist/db/migrations/schema.js +160 -0
- package/dist/db/migrations/schema.js.map +1 -0
- package/dist/db/schema.d.ts +1213 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +157 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/seed.d.ts +4 -0
- package/dist/db/seed.d.ts.map +1 -0
- package/dist/db/seed.js +57 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/db/seedOAuth.d.ts +4 -0
- package/dist/db/seedOAuth.d.ts.map +1 -0
- package/dist/db/seedOAuth.js +76 -0
- package/dist/db/seedOAuth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +11 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +56 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/journey-status.d.ts +2 -0
- package/dist/resources/journey-status.d.ts.map +1 -0
- package/dist/resources/journey-status.js +42 -0
- package/dist/resources/journey-status.js.map +1 -0
- package/dist/resources/session-summary.d.ts +2 -0
- package/dist/resources/session-summary.d.ts.map +1 -0
- package/dist/resources/session-summary.js +85 -0
- package/dist/resources/session-summary.js.map +1 -0
- package/dist/resources/user-context.d.ts +2 -0
- package/dist/resources/user-context.d.ts.map +1 -0
- package/dist/resources/user-context.js +79 -0
- package/dist/resources/user-context.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +385 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +30 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +157 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/oauth/anomalyDetection.d.ts +146 -0
- package/dist/server/oauth/anomalyDetection.d.ts.map +1 -0
- package/dist/server/oauth/anomalyDetection.js +405 -0
- package/dist/server/oauth/anomalyDetection.js.map +1 -0
- package/dist/server/oauth/authServer.d.ts +61 -0
- package/dist/server/oauth/authServer.d.ts.map +1 -0
- package/dist/server/oauth/authServer.js +283 -0
- package/dist/server/oauth/authServer.js.map +1 -0
- package/dist/server/oauth/dpop.d.ts +135 -0
- package/dist/server/oauth/dpop.d.ts.map +1 -0
- package/dist/server/oauth/dpop.js +338 -0
- package/dist/server/oauth/dpop.js.map +1 -0
- package/dist/server/oauth/gdpr/consent.d.ts +173 -0
- package/dist/server/oauth/gdpr/consent.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/consent.js +388 -0
- package/dist/server/oauth/gdpr/consent.js.map +1 -0
- package/dist/server/oauth/gdpr/dataPortability.d.ts +214 -0
- package/dist/server/oauth/gdpr/dataPortability.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/dataPortability.js +486 -0
- package/dist/server/oauth/gdpr/dataPortability.js.map +1 -0
- package/dist/server/oauth/gdpr/index.d.ts +103 -0
- package/dist/server/oauth/gdpr/index.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/index.js +273 -0
- package/dist/server/oauth/gdpr/index.js.map +1 -0
- package/dist/server/oauth/gdpr/rightToErasure.d.ts +184 -0
- package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/rightToErasure.js +527 -0
- package/dist/server/oauth/gdpr/rightToErasure.js.map +1 -0
- package/dist/server/oauth/monitoring/securityMonitor.d.ts +218 -0
- package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +1 -0
- package/dist/server/oauth/monitoring/securityMonitor.js +615 -0
- package/dist/server/oauth/monitoring/securityMonitor.js.map +1 -0
- package/dist/server/oauth/pkce.d.ts +61 -0
- package/dist/server/oauth/pkce.d.ts.map +1 -0
- package/dist/server/oauth/pkce.js +157 -0
- package/dist/server/oauth/pkce.js.map +1 -0
- package/dist/server/oauth/providers/base.d.ts +147 -0
- package/dist/server/oauth/providers/base.d.ts.map +1 -0
- package/dist/server/oauth/providers/base.js +312 -0
- package/dist/server/oauth/providers/base.js.map +1 -0
- package/dist/server/oauth/providers/github.d.ts +55 -0
- package/dist/server/oauth/providers/github.d.ts.map +1 -0
- package/dist/server/oauth/providers/github.js +225 -0
- package/dist/server/oauth/providers/github.js.map +1 -0
- package/dist/server/oauth/providers/google.d.ts +49 -0
- package/dist/server/oauth/providers/google.d.ts.map +1 -0
- package/dist/server/oauth/providers/google.js +153 -0
- package/dist/server/oauth/providers/google.js.map +1 -0
- package/dist/server/oauth/providers/index.d.ts +9 -0
- package/dist/server/oauth/providers/index.d.ts.map +1 -0
- package/dist/server/oauth/providers/index.js +24 -0
- package/dist/server/oauth/providers/index.js.map +1 -0
- package/dist/server/oauth/refreshTokenRotation.d.ts +114 -0
- package/dist/server/oauth/refreshTokenRotation.d.ts.map +1 -0
- package/dist/server/oauth/refreshTokenRotation.js +344 -0
- package/dist/server/oauth/refreshTokenRotation.js.map +1 -0
- package/dist/server/oauth/security.d.ts +101 -0
- package/dist/server/oauth/security.d.ts.map +1 -0
- package/dist/server/oauth/security.js +268 -0
- package/dist/server/oauth/security.js.map +1 -0
- package/dist/server/oauth/tokenEncryption.d.ts +80 -0
- package/dist/server/oauth/tokenEncryption.d.ts.map +1 -0
- package/dist/server/oauth/tokenEncryption.js +218 -0
- package/dist/server/oauth/tokenEncryption.js.map +1 -0
- package/dist/tools/checkpoint.d.ts +35 -0
- package/dist/tools/checkpoint.d.ts.map +1 -0
- package/dist/tools/checkpoint.js +125 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/index.d.ts +412 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +262 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/insight.d.ts +65 -0
- package/dist/tools/insight.d.ts.map +1 -0
- package/dist/tools/insight.js +190 -0
- package/dist/tools/insight.js.map +1 -0
- package/dist/tools/journey.d.ts +45 -0
- package/dist/tools/journey.d.ts.map +1 -0
- package/dist/tools/journey.js +115 -0
- package/dist/tools/journey.js.map +1 -0
- package/dist/tools/sendMessage.d.ts +6 -0
- package/dist/tools/sendMessage.d.ts.map +1 -0
- package/dist/tools/sendMessage.js +278 -0
- package/dist/tools/sendMessage.js.map +1 -0
- package/dist/tools/session.d.ts +106 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +161 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/types/auth.d.ts +37 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +44 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/checkpoint.d.ts +25 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +8 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types/insight.d.ts +83 -0
- package/dist/types/insight.d.ts.map +1 -0
- package/dist/types/insight.js +14 -0
- package/dist/types/insight.js.map +1 -0
- package/dist/types/journey.d.ts +155 -0
- package/dist/types/journey.d.ts.map +1 -0
- package/dist/types/journey.js +29 -0
- package/dist/types/journey.js.map +1 -0
- package/dist/types/session.d.ts +82 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +13 -0
- package/dist/types/session.js.map +1 -0
- package/dist/utils/circuitBreaker.d.ts +86 -0
- package/dist/utils/circuitBreaker.d.ts.map +1 -0
- package/dist/utils/circuitBreaker.js +234 -0
- package/dist/utils/circuitBreaker.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +101 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +348 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +77 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performanceMonitor.d.ts +106 -0
- package/dist/utils/performanceMonitor.d.ts.map +1 -0
- package/dist/utils/performanceMonitor.js +312 -0
- package/dist/utils/performanceMonitor.js.map +1 -0
- package/dist/utils/responseCache.d.ts +88 -0
- package/dist/utils/responseCache.d.ts.map +1 -0
- package/dist/utils/responseCache.js +245 -0
- package/dist/utils/responseCache.js.map +1 -0
- package/dist/utils/retryStrategy.d.ts +49 -0
- package/dist/utils/retryStrategy.d.ts.map +1 -0
- package/dist/utils/retryStrategy.js +167 -0
- package/dist/utils/retryStrategy.js.map +1 -0
- package/dist/workflows/definitions/daily-reflection.d.ts +3 -0
- package/dist/workflows/definitions/daily-reflection.d.ts.map +1 -0
- package/dist/workflows/definitions/daily-reflection.js +52 -0
- package/dist/workflows/definitions/daily-reflection.js.map +1 -0
- package/dist/workflows/definitions/gratitude-practice.d.ts +3 -0
- package/dist/workflows/definitions/gratitude-practice.d.ts.map +1 -0
- package/dist/workflows/definitions/gratitude-practice.js +52 -0
- package/dist/workflows/definitions/gratitude-practice.js.map +1 -0
- package/dist/workflows/definitions/weekly-review.d.ts +3 -0
- package/dist/workflows/definitions/weekly-review.d.ts.map +1 -0
- package/dist/workflows/definitions/weekly-review.js +74 -0
- package/dist/workflows/definitions/weekly-review.js.map +1 -0
- package/dist/workflows/engine.d.ts +21 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +149 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/index.d.ts +26 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +14 -0
- package/dist/workflows/index.js.map +1 -0
- package/package.json +98 -0
- package/run-mcp-server.sh +16 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { logger } from '../../utils/logger.js';
|
|
3
|
+
import { getDb } from '../../db/client.js';
|
|
4
|
+
/**
|
|
5
|
+
* Anomaly Detection System
|
|
6
|
+
* Detects suspicious authentication patterns and potential attacks
|
|
7
|
+
*/
|
|
8
|
+
export class AnomalyDetector {
|
|
9
|
+
userProfiles = new Map();
|
|
10
|
+
ipReputation = new Map();
|
|
11
|
+
MAX_FAILED_ATTEMPTS = 5;
|
|
12
|
+
IMPOSSIBLE_TRAVEL_SPEED = 900; // km/h
|
|
13
|
+
TIME_WINDOW = 3600000; // 1 hour
|
|
14
|
+
riskFactors = {
|
|
15
|
+
vpnWeight: 0.3,
|
|
16
|
+
torWeight: 0.8,
|
|
17
|
+
proxyWeight: 0.4,
|
|
18
|
+
newDeviceWeight: 0.2,
|
|
19
|
+
newLocationWeight: 0.25,
|
|
20
|
+
impossibleTravelWeight: 0.9,
|
|
21
|
+
bruteForceWeight: 0.7,
|
|
22
|
+
timeAnomalyWeight: 0.15,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Analyze authentication request for anomalies
|
|
26
|
+
*/
|
|
27
|
+
async detectAnomalies(request) {
|
|
28
|
+
const scores = {};
|
|
29
|
+
const reasons = [];
|
|
30
|
+
// Check IP reputation
|
|
31
|
+
scores.ip = await this.checkIPReputation(request.ip);
|
|
32
|
+
if (scores.ip > 0.5) {
|
|
33
|
+
reasons.push(`Suspicious IP: ${request.ip}`);
|
|
34
|
+
}
|
|
35
|
+
// Check geolocation anomaly
|
|
36
|
+
if (request.userId) {
|
|
37
|
+
scores.geo = await this.checkGeoAnomaly(request);
|
|
38
|
+
if (scores.geo > 0.5) {
|
|
39
|
+
reasons.push('Unusual location detected');
|
|
40
|
+
}
|
|
41
|
+
// Check device fingerprint
|
|
42
|
+
scores.device = await this.checkDeviceAnomaly(request);
|
|
43
|
+
if (scores.device > 0.3) {
|
|
44
|
+
reasons.push('New or unknown device');
|
|
45
|
+
}
|
|
46
|
+
// Check time-based anomaly
|
|
47
|
+
scores.time = await this.checkTimeAnomaly(request);
|
|
48
|
+
if (scores.time > 0.3) {
|
|
49
|
+
reasons.push('Unusual login time');
|
|
50
|
+
}
|
|
51
|
+
// Check velocity (rate of requests)
|
|
52
|
+
scores.velocity = await this.checkVelocity(request);
|
|
53
|
+
if (scores.velocity > 0.5) {
|
|
54
|
+
reasons.push('High request rate detected');
|
|
55
|
+
}
|
|
56
|
+
// Check behavioral patterns
|
|
57
|
+
scores.pattern = await this.checkBehavioralPattern(request);
|
|
58
|
+
if (scores.pattern > 0.4) {
|
|
59
|
+
reasons.push('Unusual behavior pattern');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// For non-authenticated requests
|
|
64
|
+
scores.geo = 0;
|
|
65
|
+
scores.device = 0;
|
|
66
|
+
scores.time = 0;
|
|
67
|
+
scores.velocity = await this.checkVelocity(request);
|
|
68
|
+
scores.pattern = 0;
|
|
69
|
+
}
|
|
70
|
+
// Calculate composite score
|
|
71
|
+
const weights = [1, 1, 0.8, 0.5, 1.2, 0.9]; // Adjust weights for each factor
|
|
72
|
+
const weightedScores = Object.values(scores).map((s, i) => s * (weights[i] || 1));
|
|
73
|
+
const composite = weightedScores.reduce((a, b) => a + b, 0) / weights.reduce((a, b) => a + b, 0);
|
|
74
|
+
// Determine action based on composite score
|
|
75
|
+
const action = this.determineAction(composite, request);
|
|
76
|
+
// Update user profile if authenticated
|
|
77
|
+
if (request.userId && request.success) {
|
|
78
|
+
await this.updateUserProfile(request);
|
|
79
|
+
}
|
|
80
|
+
// Log anomaly if detected
|
|
81
|
+
if (composite > 0.3) {
|
|
82
|
+
logger.warn(`Anomaly detected for ${request.userId || 'anonymous'}: score=${composite.toFixed(2)}, action=${action}`);
|
|
83
|
+
await this.logAnomaly(request, composite, reasons);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
composite: Math.min(1, composite),
|
|
87
|
+
details: scores,
|
|
88
|
+
action,
|
|
89
|
+
reasons,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check IP reputation
|
|
94
|
+
*/
|
|
95
|
+
async checkIPReputation(ip) {
|
|
96
|
+
// Check cached reputation
|
|
97
|
+
const cached = this.ipReputation.get(ip);
|
|
98
|
+
if (cached !== undefined) {
|
|
99
|
+
return cached;
|
|
100
|
+
}
|
|
101
|
+
let score = 0;
|
|
102
|
+
// Check if IP is in threat lists
|
|
103
|
+
const threats = await this.queryThreatIntelligence(ip);
|
|
104
|
+
if (threats.tor) {
|
|
105
|
+
score = Math.max(score, this.riskFactors.torWeight);
|
|
106
|
+
}
|
|
107
|
+
if (threats.vpn) {
|
|
108
|
+
score = Math.max(score, this.riskFactors.vpnWeight);
|
|
109
|
+
}
|
|
110
|
+
if (threats.proxy) {
|
|
111
|
+
score = Math.max(score, this.riskFactors.proxyWeight);
|
|
112
|
+
}
|
|
113
|
+
if (threats.botnet) {
|
|
114
|
+
score = Math.max(score, 0.95);
|
|
115
|
+
}
|
|
116
|
+
if (threats.spam) {
|
|
117
|
+
score = Math.max(score, 0.6);
|
|
118
|
+
}
|
|
119
|
+
// Cache the result
|
|
120
|
+
this.ipReputation.set(ip, score);
|
|
121
|
+
// Clean old cache entries periodically
|
|
122
|
+
if (this.ipReputation.size > 10000) {
|
|
123
|
+
const toDelete = Array.from(this.ipReputation.keys()).slice(0, 5000);
|
|
124
|
+
toDelete.forEach(key => this.ipReputation.delete(key));
|
|
125
|
+
}
|
|
126
|
+
return score;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check geolocation anomaly
|
|
130
|
+
*/
|
|
131
|
+
async checkGeoAnomaly(request) {
|
|
132
|
+
const profile = this.getUserProfile(request.userId);
|
|
133
|
+
if (!request.metadata?.country) {
|
|
134
|
+
return 0; // No geo data available
|
|
135
|
+
}
|
|
136
|
+
const location = `${request.metadata.country}:${request.metadata.city || 'unknown'}`;
|
|
137
|
+
// Check if location is known
|
|
138
|
+
if (profile.knownLocations.has(location)) {
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
// Check for impossible travel
|
|
142
|
+
if (profile.lastLoginLocation && request.metadata) {
|
|
143
|
+
const timeDiff = request.timestamp.getTime() - profile.lastLoginLocation.timestamp.getTime();
|
|
144
|
+
const distance = this.calculateDistance(profile.lastLoginLocation.lat, profile.lastLoginLocation.lon, 0, // Would need actual coordinates
|
|
145
|
+
0);
|
|
146
|
+
const speed = (distance / timeDiff) * 3600000; // km/h
|
|
147
|
+
if (speed > this.IMPOSSIBLE_TRAVEL_SPEED) {
|
|
148
|
+
logger.warn(`Impossible travel detected: ${speed.toFixed(0)} km/h`);
|
|
149
|
+
return this.riskFactors.impossibleTravelWeight;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// New location
|
|
153
|
+
return this.riskFactors.newLocationWeight;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check device anomaly
|
|
157
|
+
*/
|
|
158
|
+
async checkDeviceAnomaly(request) {
|
|
159
|
+
if (!request.fingerprint) {
|
|
160
|
+
return 0.1; // Slightly suspicious if no fingerprint
|
|
161
|
+
}
|
|
162
|
+
const profile = this.getUserProfile(request.userId);
|
|
163
|
+
if (profile.knownDevices.has(request.fingerprint)) {
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
// New device
|
|
167
|
+
return this.riskFactors.newDeviceWeight;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check time-based anomaly
|
|
171
|
+
*/
|
|
172
|
+
async checkTimeAnomaly(request) {
|
|
173
|
+
const profile = this.getUserProfile(request.userId);
|
|
174
|
+
const hour = request.timestamp.getHours();
|
|
175
|
+
if (profile.loginTimes.length < 10) {
|
|
176
|
+
return 0; // Not enough data
|
|
177
|
+
}
|
|
178
|
+
// Calculate average login time
|
|
179
|
+
const avgHour = profile.loginTimes.reduce((a, b) => a + b, 0) / profile.loginTimes.length;
|
|
180
|
+
const deviation = Math.abs(hour - avgHour);
|
|
181
|
+
// If login is more than 6 hours from average
|
|
182
|
+
if (deviation > 6) {
|
|
183
|
+
return this.riskFactors.timeAnomalyWeight;
|
|
184
|
+
}
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check request velocity
|
|
189
|
+
*/
|
|
190
|
+
async checkVelocity(request) {
|
|
191
|
+
const db = getDb();
|
|
192
|
+
const oneMinuteAgo = new Date(Date.now() - 60000);
|
|
193
|
+
// Count recent requests from this IP
|
|
194
|
+
const recentRequests = await this.countRecentRequests(request.ip, oneMinuteAgo);
|
|
195
|
+
if (recentRequests > 10) {
|
|
196
|
+
return 0.8; // Very high rate
|
|
197
|
+
}
|
|
198
|
+
if (recentRequests > 5) {
|
|
199
|
+
return 0.5; // High rate
|
|
200
|
+
}
|
|
201
|
+
if (recentRequests > 3) {
|
|
202
|
+
return 0.2; // Moderate rate
|
|
203
|
+
}
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Check behavioral patterns
|
|
208
|
+
*/
|
|
209
|
+
async checkBehavioralPattern(request) {
|
|
210
|
+
const profile = this.getUserProfile(request.userId);
|
|
211
|
+
// Check failed attempts (brute force)
|
|
212
|
+
if (!request.success) {
|
|
213
|
+
profile.failedAttempts++;
|
|
214
|
+
profile.lastFailedAttempt = request.timestamp;
|
|
215
|
+
if (profile.failedAttempts >= this.MAX_FAILED_ATTEMPTS) {
|
|
216
|
+
return this.riskFactors.bruteForceWeight;
|
|
217
|
+
}
|
|
218
|
+
return profile.failedAttempts * 0.15; // Incremental risk
|
|
219
|
+
}
|
|
220
|
+
// Reset failed attempts on success
|
|
221
|
+
if (request.success) {
|
|
222
|
+
profile.failedAttempts = 0;
|
|
223
|
+
}
|
|
224
|
+
// Check for automated behavior patterns
|
|
225
|
+
const entropy = this.calculateRequestEntropy(request);
|
|
226
|
+
if (entropy < 0.3) {
|
|
227
|
+
return 0.4; // Low entropy suggests automation
|
|
228
|
+
}
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Determine action based on score and context
|
|
233
|
+
*/
|
|
234
|
+
determineAction(score, request) {
|
|
235
|
+
// Always deny if score is very high
|
|
236
|
+
if (score > 0.8) {
|
|
237
|
+
return 'deny';
|
|
238
|
+
}
|
|
239
|
+
// Challenge for moderate scores
|
|
240
|
+
if (score > 0.4) {
|
|
241
|
+
return 'challenge';
|
|
242
|
+
}
|
|
243
|
+
// Consider user history
|
|
244
|
+
if (request.userId) {
|
|
245
|
+
const profile = this.getUserProfile(request.userId);
|
|
246
|
+
// Be more strict for users with high risk scores
|
|
247
|
+
if (profile.riskScore > 0.5 && score > 0.3) {
|
|
248
|
+
return 'challenge';
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return 'allow';
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Query threat intelligence feeds
|
|
255
|
+
*/
|
|
256
|
+
async queryThreatIntelligence(ip) {
|
|
257
|
+
// In production, this would query actual threat feeds
|
|
258
|
+
// For now, use some heuristics
|
|
259
|
+
// Check if IP is in private ranges (likely VPN/proxy)
|
|
260
|
+
const isPrivate = this.isPrivateIP(ip);
|
|
261
|
+
// Simulate threat detection
|
|
262
|
+
const ipNum = ip.split('.').reduce((acc, octet) => acc * 256 + parseInt(octet), 0);
|
|
263
|
+
const hash = createHash('sha256').update(ip).digest();
|
|
264
|
+
const simulated = hash[0] / 255;
|
|
265
|
+
return {
|
|
266
|
+
tor: simulated > 0.95,
|
|
267
|
+
vpn: isPrivate || simulated > 0.7,
|
|
268
|
+
proxy: simulated > 0.8,
|
|
269
|
+
botnet: simulated > 0.98,
|
|
270
|
+
spam: simulated > 0.85,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Check if IP is in private range
|
|
275
|
+
*/
|
|
276
|
+
isPrivateIP(ip) {
|
|
277
|
+
const parts = ip.split('.').map(p => parseInt(p));
|
|
278
|
+
return (parts[0] === 10 || // 10.0.0.0/8
|
|
279
|
+
(parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) || // 172.16.0.0/12
|
|
280
|
+
(parts[0] === 192 && parts[1] === 168) || // 192.168.0.0/16
|
|
281
|
+
parts[0] === 127 // 127.0.0.0/8 (loopback)
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Calculate distance between two coordinates (Haversine formula)
|
|
286
|
+
*/
|
|
287
|
+
calculateDistance(lat1, lon1, lat2, lon2) {
|
|
288
|
+
const R = 6371; // Earth radius in km
|
|
289
|
+
const dLat = this.toRad(lat2 - lat1);
|
|
290
|
+
const dLon = this.toRad(lon2 - lon1);
|
|
291
|
+
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
292
|
+
Math.cos(this.toRad(lat1)) * Math.cos(this.toRad(lat2)) *
|
|
293
|
+
Math.sin(dLon / 2) * Math.sin(dLon / 2);
|
|
294
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
295
|
+
return R * c;
|
|
296
|
+
}
|
|
297
|
+
toRad(deg) {
|
|
298
|
+
return deg * (Math.PI / 180);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Calculate request entropy (randomness)
|
|
302
|
+
*/
|
|
303
|
+
calculateRequestEntropy(request) {
|
|
304
|
+
const data = JSON.stringify(request);
|
|
305
|
+
const freq = {};
|
|
306
|
+
for (const char of data) {
|
|
307
|
+
freq[char] = (freq[char] || 0) + 1;
|
|
308
|
+
}
|
|
309
|
+
let entropy = 0;
|
|
310
|
+
const len = data.length;
|
|
311
|
+
for (const count of Object.values(freq)) {
|
|
312
|
+
const p = count / len;
|
|
313
|
+
entropy -= p * Math.log2(p);
|
|
314
|
+
}
|
|
315
|
+
return entropy / 8; // Normalize
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Get or create user profile
|
|
319
|
+
*/
|
|
320
|
+
getUserProfile(userId) {
|
|
321
|
+
let profile = this.userProfiles.get(userId);
|
|
322
|
+
if (!profile) {
|
|
323
|
+
profile = {
|
|
324
|
+
userId,
|
|
325
|
+
knownIps: new Set(),
|
|
326
|
+
knownDevices: new Set(),
|
|
327
|
+
knownLocations: new Set(),
|
|
328
|
+
loginTimes: [],
|
|
329
|
+
averageSessionDuration: 0,
|
|
330
|
+
failedAttempts: 0,
|
|
331
|
+
riskScore: 0,
|
|
332
|
+
};
|
|
333
|
+
this.userProfiles.set(userId, profile);
|
|
334
|
+
}
|
|
335
|
+
return profile;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Update user profile with successful authentication
|
|
339
|
+
*/
|
|
340
|
+
async updateUserProfile(request) {
|
|
341
|
+
if (!request.userId)
|
|
342
|
+
return;
|
|
343
|
+
const profile = this.getUserProfile(request.userId);
|
|
344
|
+
// Update known attributes
|
|
345
|
+
profile.knownIps.add(request.ip);
|
|
346
|
+
if (request.fingerprint) {
|
|
347
|
+
profile.knownDevices.add(request.fingerprint);
|
|
348
|
+
}
|
|
349
|
+
if (request.metadata?.country) {
|
|
350
|
+
const location = `${request.metadata.country}:${request.metadata.city || 'unknown'}`;
|
|
351
|
+
profile.knownLocations.add(location);
|
|
352
|
+
}
|
|
353
|
+
// Update login times
|
|
354
|
+
profile.loginTimes.push(request.timestamp.getHours());
|
|
355
|
+
if (profile.loginTimes.length > 100) {
|
|
356
|
+
profile.loginTimes.shift(); // Keep last 100
|
|
357
|
+
}
|
|
358
|
+
// Update risk score (decay over time)
|
|
359
|
+
profile.riskScore = Math.max(0, profile.riskScore * 0.95);
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Count recent requests from IP
|
|
363
|
+
*/
|
|
364
|
+
async countRecentRequests(ip, since) {
|
|
365
|
+
// In production, this would query the database
|
|
366
|
+
// For now, return a simulated count
|
|
367
|
+
return Math.floor(Math.random() * 3);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Log anomaly to database
|
|
371
|
+
*/
|
|
372
|
+
async logAnomaly(request, score, reasons) {
|
|
373
|
+
// TODO: Log to audit database
|
|
374
|
+
logger.info(`Anomaly logged: user=${request.userId}, score=${score}, reasons=${reasons.join(', ')}`);
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Get risk score for a user
|
|
378
|
+
*/
|
|
379
|
+
async getUserRiskScore(userId) {
|
|
380
|
+
const profile = this.userProfiles.get(userId);
|
|
381
|
+
return profile?.riskScore || 0;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Reset user profile (after password reset, etc.)
|
|
385
|
+
*/
|
|
386
|
+
resetUserProfile(userId) {
|
|
387
|
+
this.userProfiles.delete(userId);
|
|
388
|
+
logger.info(`Reset profile for user ${userId}`);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Get statistics
|
|
392
|
+
*/
|
|
393
|
+
getStats() {
|
|
394
|
+
const highRiskUsers = Array.from(this.userProfiles.values())
|
|
395
|
+
.filter(p => p.riskScore > 0.5).length;
|
|
396
|
+
return {
|
|
397
|
+
totalProfiles: this.userProfiles.size,
|
|
398
|
+
totalIPs: this.ipReputation.size,
|
|
399
|
+
highRiskUsers,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Export singleton instance
|
|
404
|
+
export const anomalyDetector = new AnomalyDetector();
|
|
405
|
+
//# sourceMappingURL=anomalyDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomalyDetection.js","sourceRoot":"","sources":["../../../src/server/oauth/anomalyDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
interface TokenPayload {
|
|
2
|
+
sub: string;
|
|
3
|
+
client_id: string;
|
|
4
|
+
scope: string;
|
|
5
|
+
iat?: number;
|
|
6
|
+
exp?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class OAuthServer {
|
|
9
|
+
private readonly jwtSecret;
|
|
10
|
+
private readonly jwtExpiresIn;
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Validate client credentials
|
|
14
|
+
*/
|
|
15
|
+
validateClient(clientId: string, clientSecret?: string): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Generate authorization code for OAuth flow
|
|
18
|
+
*/
|
|
19
|
+
generateAuthCode(clientId: string, userId: string, redirectUri: string, scope?: string): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Exchange authorization code for access token
|
|
22
|
+
*/
|
|
23
|
+
exchangeCodeForToken(code: string, clientId: string, clientSecret: string, redirectUri: string): Promise<{
|
|
24
|
+
access_token: string;
|
|
25
|
+
refresh_token?: string;
|
|
26
|
+
token_type: string;
|
|
27
|
+
expires_in: number;
|
|
28
|
+
scope: string;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Generate access token (JWT)
|
|
32
|
+
*/
|
|
33
|
+
private generateAccessToken;
|
|
34
|
+
/**
|
|
35
|
+
* Generate refresh token
|
|
36
|
+
*/
|
|
37
|
+
private generateRefreshToken;
|
|
38
|
+
/**
|
|
39
|
+
* Validate access token
|
|
40
|
+
*/
|
|
41
|
+
validateAccessToken(token: string): Promise<TokenPayload | null>;
|
|
42
|
+
/**
|
|
43
|
+
* Refresh access token using refresh token
|
|
44
|
+
*/
|
|
45
|
+
refreshAccessToken(refreshToken: string): Promise<{
|
|
46
|
+
access_token: string;
|
|
47
|
+
token_type: string;
|
|
48
|
+
expires_in: number;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Revoke token
|
|
52
|
+
*/
|
|
53
|
+
revokeToken(token: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Create or get user from external ID
|
|
56
|
+
*/
|
|
57
|
+
getOrCreateUser(externalId: string): Promise<string>;
|
|
58
|
+
}
|
|
59
|
+
export declare const oauthServer: OAuthServer;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=authServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authServer.d.ts","sourceRoot":"","sources":["../../../src/server/oauth/authServer.ts"],"names":[],"mappings":"AAYA,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;;IAWtC;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+B/E;;OAEG;IACG,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,MAAqB,GAC3B,OAAO,CAAC,MAAM,CAAC;IAwBlB;;OAEG;IACG,oBAAoB,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QACT,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAuFF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAwBtE;;OAEG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACtD,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAkDF;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAkC3D;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|