@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.
@@ -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":"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"}
@@ -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"}