profile-manager-secure 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/cli.d.ts +2 -0
  2. package/dist/cli.js +107 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/frontend/assets/index-D0IIAYWB.css +1 -0
  5. package/dist/frontend/assets/index-D9Y0_s3b.js +273 -0
  6. package/dist/frontend/index.html +26 -0
  7. package/dist/middleware/auth.middleware.d.ts +8 -0
  8. package/dist/middleware/auth.middleware.js +51 -0
  9. package/dist/middleware/auth.middleware.js.map +1 -0
  10. package/dist/middleware/error.middleware.d.ts +2 -0
  11. package/dist/middleware/error.middleware.js +11 -0
  12. package/dist/middleware/error.middleware.js.map +1 -0
  13. package/dist/modules/auth/auth.controller.d.ts +1 -0
  14. package/dist/modules/auth/auth.controller.js +175 -0
  15. package/dist/modules/auth/auth.controller.js.map +1 -0
  16. package/dist/modules/credential/credential.controller.d.ts +1 -0
  17. package/dist/modules/credential/credential.controller.js +263 -0
  18. package/dist/modules/credential/credential.controller.js.map +1 -0
  19. package/dist/modules/proxy/proxy.controller.d.ts +1 -0
  20. package/dist/modules/proxy/proxy.controller.js +270 -0
  21. package/dist/modules/proxy/proxy.controller.js.map +1 -0
  22. package/dist/modules/proxy/proxy.service.d.ts +28 -0
  23. package/dist/modules/proxy/proxy.service.js +185 -0
  24. package/dist/modules/proxy/proxy.service.js.map +1 -0
  25. package/dist/modules/tailscale/tailscale.controller.d.ts +1 -0
  26. package/dist/modules/tailscale/tailscale.controller.js +149 -0
  27. package/dist/modules/tailscale/tailscale.controller.js.map +1 -0
  28. package/dist/modules/tailscale/tailscale.service.d.ts +96 -0
  29. package/dist/modules/tailscale/tailscale.service.js +561 -0
  30. package/dist/modules/tailscale/tailscale.service.js.map +1 -0
  31. package/dist/modules/totp/totp.controller.d.ts +1 -0
  32. package/dist/modules/totp/totp.controller.js +41 -0
  33. package/dist/modules/totp/totp.controller.js.map +1 -0
  34. package/dist/modules/totp/totp.service.d.ts +26 -0
  35. package/dist/modules/totp/totp.service.js +96 -0
  36. package/dist/modules/totp/totp.service.js.map +1 -0
  37. package/dist/modules/totp/totp.service.test.d.ts +1 -0
  38. package/dist/modules/totp/totp.service.test.js +41 -0
  39. package/dist/modules/totp/totp.service.test.js.map +1 -0
  40. package/dist/modules/vault/apikey.service.d.ts +27 -0
  41. package/dist/modules/vault/apikey.service.js +87 -0
  42. package/dist/modules/vault/apikey.service.js.map +1 -0
  43. package/dist/modules/vault/constants.d.ts +2 -0
  44. package/dist/modules/vault/constants.js +24 -0
  45. package/dist/modules/vault/constants.js.map +1 -0
  46. package/dist/modules/vault/types.d.ts +73 -0
  47. package/dist/modules/vault/types.js +2 -0
  48. package/dist/modules/vault/types.js.map +1 -0
  49. package/dist/modules/vault/vault-migration.service.d.ts +21 -0
  50. package/dist/modules/vault/vault-migration.service.js +99 -0
  51. package/dist/modules/vault/vault-migration.service.js.map +1 -0
  52. package/dist/modules/vault/vault-storage.service.d.ts +22 -0
  53. package/dist/modules/vault/vault-storage.service.js +76 -0
  54. package/dist/modules/vault/vault-storage.service.js.map +1 -0
  55. package/dist/modules/vault/vault.service.d.ts +66 -0
  56. package/dist/modules/vault/vault.service.js +229 -0
  57. package/dist/modules/vault/vault.service.js.map +1 -0
  58. package/dist/server.d.ts +1 -0
  59. package/dist/server.js +67 -0
  60. package/dist/server.js.map +1 -0
  61. package/dist/utils/crypto.d.ts +20 -0
  62. package/dist/utils/crypto.js +54 -0
  63. package/dist/utils/crypto.js.map +1 -0
  64. package/dist/utils/crypto.test.d.ts +1 -0
  65. package/dist/utils/crypto.test.js +66 -0
  66. package/dist/utils/crypto.test.js.map +1 -0
  67. package/dist/utils/logger.d.ts +5 -0
  68. package/dist/utils/logger.js +12 -0
  69. package/dist/utils/logger.js.map +1 -0
  70. package/package.json +38 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html lang="vi">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🔒</text></svg>" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Account Manager - Quản lý Tài khoản Bảo mật</title>
8
+ <meta name="description" content="Trình quản lý tài khoản và mật khẩu bảo mật cục bộ cao cấp. Mã hóa hoàn toàn offline bằng AES-256-GCM." />
9
+ <!-- Open Graph / Facebook -->
10
+ <meta property="og:type" content="website" />
11
+ <meta property="og:title" content="Account Manager - Quản lý Tài khoản Bảo mật" />
12
+ <meta property="og:description" content="Trình quản lý tài khoản và mật khẩu bảo mật cục bộ cao cấp, mã hóa offline với AES-256-GCM." />
13
+ <!-- Twitter -->
14
+ <meta property="twitter:card" content="summary_large_image" />
15
+ <meta property="twitter:title" content="Account Manager - Quản lý Tài khoản Bảo mật" />
16
+ <meta property="twitter:description" content="Trình quản lý tài khoản và mật khẩu bảo mật cục bộ cao cấp, mã hóa offline với AES-256-GCM." />
17
+ <link rel="preconnect" href="https://fonts.googleapis.com">
18
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
19
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
20
+ <script type="module" crossorigin src="/assets/index-D9Y0_s3b.js"></script>
21
+ <link rel="stylesheet" crossorigin href="/assets/index-D0IIAYWB.css">
22
+ </head>
23
+ <body>
24
+ <div id="root"></div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,8 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function getJwtSecret(): string;
3
+ export interface AuthenticatedRequest extends Request {
4
+ user?: {
5
+ authenticated: boolean;
6
+ };
7
+ }
8
+ export declare function authMiddleware(req: AuthenticatedRequest, res: Response, next: NextFunction): void | Response<any, Record<string, any>>;
@@ -0,0 +1,51 @@
1
+ import jwt from 'jsonwebtoken';
2
+ import { vaultService } from '../modules/vault/vault.service.js';
3
+ let jwtSecret = '';
4
+ export function getJwtSecret() {
5
+ if (!jwtSecret) {
6
+ // Generate a temporary JWT secret for this session
7
+ import('crypto').then((crypto) => {
8
+ jwtSecret = crypto.randomBytes(32).toString('hex');
9
+ });
10
+ }
11
+ return jwtSecret;
12
+ }
13
+ // Generate the secret immediately
14
+ import crypto from 'crypto';
15
+ jwtSecret = crypto.randomBytes(32).toString('hex');
16
+ export function authMiddleware(req, res, next) {
17
+ // 1. Check if the vault is unlocked globally
18
+ if (!vaultService.unlocked()) {
19
+ return res.status(401).json({ error: 'Vault is locked. Please unlock first.' });
20
+ }
21
+ // Allow password check/unlock endpoints to bypass token check if they are the ones doing the unlocking
22
+ if (req.path === '/api/auth/unlock' || req.path === '/api/auth/initialize' || req.path === '/api/auth/status') {
23
+ return next();
24
+ }
25
+ // 2. Validate session token or API key for other API routes
26
+ const authHeader = req.headers.authorization;
27
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
28
+ return res.status(401).json({ error: 'No authorization token provided' });
29
+ }
30
+ const token = authHeader.split(' ')[1];
31
+ // Check if it is a Profile Manager API key
32
+ if (token.startsWith('pmkey_')) {
33
+ const isValid = vaultService.validateApiKey(token);
34
+ if (isValid) {
35
+ req.user = { authenticated: true };
36
+ return next();
37
+ }
38
+ else {
39
+ return res.status(401).json({ error: 'Invalid or disabled API Key' });
40
+ }
41
+ }
42
+ try {
43
+ const decoded = jwt.verify(token, jwtSecret);
44
+ req.user = { authenticated: true };
45
+ next();
46
+ }
47
+ catch (error) {
48
+ return res.status(401).json({ error: 'Session expired or invalid token' });
49
+ }
50
+ }
51
+ //# sourceMappingURL=auth.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.middleware.js","sourceRoot":"","sources":["../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,IAAI,SAAS,GAAG,EAAE,CAAC;AAEnB,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,mDAAmD;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/B,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kCAAkC;AAClC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAQnD,MAAM,UAAU,cAAc,CAAC,GAAyB,EAAE,GAAa,EAAE,IAAkB;IACzF,6CAA6C;IAC7C,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,uGAAuG;IACvG,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAC9G,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,4DAA4D;IAC5D,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvC,2CAA2C;IAC3C,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7C,GAAG,CAAC,IAAI,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function errorMiddleware(err: any, req: Request, res: Response, next: NextFunction): void;
@@ -0,0 +1,11 @@
1
+ import { logger } from '../utils/logger.js';
2
+ export function errorMiddleware(err, req, res, next) {
3
+ logger.error('Unhandled request error:', err);
4
+ const status = err.status || 500;
5
+ const message = err.message || 'Internal Server Error';
6
+ res.status(status).json({
7
+ error: message,
8
+ timestamp: new Date().toISOString()
9
+ });
10
+ }
11
+ //# sourceMappingURL=error.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.middleware.js","sourceRoot":"","sources":["../../src/middleware/error.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,GAAQ,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB;IACvF,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,uBAAuB,CAAC;IAEvD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QACtB,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const authRouter: import("express-serve-static-core").Router;
@@ -0,0 +1,175 @@
1
+ import { Router } from 'express';
2
+ import jwt from 'jsonwebtoken';
3
+ import { vaultService } from '../vault/vault.service.js';
4
+ import { getJwtSecret } from '../../middleware/auth.middleware.js';
5
+ import { logger } from '../../utils/logger.js';
6
+ import { authMiddleware } from '../../middleware/auth.middleware.js';
7
+ const router = Router();
8
+ // 1. Get auth status
9
+ router.get('/status', async (req, res) => {
10
+ try {
11
+ const exists = await vaultService.exists();
12
+ const unlocked = vaultService.unlocked();
13
+ res.json({
14
+ initialized: exists,
15
+ unlocked: unlocked
16
+ });
17
+ }
18
+ catch (error) {
19
+ res.status(500).json({ error: error.message });
20
+ }
21
+ });
22
+ // 2. Initialize vault
23
+ router.post('/initialize', async (req, res) => {
24
+ try {
25
+ const { password, hint } = req.body;
26
+ if (!password || typeof password !== 'string' || password.length < 8) {
27
+ return res.status(400).json({ error: 'Master Password must be at least 8 characters long' });
28
+ }
29
+ if (await vaultService.exists()) {
30
+ return res.status(400).json({ error: 'Vault is already initialized' });
31
+ }
32
+ await vaultService.initialize(password, hint);
33
+ // Generate session token
34
+ const token = jwt.sign({ session: true }, getJwtSecret(), { expiresIn: '12h' });
35
+ res.json({
36
+ success: true,
37
+ token,
38
+ message: 'Vault initialized and unlocked successfully'
39
+ });
40
+ }
41
+ catch (error) {
42
+ logger.error('Initialization error:', error);
43
+ res.status(500).json({ error: error.message });
44
+ }
45
+ });
46
+ // 3. Unlock vault
47
+ router.post('/unlock', async (req, res) => {
48
+ try {
49
+ const { password } = req.body;
50
+ if (!password) {
51
+ return res.status(400).json({ error: 'Master password is required' });
52
+ }
53
+ const success = await vaultService.unlock(password);
54
+ if (!success) {
55
+ return res.status(401).json({ error: 'Incorrect master password' });
56
+ }
57
+ // Generate session token
58
+ const token = jwt.sign({ session: true }, getJwtSecret(), { expiresIn: '12h' });
59
+ res.json({
60
+ success: true,
61
+ token,
62
+ message: 'Vault unlocked successfully'
63
+ });
64
+ }
65
+ catch (error) {
66
+ res.status(500).json({ error: error.message });
67
+ }
68
+ });
69
+ // 4. Lock vault
70
+ router.post('/lock', (req, res) => {
71
+ vaultService.lock();
72
+ res.json({ success: true, message: 'Vault locked successfully' });
73
+ });
74
+ // 5. Get hint
75
+ router.get('/hint', async (req, res) => {
76
+ try {
77
+ const hint = await vaultService.getHint();
78
+ res.json({ hint });
79
+ }
80
+ catch (error) {
81
+ res.status(500).json({ error: error.message });
82
+ }
83
+ });
84
+ // 6. Change master password
85
+ router.post('/change-password', authMiddleware, async (req, res) => {
86
+ try {
87
+ const { currentPassword, newPassword, hint } = req.body;
88
+ if (!currentPassword || !newPassword || typeof newPassword !== 'string' || newPassword.length < 8) {
89
+ return res.status(400).json({ error: 'Mật khẩu mới phải từ 8 ký tự trở lên' });
90
+ }
91
+ const success = await vaultService.changePassword(currentPassword, newPassword, hint);
92
+ if (!success) {
93
+ return res.status(400).json({ error: 'Mật khẩu hiện tại không chính xác' });
94
+ }
95
+ // Generate new session token
96
+ const token = jwt.sign({ session: true }, getJwtSecret(), { expiresIn: '12h' });
97
+ res.json({
98
+ success: true,
99
+ token,
100
+ message: 'Đổi mật khẩu Master thành công'
101
+ });
102
+ }
103
+ catch (error) {
104
+ res.status(500).json({ error: error.message });
105
+ }
106
+ });
107
+ // 7. Get vault info (path and statistics)
108
+ router.get('/vault-info', authMiddleware, (req, res) => {
109
+ try {
110
+ const info = vaultService.getVaultInfo();
111
+ res.json(info);
112
+ }
113
+ catch (error) {
114
+ res.status(500).json({ error: error.message });
115
+ }
116
+ });
117
+ // 8. Get API Keys
118
+ router.get('/api-keys', authMiddleware, (req, res) => {
119
+ try {
120
+ const keys = vaultService.getApiKeys();
121
+ const maskedKeys = keys.map(k => ({
122
+ id: k.id,
123
+ name: k.name,
124
+ keyPrefix: k.keyPrefix,
125
+ createdAt: k.createdAt,
126
+ enabled: k.enabled
127
+ }));
128
+ res.json(maskedKeys);
129
+ }
130
+ catch (error) {
131
+ res.status(500).json({ error: error.message });
132
+ }
133
+ });
134
+ // 9. Create API Key
135
+ router.post('/api-keys', authMiddleware, async (req, res) => {
136
+ try {
137
+ const { name } = req.body;
138
+ if (!name || typeof name !== 'string') {
139
+ return res.status(400).json({ error: 'Name is required' });
140
+ }
141
+ const rawKey = await vaultService.createApiKey(name);
142
+ res.json({ success: true, key: rawKey });
143
+ }
144
+ catch (error) {
145
+ res.status(500).json({ error: error.message });
146
+ }
147
+ });
148
+ // 10. Toggle API Key
149
+ router.post('/api-keys/:id/toggle', authMiddleware, async (req, res) => {
150
+ try {
151
+ const { id } = req.params;
152
+ const { enabled } = req.body;
153
+ if (enabled === undefined || typeof enabled !== 'boolean') {
154
+ return res.status(400).json({ error: 'Enabled state is required' });
155
+ }
156
+ await vaultService.toggleApiKey(id, enabled);
157
+ res.json({ success: true });
158
+ }
159
+ catch (error) {
160
+ res.status(500).json({ error: error.message });
161
+ }
162
+ });
163
+ // 11. Delete API Key
164
+ router.delete('/api-keys/:id', authMiddleware, async (req, res) => {
165
+ try {
166
+ const { id } = req.params;
167
+ await vaultService.deleteApiKey(id);
168
+ res.json({ success: true });
169
+ }
170
+ catch (error) {
171
+ res.status(500).json({ error: error.message });
172
+ }
173
+ });
174
+ export const authRouter = router;
175
+ //# sourceMappingURL=auth.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../../src/modules/auth/auth.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const credentialRouter: import("express-serve-static-core").Router;
@@ -0,0 +1,263 @@
1
+ import { Router } from 'express';
2
+ import crypto from 'crypto';
3
+ import { vaultService } from '../vault/vault.service.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ const router = Router();
6
+ // ==========================================
7
+ // CREDENTIALS CRUD API
8
+ // ==========================================
9
+ // 1. Get all credentials
10
+ router.get('/', (req, res) => {
11
+ try {
12
+ const data = vaultService.getData();
13
+ res.json(data.credentials);
14
+ }
15
+ catch (error) {
16
+ res.status(500).json({ error: error.message });
17
+ }
18
+ });
19
+ // 2. Create new credential
20
+ router.post('/', async (req, res) => {
21
+ try {
22
+ const { title, username, email, uid, password, url, totp_secret, custom_fields, notes, category_id, platform_id, is_favorite } = req.body;
23
+ if (!title) {
24
+ return res.status(400).json({ error: 'Title is required' });
25
+ }
26
+ const data = vaultService.getData();
27
+ const newCredential = {
28
+ id: crypto.randomUUID(),
29
+ uid: uid || '',
30
+ title: title || '',
31
+ username: username || '',
32
+ email: email || '',
33
+ password: password || '',
34
+ url: url || '',
35
+ totp_secret: totp_secret || '',
36
+ custom_fields: Array.isArray(custom_fields) ? custom_fields : [],
37
+ notes: notes || '',
38
+ category_id: category_id || '',
39
+ platform_id: platform_id || '',
40
+ is_favorite: !!is_favorite,
41
+ created_at: new Date().toISOString(),
42
+ updated_at: new Date().toISOString()
43
+ };
44
+ data.credentials.push(newCredential);
45
+ await vaultService.save();
46
+ logger.info(`Credential created: ${newCredential.id} (${newCredential.title})`);
47
+ res.status(201).json(newCredential);
48
+ }
49
+ catch (error) {
50
+ res.status(500).json({ error: error.message });
51
+ }
52
+ });
53
+ // 3. Update credential
54
+ router.put('/:id', async (req, res) => {
55
+ try {
56
+ const { id } = req.params;
57
+ const { title, username, email, uid, password, url, totp_secret, custom_fields, notes, category_id, platform_id, is_favorite } = req.body;
58
+ const data = vaultService.getData();
59
+ const index = data.credentials.findIndex(c => c.id === id);
60
+ if (index === -1) {
61
+ return res.status(404).json({ error: 'Credential not found' });
62
+ }
63
+ const current = data.credentials[index];
64
+ const updatedCredential = {
65
+ ...current,
66
+ title: title !== undefined ? title : current.title,
67
+ username: username !== undefined ? username : current.username,
68
+ email: email !== undefined ? email : current.email,
69
+ uid: uid !== undefined ? uid : current.uid,
70
+ password: password !== undefined ? password : current.password,
71
+ url: url !== undefined ? url : current.url,
72
+ totp_secret: totp_secret !== undefined ? totp_secret : current.totp_secret,
73
+ custom_fields: custom_fields !== undefined ? custom_fields : current.custom_fields,
74
+ notes: notes !== undefined ? notes : current.notes,
75
+ category_id: category_id !== undefined ? category_id : current.category_id,
76
+ platform_id: platform_id !== undefined ? platform_id : current.platform_id,
77
+ is_favorite: is_favorite !== undefined ? !!is_favorite : current.is_favorite,
78
+ updated_at: new Date().toISOString()
79
+ };
80
+ data.credentials[index] = updatedCredential;
81
+ await vaultService.save();
82
+ logger.info(`Credential updated: ${id} (${updatedCredential.title})`);
83
+ res.json(updatedCredential);
84
+ }
85
+ catch (error) {
86
+ res.status(500).json({ error: error.message });
87
+ }
88
+ });
89
+ // 4. Delete credential
90
+ router.delete('/:id', async (req, res) => {
91
+ try {
92
+ const { id } = req.params;
93
+ const data = vaultService.getData();
94
+ const index = data.credentials.findIndex(c => c.id === id);
95
+ if (index === -1) {
96
+ return res.status(404).json({ error: 'Credential not found' });
97
+ }
98
+ const title = data.credentials[index].title;
99
+ data.credentials.splice(index, 1);
100
+ await vaultService.save();
101
+ logger.info(`Credential deleted: ${id} (${title})`);
102
+ res.json({ success: true, message: 'Credential deleted successfully' });
103
+ }
104
+ catch (error) {
105
+ res.status(500).json({ error: error.message });
106
+ }
107
+ });
108
+ // ==========================================
109
+ // CATEGORIES API
110
+ // ==========================================
111
+ // 5. Get all categories
112
+ router.get('/categories', (req, res) => {
113
+ try {
114
+ const data = vaultService.getData();
115
+ res.json(data.categories);
116
+ }
117
+ catch (error) {
118
+ res.status(500).json({ error: error.message });
119
+ }
120
+ });
121
+ // 6. Create category
122
+ router.post('/categories', async (req, res) => {
123
+ try {
124
+ const { name, icon } = req.body;
125
+ if (!name) {
126
+ return res.status(400).json({ error: 'Category name is required' });
127
+ }
128
+ const data = vaultService.getData();
129
+ const newCategory = {
130
+ id: crypto.randomUUID(),
131
+ name,
132
+ icon: icon || 'Folder'
133
+ };
134
+ data.categories.push(newCategory);
135
+ await vaultService.save();
136
+ logger.info(`Category created: ${newCategory.name}`);
137
+ res.status(201).json(newCategory);
138
+ }
139
+ catch (error) {
140
+ res.status(500).json({ error: error.message });
141
+ }
142
+ });
143
+ // 7. Delete category
144
+ router.delete('/categories/:id', async (req, res) => {
145
+ try {
146
+ const { id } = req.params;
147
+ const data = vaultService.getData();
148
+ const index = data.categories.findIndex(c => c.id === id);
149
+ if (index === -1) {
150
+ return res.status(404).json({ error: 'Category not found' });
151
+ }
152
+ const name = data.categories[index].name;
153
+ data.categories.splice(index, 1);
154
+ // Reset credentials using this category to empty category
155
+ data.credentials.forEach(c => {
156
+ if (c.category_id === id) {
157
+ c.category_id = '';
158
+ }
159
+ });
160
+ await vaultService.save();
161
+ logger.info(`Category deleted: ${id} (${name})`);
162
+ res.json({ success: true, message: 'Category deleted successfully' });
163
+ }
164
+ catch (error) {
165
+ res.status(500).json({ error: error.message });
166
+ }
167
+ });
168
+ export const credentialRouter = router;
169
+ // ==========================================
170
+ // PLATFORMS API
171
+ // ==========================================
172
+ // 8. Get all platforms
173
+ router.get('/platforms', (req, res) => {
174
+ try {
175
+ const data = vaultService.getData();
176
+ res.json(data.platforms || []);
177
+ }
178
+ catch (error) {
179
+ res.status(500).json({ error: error.message });
180
+ }
181
+ });
182
+ // 9. Create custom platform
183
+ router.post('/platforms', async (req, res) => {
184
+ try {
185
+ const { name, icon } = req.body;
186
+ if (!name) {
187
+ return res.status(400).json({ error: 'Platform name is required' });
188
+ }
189
+ const data = vaultService.getData();
190
+ if (!data.platforms) {
191
+ data.platforms = [];
192
+ }
193
+ const newPlatform = {
194
+ id: crypto.randomUUID(),
195
+ name,
196
+ icon: icon || 'globe',
197
+ is_active: true,
198
+ is_custom: true
199
+ };
200
+ data.platforms.push(newPlatform);
201
+ await vaultService.save();
202
+ logger.info(`Platform created: ${newPlatform.name}`);
203
+ res.status(201).json(newPlatform);
204
+ }
205
+ catch (error) {
206
+ res.status(500).json({ error: error.message });
207
+ }
208
+ });
209
+ // 10. Toggle platform status
210
+ router.put('/platforms/:id/toggle', async (req, res) => {
211
+ try {
212
+ const { id } = req.params;
213
+ const { is_active } = req.body;
214
+ const data = vaultService.getData();
215
+ if (!data.platforms) {
216
+ return res.status(404).json({ error: 'No platforms found' });
217
+ }
218
+ const index = data.platforms.findIndex(p => p.id === id);
219
+ if (index === -1) {
220
+ return res.status(404).json({ error: 'Platform not found' });
221
+ }
222
+ data.platforms[index].is_active = !!is_active;
223
+ await vaultService.save();
224
+ logger.info(`Platform toggled: ${id} (active: ${is_active})`);
225
+ res.json(data.platforms[index]);
226
+ }
227
+ catch (error) {
228
+ res.status(500).json({ error: error.message });
229
+ }
230
+ });
231
+ // 11. Delete custom platform
232
+ router.delete('/platforms/:id', async (req, res) => {
233
+ try {
234
+ const { id } = req.params;
235
+ const data = vaultService.getData();
236
+ if (!data.platforms) {
237
+ return res.status(404).json({ error: 'No platforms found' });
238
+ }
239
+ const index = data.platforms.findIndex(p => p.id === id);
240
+ if (index === -1) {
241
+ return res.status(404).json({ error: 'Platform not found' });
242
+ }
243
+ // Do not allow deleting non-custom/default platforms
244
+ if (!data.platforms[index].is_custom) {
245
+ return res.status(403).json({ error: 'Default platforms cannot be deleted' });
246
+ }
247
+ const name = data.platforms[index].name;
248
+ data.platforms.splice(index, 1);
249
+ // Reset credentials using this platform to empty platform_id
250
+ data.credentials.forEach(c => {
251
+ if (c.platform_id === id) {
252
+ c.platform_id = '';
253
+ }
254
+ });
255
+ await vaultService.save();
256
+ logger.info(`Platform deleted: ${id} (${name})`);
257
+ res.json({ success: true, message: 'Platform deleted successfully' });
258
+ }
259
+ catch (error) {
260
+ res.status(500).json({ error: error.message });
261
+ }
262
+ });
263
+ //# sourceMappingURL=credential.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential.controller.js","sourceRoot":"","sources":["../../../src/modules/credential/credential.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const proxyRouter: import("express-serve-static-core").Router;