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,157 @@
|
|
|
1
|
+
import { oauthServer } from '../oauth/authServer.js';
|
|
2
|
+
import { logger } from '../../utils/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Middleware to validate OAuth access token
|
|
5
|
+
*/
|
|
6
|
+
export async function validateToken(req, res, next) {
|
|
7
|
+
try {
|
|
8
|
+
const authHeader = req.headers.authorization;
|
|
9
|
+
if (!authHeader) {
|
|
10
|
+
res.status(401).json({
|
|
11
|
+
error: 'unauthorized',
|
|
12
|
+
message: 'Missing authorization header',
|
|
13
|
+
});
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (!authHeader.startsWith('Bearer ')) {
|
|
17
|
+
res.status(401).json({
|
|
18
|
+
error: 'unauthorized',
|
|
19
|
+
message: 'Invalid authorization format. Use Bearer token',
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const token = authHeader.substring(7);
|
|
24
|
+
// Validate token
|
|
25
|
+
const tokenPayload = await oauthServer.validateAccessToken(token);
|
|
26
|
+
if (!tokenPayload) {
|
|
27
|
+
res.status(401).json({
|
|
28
|
+
error: 'unauthorized',
|
|
29
|
+
message: 'Invalid or expired access token',
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Attach user context to request
|
|
34
|
+
req.user = {
|
|
35
|
+
userId: tokenPayload.sub,
|
|
36
|
+
clientId: tokenPayload.client_id,
|
|
37
|
+
scope: tokenPayload.scope,
|
|
38
|
+
};
|
|
39
|
+
logger.debug(`Authenticated user ${tokenPayload.sub} from client ${tokenPayload.client_id}`);
|
|
40
|
+
next();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger.error('Token validation error:', error);
|
|
44
|
+
res.status(500).json({
|
|
45
|
+
error: 'internal_error',
|
|
46
|
+
message: 'Failed to validate token',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Middleware to check required scopes
|
|
52
|
+
*/
|
|
53
|
+
export function requireScope(...requiredScopes) {
|
|
54
|
+
return (req, res, next) => {
|
|
55
|
+
if (!req.user) {
|
|
56
|
+
res.status(401).json({
|
|
57
|
+
error: 'unauthorized',
|
|
58
|
+
message: 'Authentication required',
|
|
59
|
+
});
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const userScopes = req.user.scope.split(' ');
|
|
63
|
+
const hasRequiredScope = requiredScopes.some(scope => userScopes.includes(scope));
|
|
64
|
+
if (!hasRequiredScope) {
|
|
65
|
+
res.status(403).json({
|
|
66
|
+
error: 'forbidden',
|
|
67
|
+
message: `Insufficient scope. Required: ${requiredScopes.join(' or ')}`,
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
next();
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Optional authentication - sets user if token present but doesn't require it
|
|
76
|
+
*/
|
|
77
|
+
export async function optionalAuth(req, _res, next) {
|
|
78
|
+
try {
|
|
79
|
+
const authHeader = req.headers.authorization;
|
|
80
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
81
|
+
// No token, continue without user context
|
|
82
|
+
next();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const token = authHeader.substring(7);
|
|
86
|
+
const tokenPayload = await oauthServer.validateAccessToken(token);
|
|
87
|
+
if (tokenPayload) {
|
|
88
|
+
req.user = {
|
|
89
|
+
userId: tokenPayload.sub,
|
|
90
|
+
clientId: tokenPayload.client_id,
|
|
91
|
+
scope: tokenPayload.scope,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
next();
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
// Log error but continue without auth
|
|
98
|
+
logger.debug('Optional auth error (continuing):', error);
|
|
99
|
+
next();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Rate limiting per user/client
|
|
104
|
+
*/
|
|
105
|
+
const rateLimitMap = new Map();
|
|
106
|
+
export function rateLimit(maxRequests = 100, windowMs = 60000 // 1 minute
|
|
107
|
+
) {
|
|
108
|
+
return (req, res, next) => {
|
|
109
|
+
const key = req.user
|
|
110
|
+
? `user:${req.user.userId}`
|
|
111
|
+
: `ip:${req.ip}`;
|
|
112
|
+
const now = Date.now();
|
|
113
|
+
const limit = rateLimitMap.get(key);
|
|
114
|
+
if (!limit || now > limit.resetAt) {
|
|
115
|
+
// New window
|
|
116
|
+
rateLimitMap.set(key, {
|
|
117
|
+
count: 1,
|
|
118
|
+
resetAt: now + windowMs,
|
|
119
|
+
});
|
|
120
|
+
next();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (limit.count >= maxRequests) {
|
|
124
|
+
res.status(429).json({
|
|
125
|
+
error: 'rate_limit_exceeded',
|
|
126
|
+
message: 'Too many requests',
|
|
127
|
+
retryAfter: Math.ceil((limit.resetAt - now) / 1000),
|
|
128
|
+
});
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
limit.count++;
|
|
132
|
+
next();
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* CORS middleware for OAuth endpoints
|
|
137
|
+
*/
|
|
138
|
+
export function oauthCors(req, res, next) {
|
|
139
|
+
const allowedOrigins = [
|
|
140
|
+
'https://chat.openai.com',
|
|
141
|
+
'http://localhost:3000',
|
|
142
|
+
'http://localhost:3001',
|
|
143
|
+
];
|
|
144
|
+
const origin = req.headers.origin;
|
|
145
|
+
if (origin && allowedOrigins.includes(origin)) {
|
|
146
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
147
|
+
}
|
|
148
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
149
|
+
res.setHeader('Access-Control-Allow-Headers', 'Authorization, Content-Type');
|
|
150
|
+
res.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
151
|
+
if (req.method === 'OPTIONS') {
|
|
152
|
+
res.status(204).end();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
next();
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication request context
|
|
3
|
+
*/
|
|
4
|
+
export interface AuthRequest {
|
|
5
|
+
userId?: string;
|
|
6
|
+
clientId: string;
|
|
7
|
+
ip: string;
|
|
8
|
+
userAgent?: string;
|
|
9
|
+
fingerprint?: string;
|
|
10
|
+
timestamp: Date;
|
|
11
|
+
method: 'login' | 'refresh' | 'logout' | 'register';
|
|
12
|
+
success: boolean;
|
|
13
|
+
metadata?: {
|
|
14
|
+
country?: string;
|
|
15
|
+
city?: string;
|
|
16
|
+
asn?: string;
|
|
17
|
+
isp?: string;
|
|
18
|
+
deviceType?: string;
|
|
19
|
+
browser?: string;
|
|
20
|
+
os?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Anomaly score and action
|
|
25
|
+
*/
|
|
26
|
+
export interface AnomalyScore {
|
|
27
|
+
composite: number;
|
|
28
|
+
details: {
|
|
29
|
+
ip: number;
|
|
30
|
+
geo: number;
|
|
31
|
+
device: number;
|
|
32
|
+
time: number;
|
|
33
|
+
velocity: number;
|
|
34
|
+
pattern: number;
|
|
35
|
+
};
|
|
36
|
+
action: 'allow' | 'challenge' | 'deny';
|
|
37
|
+
reasons: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Risk factors configuration
|
|
41
|
+
*/
|
|
42
|
+
export interface RiskFactors {
|
|
43
|
+
vpnWeight: number;
|
|
44
|
+
torWeight: number;
|
|
45
|
+
proxyWeight: number;
|
|
46
|
+
newDeviceWeight: number;
|
|
47
|
+
newLocationWeight: number;
|
|
48
|
+
impossibleTravelWeight: number;
|
|
49
|
+
bruteForceWeight: number;
|
|
50
|
+
timeAnomalyWeight: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Anomaly Detection System
|
|
54
|
+
* Detects suspicious authentication patterns and potential attacks
|
|
55
|
+
*/
|
|
56
|
+
export declare class AnomalyDetector {
|
|
57
|
+
private userProfiles;
|
|
58
|
+
private ipReputation;
|
|
59
|
+
private readonly MAX_FAILED_ATTEMPTS;
|
|
60
|
+
private readonly IMPOSSIBLE_TRAVEL_SPEED;
|
|
61
|
+
private readonly TIME_WINDOW;
|
|
62
|
+
private readonly riskFactors;
|
|
63
|
+
/**
|
|
64
|
+
* Analyze authentication request for anomalies
|
|
65
|
+
*/
|
|
66
|
+
detectAnomalies(request: AuthRequest): Promise<AnomalyScore>;
|
|
67
|
+
/**
|
|
68
|
+
* Check IP reputation
|
|
69
|
+
*/
|
|
70
|
+
private checkIPReputation;
|
|
71
|
+
/**
|
|
72
|
+
* Check geolocation anomaly
|
|
73
|
+
*/
|
|
74
|
+
private checkGeoAnomaly;
|
|
75
|
+
/**
|
|
76
|
+
* Check device anomaly
|
|
77
|
+
*/
|
|
78
|
+
private checkDeviceAnomaly;
|
|
79
|
+
/**
|
|
80
|
+
* Check time-based anomaly
|
|
81
|
+
*/
|
|
82
|
+
private checkTimeAnomaly;
|
|
83
|
+
/**
|
|
84
|
+
* Check request velocity
|
|
85
|
+
*/
|
|
86
|
+
private checkVelocity;
|
|
87
|
+
/**
|
|
88
|
+
* Check behavioral patterns
|
|
89
|
+
*/
|
|
90
|
+
private checkBehavioralPattern;
|
|
91
|
+
/**
|
|
92
|
+
* Determine action based on score and context
|
|
93
|
+
*/
|
|
94
|
+
private determineAction;
|
|
95
|
+
/**
|
|
96
|
+
* Query threat intelligence feeds
|
|
97
|
+
*/
|
|
98
|
+
private queryThreatIntelligence;
|
|
99
|
+
/**
|
|
100
|
+
* Check if IP is in private range
|
|
101
|
+
*/
|
|
102
|
+
private isPrivateIP;
|
|
103
|
+
/**
|
|
104
|
+
* Calculate distance between two coordinates (Haversine formula)
|
|
105
|
+
*/
|
|
106
|
+
private calculateDistance;
|
|
107
|
+
private toRad;
|
|
108
|
+
/**
|
|
109
|
+
* Calculate request entropy (randomness)
|
|
110
|
+
*/
|
|
111
|
+
private calculateRequestEntropy;
|
|
112
|
+
/**
|
|
113
|
+
* Get or create user profile
|
|
114
|
+
*/
|
|
115
|
+
private getUserProfile;
|
|
116
|
+
/**
|
|
117
|
+
* Update user profile with successful authentication
|
|
118
|
+
*/
|
|
119
|
+
private updateUserProfile;
|
|
120
|
+
/**
|
|
121
|
+
* Count recent requests from IP
|
|
122
|
+
*/
|
|
123
|
+
private countRecentRequests;
|
|
124
|
+
/**
|
|
125
|
+
* Log anomaly to database
|
|
126
|
+
*/
|
|
127
|
+
private logAnomaly;
|
|
128
|
+
/**
|
|
129
|
+
* Get risk score for a user
|
|
130
|
+
*/
|
|
131
|
+
getUserRiskScore(userId: string): Promise<number>;
|
|
132
|
+
/**
|
|
133
|
+
* Reset user profile (after password reset, etc.)
|
|
134
|
+
*/
|
|
135
|
+
resetUserProfile(userId: string): void;
|
|
136
|
+
/**
|
|
137
|
+
* Get statistics
|
|
138
|
+
*/
|
|
139
|
+
getStats(): {
|
|
140
|
+
totalProfiles: number;
|
|
141
|
+
totalIPs: number;
|
|
142
|
+
highRiskUsers: number;
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export declare const anomalyDetector: AnomalyDetector;
|
|
146
|
+
//# sourceMappingURL=anomalyDetection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomalyDetection.d.ts","sourceRoot":"","sources":["../../../src/server/oauth/anomalyDetection.ts"],"names":[],"mappings":"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"}
|