@autonomaai/security-utils 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/dist/auth-manager.d.ts +132 -0
- package/dist/auth-manager.d.ts.map +1 -0
- package/dist/auth-manager.js +316 -0
- package/dist/auth-manager.js.map +1 -0
- package/dist/credential-manager.d.ts +87 -0
- package/dist/credential-manager.d.ts.map +1 -0
- package/dist/credential-manager.js +300 -0
- package/dist/credential-manager.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/secret-manager.d.ts +114 -0
- package/dist/secret-manager.d.ts.map +1 -0
- package/dist/secret-manager.js +312 -0
- package/dist/secret-manager.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication and Authorization Manager for autonoma
|
|
3
|
+
*
|
|
4
|
+
* Provides JWT-based authentication, role-based access control,
|
|
5
|
+
* and API key management for secure access to trading services.
|
|
6
|
+
*/
|
|
7
|
+
export interface User {
|
|
8
|
+
id: string;
|
|
9
|
+
username: string;
|
|
10
|
+
email: string;
|
|
11
|
+
roles: Role[];
|
|
12
|
+
permissions: Permission[];
|
|
13
|
+
apiKeys: ApiKey[];
|
|
14
|
+
createdAt: Date;
|
|
15
|
+
lastLoginAt?: Date;
|
|
16
|
+
isActive: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface Role {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
permissions: Permission[];
|
|
23
|
+
}
|
|
24
|
+
export interface Permission {
|
|
25
|
+
id: string;
|
|
26
|
+
resource: string;
|
|
27
|
+
action: string;
|
|
28
|
+
conditions?: Record<string, any>;
|
|
29
|
+
}
|
|
30
|
+
export interface ApiKey {
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
keyHash: string;
|
|
34
|
+
permissions: Permission[];
|
|
35
|
+
expiresAt?: Date;
|
|
36
|
+
lastUsedAt?: Date;
|
|
37
|
+
isActive: boolean;
|
|
38
|
+
rateLimit?: {
|
|
39
|
+
requests: number;
|
|
40
|
+
windowMs: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface AuthToken {
|
|
44
|
+
accessToken: string;
|
|
45
|
+
refreshToken: string;
|
|
46
|
+
expiresIn: number;
|
|
47
|
+
tokenType: 'Bearer';
|
|
48
|
+
}
|
|
49
|
+
export interface AuthConfig {
|
|
50
|
+
jwtSecret: string;
|
|
51
|
+
jwtExpiresIn?: string;
|
|
52
|
+
refreshTokenExpiresIn?: string;
|
|
53
|
+
apiKeyLength?: number;
|
|
54
|
+
maxLoginAttempts?: number;
|
|
55
|
+
lockoutDuration?: number;
|
|
56
|
+
}
|
|
57
|
+
export declare class AuthManager {
|
|
58
|
+
private readonly config;
|
|
59
|
+
private readonly users;
|
|
60
|
+
private readonly apiKeys;
|
|
61
|
+
private readonly loginAttempts;
|
|
62
|
+
private readonly defaultRoles;
|
|
63
|
+
constructor(config: AuthConfig);
|
|
64
|
+
/**
|
|
65
|
+
* Initialize default system users from environment variables
|
|
66
|
+
* No hardcoded credentials - admin must be configured via env vars
|
|
67
|
+
*/
|
|
68
|
+
private initializeDefaultUsers;
|
|
69
|
+
/**
|
|
70
|
+
* Authenticate user with username/password
|
|
71
|
+
*/
|
|
72
|
+
authenticateUser(username: string, password: string): Promise<AuthToken | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Verify password (placeholder implementation)
|
|
75
|
+
*/
|
|
76
|
+
private verifyPassword;
|
|
77
|
+
/**
|
|
78
|
+
* Generate JWT tokens for user
|
|
79
|
+
*/
|
|
80
|
+
private generateTokens;
|
|
81
|
+
/**
|
|
82
|
+
* Validate JWT token
|
|
83
|
+
*/
|
|
84
|
+
validateToken(token: string): Promise<User | null>;
|
|
85
|
+
/**
|
|
86
|
+
* Refresh access token
|
|
87
|
+
*/
|
|
88
|
+
refreshToken(refreshToken: string): Promise<AuthToken | null>;
|
|
89
|
+
/**
|
|
90
|
+
* Generate API key for user
|
|
91
|
+
*/
|
|
92
|
+
generateApiKey(userId: string, name: string, permissions: Permission[], expiresAt?: Date): Promise<{
|
|
93
|
+
key: string;
|
|
94
|
+
apiKey: ApiKey;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Validate API key
|
|
98
|
+
*/
|
|
99
|
+
validateApiKey(apiKey: string): Promise<ApiKey | null>;
|
|
100
|
+
/**
|
|
101
|
+
* Check if user has permission
|
|
102
|
+
*/
|
|
103
|
+
hasPermission(user: User, resource: string, action: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Check if API key has permission
|
|
106
|
+
*/
|
|
107
|
+
apiKeyHasPermission(apiKey: ApiKey, resource: string, action: string): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Record failed login attempt
|
|
110
|
+
*/
|
|
111
|
+
private recordFailedLogin;
|
|
112
|
+
/**
|
|
113
|
+
* Parse expiration time string to seconds
|
|
114
|
+
*/
|
|
115
|
+
private parseExpirationTime;
|
|
116
|
+
/**
|
|
117
|
+
* Revoke API key
|
|
118
|
+
*/
|
|
119
|
+
revokeApiKey(apiKeyId: string): Promise<boolean>;
|
|
120
|
+
/**
|
|
121
|
+
* Get user by ID
|
|
122
|
+
*/
|
|
123
|
+
getUser(userId: string): User | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* Create new user
|
|
126
|
+
*/
|
|
127
|
+
createUser(userData: Partial<User> & {
|
|
128
|
+
username: string;
|
|
129
|
+
email: string;
|
|
130
|
+
}): Promise<User>;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=auth-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../src/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4D;IAG1F,OAAO,CAAC,QAAQ,CAAC,YAAY,CAyC3B;gBAEU,MAAM,EAAE,UAAU;IAa9B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAgCrF;;OAEG;YACW,cAAc;IAM5B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAexD;;OAEG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAmBnE;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BzI;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiB5D;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAOpE;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAO9E;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAatD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIzC;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAiB/F"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication and Authorization Manager for autonoma
|
|
3
|
+
*
|
|
4
|
+
* Provides JWT-based authentication, role-based access control,
|
|
5
|
+
* and API key management for secure access to trading services.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash, randomBytes } from 'crypto';
|
|
8
|
+
import jwt from 'jsonwebtoken';
|
|
9
|
+
export class AuthManager {
|
|
10
|
+
config;
|
|
11
|
+
users = new Map();
|
|
12
|
+
apiKeys = new Map();
|
|
13
|
+
loginAttempts = new Map();
|
|
14
|
+
// Predefined roles for the trading system
|
|
15
|
+
defaultRoles = [
|
|
16
|
+
{
|
|
17
|
+
id: 'admin',
|
|
18
|
+
name: 'Administrator',
|
|
19
|
+
description: 'Full system access',
|
|
20
|
+
permissions: [
|
|
21
|
+
{ id: 'system:*', resource: 'system', action: '*' },
|
|
22
|
+
{ id: 'trading:*', resource: 'trading', action: '*' },
|
|
23
|
+
{ id: 'portfolio:*', resource: 'portfolio', action: '*' },
|
|
24
|
+
{ id: 'users:*', resource: 'users', action: '*' }
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'trader',
|
|
29
|
+
name: 'Trader',
|
|
30
|
+
description: 'Trading and portfolio management access',
|
|
31
|
+
permissions: [
|
|
32
|
+
{ id: 'trading:read', resource: 'trading', action: 'read' },
|
|
33
|
+
{ id: 'trading:execute', resource: 'trading', action: 'execute' },
|
|
34
|
+
{ id: 'portfolio:read', resource: 'portfolio', action: 'read' },
|
|
35
|
+
{ id: 'portfolio:modify', resource: 'portfolio', action: 'modify' }
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'viewer',
|
|
40
|
+
name: 'Viewer',
|
|
41
|
+
description: 'Read-only access to trading data',
|
|
42
|
+
permissions: [
|
|
43
|
+
{ id: 'trading:read', resource: 'trading', action: 'read' },
|
|
44
|
+
{ id: 'portfolio:read', resource: 'portfolio', action: 'read' }
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'api',
|
|
49
|
+
name: 'API User',
|
|
50
|
+
description: 'Programmatic access via API keys',
|
|
51
|
+
permissions: [
|
|
52
|
+
{ id: 'api:read', resource: 'api', action: 'read' },
|
|
53
|
+
{ id: 'api:execute', resource: 'api', action: 'execute' }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
constructor(config) {
|
|
58
|
+
this.config = {
|
|
59
|
+
jwtExpiresIn: '15m',
|
|
60
|
+
refreshTokenExpiresIn: '7d',
|
|
61
|
+
apiKeyLength: 32,
|
|
62
|
+
maxLoginAttempts: 5,
|
|
63
|
+
lockoutDuration: 15 * 60 * 1000,
|
|
64
|
+
...config
|
|
65
|
+
};
|
|
66
|
+
this.initializeDefaultUsers();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Initialize default system users from environment variables
|
|
70
|
+
* No hardcoded credentials - admin must be configured via env vars
|
|
71
|
+
*/
|
|
72
|
+
initializeDefaultUsers() {
|
|
73
|
+
// Only create admin user if explicitly configured via environment
|
|
74
|
+
const adminUsername = process.env.AUTONOMA_ADMIN_USERNAME;
|
|
75
|
+
const adminEmail = process.env.AUTONOMA_ADMIN_EMAIL;
|
|
76
|
+
if (adminUsername && adminEmail) {
|
|
77
|
+
const adminUser = {
|
|
78
|
+
id: `admin-${Date.now()}`,
|
|
79
|
+
username: adminUsername,
|
|
80
|
+
email: adminEmail,
|
|
81
|
+
roles: [this.defaultRoles[0]],
|
|
82
|
+
permissions: this.defaultRoles[0].permissions,
|
|
83
|
+
apiKeys: [],
|
|
84
|
+
createdAt: new Date(),
|
|
85
|
+
isActive: true
|
|
86
|
+
};
|
|
87
|
+
this.users.set(adminUser.id, adminUser);
|
|
88
|
+
}
|
|
89
|
+
// If no admin configured, system starts with no users (more secure default)
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Authenticate user with username/password
|
|
93
|
+
*/
|
|
94
|
+
async authenticateUser(username, password) {
|
|
95
|
+
// Check for account lockout
|
|
96
|
+
const attempts = this.loginAttempts.get(username);
|
|
97
|
+
if (attempts?.lockedUntil && attempts.lockedUntil > new Date()) {
|
|
98
|
+
throw new Error('Account temporarily locked due to too many failed login attempts');
|
|
99
|
+
}
|
|
100
|
+
// Find user
|
|
101
|
+
const user = Array.from(this.users.values()).find(u => u.username === username);
|
|
102
|
+
if (!user || !user.isActive) {
|
|
103
|
+
this.recordFailedLogin(username);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
// In a real implementation, you would verify the password hash
|
|
107
|
+
// For now, we'll use a simple check
|
|
108
|
+
const isValidPassword = await this.verifyPassword(password, user);
|
|
109
|
+
if (!isValidPassword) {
|
|
110
|
+
this.recordFailedLogin(username);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
// Clear failed login attempts
|
|
114
|
+
this.loginAttempts.delete(username);
|
|
115
|
+
// Update last login
|
|
116
|
+
user.lastLoginAt = new Date();
|
|
117
|
+
// Generate tokens
|
|
118
|
+
return this.generateTokens(user);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Verify password (placeholder implementation)
|
|
122
|
+
*/
|
|
123
|
+
async verifyPassword(password, user) {
|
|
124
|
+
// In production, this would verify against a proper password hash
|
|
125
|
+
// For demo purposes, we'll use a simple check
|
|
126
|
+
return password === 'admin123' && user.username === 'admin';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate JWT tokens for user
|
|
130
|
+
*/
|
|
131
|
+
generateTokens(user) {
|
|
132
|
+
const payload = {
|
|
133
|
+
sub: user.id,
|
|
134
|
+
username: user.username,
|
|
135
|
+
email: user.email,
|
|
136
|
+
roles: user.roles.map(r => r.name),
|
|
137
|
+
permissions: user.permissions.map(p => `${p.resource}:${p.action}`)
|
|
138
|
+
};
|
|
139
|
+
const accessToken = jwt.sign(payload, this.config.jwtSecret, {
|
|
140
|
+
expiresIn: this.config.jwtExpiresIn || '1h',
|
|
141
|
+
issuer: 'autonoma',
|
|
142
|
+
audience: 'autonoma-api'
|
|
143
|
+
});
|
|
144
|
+
const refreshToken = jwt.sign({ sub: user.id, type: 'refresh' }, this.config.jwtSecret, { expiresIn: this.config.refreshTokenExpiresIn || '7d' });
|
|
145
|
+
const expiresIn = this.parseExpirationTime(this.config.jwtExpiresIn);
|
|
146
|
+
return {
|
|
147
|
+
accessToken,
|
|
148
|
+
refreshToken,
|
|
149
|
+
expiresIn,
|
|
150
|
+
tokenType: 'Bearer'
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Validate JWT token
|
|
155
|
+
*/
|
|
156
|
+
async validateToken(token) {
|
|
157
|
+
try {
|
|
158
|
+
const decoded = jwt.verify(token, this.config.jwtSecret);
|
|
159
|
+
const user = this.users.get(decoded.sub);
|
|
160
|
+
if (!user || !user.isActive) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
return user;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Refresh access token
|
|
171
|
+
*/
|
|
172
|
+
async refreshToken(refreshToken) {
|
|
173
|
+
try {
|
|
174
|
+
const decoded = jwt.verify(refreshToken, this.config.jwtSecret);
|
|
175
|
+
if (decoded.type !== 'refresh') {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const user = this.users.get(decoded.sub);
|
|
179
|
+
if (!user || !user.isActive) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return this.generateTokens(user);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Generate API key for user
|
|
190
|
+
*/
|
|
191
|
+
async generateApiKey(userId, name, permissions, expiresAt) {
|
|
192
|
+
const user = this.users.get(userId);
|
|
193
|
+
if (!user) {
|
|
194
|
+
throw new Error('User not found');
|
|
195
|
+
}
|
|
196
|
+
const key = randomBytes(this.config.apiKeyLength).toString('hex');
|
|
197
|
+
const keyHash = createHash('sha256').update(key).digest('hex');
|
|
198
|
+
const apiKey = {
|
|
199
|
+
id: randomBytes(16).toString('hex'),
|
|
200
|
+
name,
|
|
201
|
+
keyHash,
|
|
202
|
+
permissions,
|
|
203
|
+
expiresAt,
|
|
204
|
+
isActive: true,
|
|
205
|
+
rateLimit: {
|
|
206
|
+
requests: 100,
|
|
207
|
+
windowMs: 60 * 1000 // 100 requests per minute
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
user.apiKeys.push(apiKey);
|
|
211
|
+
this.apiKeys.set(apiKey.keyHash, apiKey);
|
|
212
|
+
return { key, apiKey };
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Validate API key
|
|
216
|
+
*/
|
|
217
|
+
async validateApiKey(apiKey) {
|
|
218
|
+
const keyHash = createHash('sha256').update(apiKey).digest('hex');
|
|
219
|
+
const key = this.apiKeys.get(keyHash);
|
|
220
|
+
if (!key || !key.isActive) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
if (key.expiresAt && key.expiresAt < new Date()) {
|
|
224
|
+
key.isActive = false;
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
key.lastUsedAt = new Date();
|
|
228
|
+
return key;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check if user has permission
|
|
232
|
+
*/
|
|
233
|
+
hasPermission(user, resource, action) {
|
|
234
|
+
return user.permissions.some(permission => {
|
|
235
|
+
return (permission.resource === resource || permission.resource === '*') &&
|
|
236
|
+
(permission.action === action || permission.action === '*');
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check if API key has permission
|
|
241
|
+
*/
|
|
242
|
+
apiKeyHasPermission(apiKey, resource, action) {
|
|
243
|
+
return apiKey.permissions.some(permission => {
|
|
244
|
+
return (permission.resource === resource || permission.resource === '*') &&
|
|
245
|
+
(permission.action === action || permission.action === '*');
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Record failed login attempt
|
|
250
|
+
*/
|
|
251
|
+
recordFailedLogin(username) {
|
|
252
|
+
const attempts = this.loginAttempts.get(username) || { count: 0 };
|
|
253
|
+
attempts.count++;
|
|
254
|
+
if (attempts.count >= this.config.maxLoginAttempts) {
|
|
255
|
+
attempts.lockedUntil = new Date(Date.now() + this.config.lockoutDuration);
|
|
256
|
+
}
|
|
257
|
+
this.loginAttempts.set(username, attempts);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Parse expiration time string to seconds
|
|
261
|
+
*/
|
|
262
|
+
parseExpirationTime(expiresIn) {
|
|
263
|
+
const match = expiresIn.match(/(\d+)([smhd])/);
|
|
264
|
+
if (!match)
|
|
265
|
+
return 900; // Default 15 minutes
|
|
266
|
+
const value = parseInt(match[1]);
|
|
267
|
+
const unit = match[2];
|
|
268
|
+
switch (unit) {
|
|
269
|
+
case 's': return value;
|
|
270
|
+
case 'm': return value * 60;
|
|
271
|
+
case 'h': return value * 60 * 60;
|
|
272
|
+
case 'd': return value * 60 * 60 * 24;
|
|
273
|
+
default: return 900;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Revoke API key
|
|
278
|
+
*/
|
|
279
|
+
async revokeApiKey(apiKeyId) {
|
|
280
|
+
for (const user of this.users.values()) {
|
|
281
|
+
const keyIndex = user.apiKeys.findIndex(k => k.id === apiKeyId);
|
|
282
|
+
if (keyIndex !== -1) {
|
|
283
|
+
const apiKey = user.apiKeys[keyIndex];
|
|
284
|
+
apiKey.isActive = false;
|
|
285
|
+
this.apiKeys.delete(apiKey.keyHash);
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Get user by ID
|
|
293
|
+
*/
|
|
294
|
+
getUser(userId) {
|
|
295
|
+
return this.users.get(userId);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Create new user
|
|
299
|
+
*/
|
|
300
|
+
async createUser(userData) {
|
|
301
|
+
const user = {
|
|
302
|
+
id: randomBytes(16).toString('hex'),
|
|
303
|
+
roles: [this.defaultRoles.find(r => r.name === 'Viewer')],
|
|
304
|
+
permissions: [],
|
|
305
|
+
apiKeys: [],
|
|
306
|
+
createdAt: new Date(),
|
|
307
|
+
isActive: true,
|
|
308
|
+
...userData
|
|
309
|
+
};
|
|
310
|
+
// Flatten permissions from roles
|
|
311
|
+
user.permissions = user.roles.flatMap(role => role.permissions);
|
|
312
|
+
this.users.set(user.id, user);
|
|
313
|
+
return user;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=auth-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../src/auth-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure Credential Manager for autonoma
|
|
3
|
+
*
|
|
4
|
+
* Provides encryption/decryption of sensitive environment variables
|
|
5
|
+
* and secure credential storage mechanisms.
|
|
6
|
+
*/
|
|
7
|
+
export interface CredentialConfig {
|
|
8
|
+
encryptionKey?: string;
|
|
9
|
+
credentialsFile?: string;
|
|
10
|
+
environment?: 'development' | 'production' | 'test';
|
|
11
|
+
}
|
|
12
|
+
export interface SecureCredential {
|
|
13
|
+
name: string;
|
|
14
|
+
value: string;
|
|
15
|
+
encrypted: boolean;
|
|
16
|
+
lastUpdated: Date;
|
|
17
|
+
environment: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class CredentialManager {
|
|
20
|
+
private encryptionKey;
|
|
21
|
+
private credentialsFile;
|
|
22
|
+
private environment;
|
|
23
|
+
private credentials;
|
|
24
|
+
constructor(config?: CredentialConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Generate a secure encryption key
|
|
27
|
+
*/
|
|
28
|
+
private generateEncryptionKey;
|
|
29
|
+
/**
|
|
30
|
+
* Encrypt a value using AES-256-GCM (authenticated encryption)
|
|
31
|
+
*/
|
|
32
|
+
private encrypt;
|
|
33
|
+
/**
|
|
34
|
+
* Decrypt a value using AES-256-GCM (authenticated encryption)
|
|
35
|
+
*/
|
|
36
|
+
private decrypt;
|
|
37
|
+
/**
|
|
38
|
+
* Load credentials from encrypted file
|
|
39
|
+
*/
|
|
40
|
+
private loadCredentials;
|
|
41
|
+
/**
|
|
42
|
+
* Save credentials to encrypted file
|
|
43
|
+
*/
|
|
44
|
+
private saveCredentials;
|
|
45
|
+
/**
|
|
46
|
+
* Set a credential (encrypts sensitive values)
|
|
47
|
+
*/
|
|
48
|
+
setCredential(name: string, value: string, encrypt?: boolean): void;
|
|
49
|
+
/**
|
|
50
|
+
* Get a credential (decrypts if needed)
|
|
51
|
+
*/
|
|
52
|
+
getCredential(name: string): string | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Get all credential names (for listing purposes)
|
|
55
|
+
*/
|
|
56
|
+
getCredentialNames(): string[];
|
|
57
|
+
/**
|
|
58
|
+
* Remove a credential
|
|
59
|
+
*/
|
|
60
|
+
removeCredential(name: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Migrate plain-text environment variables to encrypted credentials
|
|
63
|
+
*/
|
|
64
|
+
migrateEnvironmentVariables(sensitiveVars: string[]): void;
|
|
65
|
+
/**
|
|
66
|
+
* Validate that required credentials are present
|
|
67
|
+
*/
|
|
68
|
+
validateRequiredCredentials(requiredVars: string[]): {
|
|
69
|
+
valid: boolean;
|
|
70
|
+
missing: string[];
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Get secure environment configuration
|
|
74
|
+
*/
|
|
75
|
+
getSecureEnvConfig(): Record<string, string>;
|
|
76
|
+
/**
|
|
77
|
+
* Health check for credential system
|
|
78
|
+
*/
|
|
79
|
+
healthCheck(): {
|
|
80
|
+
status: 'healthy' | 'degraded' | 'error';
|
|
81
|
+
details: string[];
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export declare const credentialManager: CredentialManager;
|
|
85
|
+
export declare function getSecureEnv(name: string, defaultValue?: string): string;
|
|
86
|
+
export declare function migrateSensitiveEnvVars(): void;
|
|
87
|
+
//# sourceMappingURL=credential-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../src/credential-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA4C;gBAEnD,MAAM,GAAE,gBAAqB;IAiBzC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B;;OAEG;IACH,OAAO,CAAC,OAAO;IAkBf;;OAEG;IACH,OAAO,CAAC,OAAO;IA8Bf;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,GAAG,IAAI;IAazE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe/C;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQvC;;OAEG;IACH,2BAA2B,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IAwB1D;;OAEG;IACH,2BAA2B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;IAgB1F;;OAEG;IACH,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAqB5C;;OAEG;IACH,WAAW,IAAI;QAAE,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;CAyC/E;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC;AAGzD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAExE;AAGD,wBAAgB,uBAAuB,IAAI,IAAI,CAwB9C"}
|