@pengzi/kms 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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -0
  3. package/dist/client.d.ts +130 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +266 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +20 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +54 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/asymmetric-crypto.d.ts +81 -0
  12. package/dist/core/asymmetric-crypto.d.ts.map +1 -0
  13. package/dist/core/asymmetric-crypto.js +171 -0
  14. package/dist/core/asymmetric-crypto.js.map +1 -0
  15. package/dist/core/crypto.d.ts +37 -0
  16. package/dist/core/crypto.d.ts.map +1 -0
  17. package/dist/core/crypto.js +100 -0
  18. package/dist/core/crypto.js.map +1 -0
  19. package/dist/core/crypto.service.d.ts +35 -0
  20. package/dist/core/crypto.service.d.ts.map +1 -0
  21. package/dist/core/crypto.service.js +67 -0
  22. package/dist/core/crypto.service.js.map +1 -0
  23. package/dist/core/key-derivation.d.ts +25 -0
  24. package/dist/core/key-derivation.d.ts.map +1 -0
  25. package/dist/core/key-derivation.js +96 -0
  26. package/dist/core/key-derivation.js.map +1 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +51 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/models/audit.model.d.ts +40 -0
  32. package/dist/models/audit.model.d.ts.map +1 -0
  33. package/dist/models/audit.model.js +83 -0
  34. package/dist/models/audit.model.js.map +1 -0
  35. package/dist/models/key.model.d.ts +40 -0
  36. package/dist/models/key.model.d.ts.map +1 -0
  37. package/dist/models/key.model.js +120 -0
  38. package/dist/models/key.model.js.map +1 -0
  39. package/dist/models/project.model.d.ts +20 -0
  40. package/dist/models/project.model.d.ts.map +1 -0
  41. package/dist/models/project.model.js +54 -0
  42. package/dist/models/project.model.js.map +1 -0
  43. package/dist/models/user.model.d.ts +48 -0
  44. package/dist/models/user.model.d.ts.map +1 -0
  45. package/dist/models/user.model.js +141 -0
  46. package/dist/models/user.model.js.map +1 -0
  47. package/dist/repositories/audit.repository.d.ts +37 -0
  48. package/dist/repositories/audit.repository.d.ts.map +1 -0
  49. package/dist/repositories/audit.repository.js +116 -0
  50. package/dist/repositories/audit.repository.js.map +1 -0
  51. package/dist/repositories/base.repository.d.ts +54 -0
  52. package/dist/repositories/base.repository.d.ts.map +1 -0
  53. package/dist/repositories/base.repository.js +97 -0
  54. package/dist/repositories/base.repository.js.map +1 -0
  55. package/dist/repositories/key.repository.d.ts +60 -0
  56. package/dist/repositories/key.repository.d.ts.map +1 -0
  57. package/dist/repositories/key.repository.js +126 -0
  58. package/dist/repositories/key.repository.js.map +1 -0
  59. package/dist/repositories/project.repository.d.ts +42 -0
  60. package/dist/repositories/project.repository.d.ts.map +1 -0
  61. package/dist/repositories/project.repository.js +82 -0
  62. package/dist/repositories/project.repository.js.map +1 -0
  63. package/dist/repositories/user.repository.d.ts +58 -0
  64. package/dist/repositories/user.repository.d.ts.map +1 -0
  65. package/dist/repositories/user.repository.js +102 -0
  66. package/dist/repositories/user.repository.js.map +1 -0
  67. package/dist/services/audit.service.d.ts +63 -0
  68. package/dist/services/audit.service.d.ts.map +1 -0
  69. package/dist/services/audit.service.js +113 -0
  70. package/dist/services/audit.service.js.map +1 -0
  71. package/dist/services/auth.service.d.ts +39 -0
  72. package/dist/services/auth.service.d.ts.map +1 -0
  73. package/dist/services/auth.service.js +179 -0
  74. package/dist/services/auth.service.js.map +1 -0
  75. package/dist/services/key.service.d.ts +47 -0
  76. package/dist/services/key.service.d.ts.map +1 -0
  77. package/dist/services/key.service.js +135 -0
  78. package/dist/services/key.service.js.map +1 -0
  79. package/dist/services/permission.service.d.ts +37 -0
  80. package/dist/services/permission.service.d.ts.map +1 -0
  81. package/dist/services/permission.service.js +140 -0
  82. package/dist/services/permission.service.js.map +1 -0
  83. package/dist/services/project.service.d.ts +37 -0
  84. package/dist/services/project.service.d.ts.map +1 -0
  85. package/dist/services/project.service.js +96 -0
  86. package/dist/services/project.service.js.map +1 -0
  87. package/dist/types/audit.types.d.ts +122 -0
  88. package/dist/types/audit.types.d.ts.map +1 -0
  89. package/dist/types/audit.types.js +55 -0
  90. package/dist/types/audit.types.js.map +1 -0
  91. package/dist/types/client.types.d.ts +47 -0
  92. package/dist/types/client.types.d.ts.map +1 -0
  93. package/dist/types/client.types.js +6 -0
  94. package/dist/types/client.types.js.map +1 -0
  95. package/dist/types/crypto.types.d.ts +48 -0
  96. package/dist/types/crypto.types.d.ts.map +1 -0
  97. package/dist/types/crypto.types.js +6 -0
  98. package/dist/types/crypto.types.js.map +1 -0
  99. package/dist/types/index.d.ts +86 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +92 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/types/key.types.d.ts +125 -0
  104. package/dist/types/key.types.d.ts.map +1 -0
  105. package/dist/types/key.types.js +28 -0
  106. package/dist/types/key.types.js.map +1 -0
  107. package/dist/types/project.types.d.ts +57 -0
  108. package/dist/types/project.types.d.ts.map +1 -0
  109. package/dist/types/project.types.js +16 -0
  110. package/dist/types/project.types.js.map +1 -0
  111. package/dist/types/user.types.d.ts +110 -0
  112. package/dist/types/user.types.d.ts.map +1 -0
  113. package/dist/types/user.types.js +49 -0
  114. package/dist/types/user.types.js.map +1 -0
  115. package/dist/utils/config-loader.d.ts +64 -0
  116. package/dist/utils/config-loader.d.ts.map +1 -0
  117. package/dist/utils/config-loader.js +126 -0
  118. package/dist/utils/config-loader.js.map +1 -0
  119. package/dist/utils/constants.d.ts +62 -0
  120. package/dist/utils/constants.d.ts.map +1 -0
  121. package/dist/utils/constants.js +119 -0
  122. package/dist/utils/constants.js.map +1 -0
  123. package/dist/utils/error-handler.d.ts +48 -0
  124. package/dist/utils/error-handler.d.ts.map +1 -0
  125. package/dist/utils/error-handler.js +109 -0
  126. package/dist/utils/error-handler.js.map +1 -0
  127. package/package.json +53 -0
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * 审计服务
4
+ * 负责记录和查询审计日志
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AuditService = void 0;
8
+ const types_1 = require("../types");
9
+ const audit_model_1 = require("../models/audit.model");
10
+ class AuditService {
11
+ auditRepo;
12
+ constructor(auditRepo) {
13
+ this.auditRepo = auditRepo;
14
+ }
15
+ /**
16
+ * 记录审计日志
17
+ */
18
+ async log(data) {
19
+ const log = (0, audit_model_1.createAuditLog)(data);
20
+ await this.auditRepo.insertOne(log);
21
+ }
22
+ /**
23
+ * 查询审计日志
24
+ */
25
+ async getAuditLogs(projectId, query) {
26
+ const result = await this.auditRepo.findAuditLogs(projectId, query);
27
+ return {
28
+ logs: result.logs,
29
+ total: result.total,
30
+ page: query.page || 1,
31
+ limit: query.limit || 50,
32
+ };
33
+ }
34
+ /**
35
+ * 获取最近的审计日志
36
+ */
37
+ async getRecentLogs(projectId, limit = 100) {
38
+ return await this.auditRepo.findRecentLogs(projectId, limit);
39
+ }
40
+ /**
41
+ * 统计失败登录次数
42
+ */
43
+ async countFailedLogins(projectId, userId, since) {
44
+ return await this.auditRepo.countFailedLogins(projectId, userId, since);
45
+ }
46
+ /**
47
+ * 记录项目创建
48
+ */
49
+ async logProjectCreated(projectId, userId, projectName, success) {
50
+ await this.log({
51
+ projectId,
52
+ userId,
53
+ action: types_1.AuditAction.CREATE_PROJECT,
54
+ resourceType: types_1.ResourceType.PROJECT,
55
+ resourceId: projectId,
56
+ details: {
57
+ keyName: projectName,
58
+ success,
59
+ },
60
+ });
61
+ }
62
+ /**
63
+ * 记录密钥创建
64
+ */
65
+ async logKeyCreated(projectId, userId, keyId, keyName, keyType, success) {
66
+ await this.log({
67
+ projectId,
68
+ userId,
69
+ action: types_1.AuditAction.CREATE_KEY,
70
+ resourceType: types_1.ResourceType.KEY,
71
+ resourceId: keyId,
72
+ details: {
73
+ keyName,
74
+ keyType,
75
+ success,
76
+ },
77
+ });
78
+ }
79
+ /**
80
+ * 记录密钥读取
81
+ */
82
+ async logKeyRead(projectId, userId, keyId, keyName, success) {
83
+ await this.log({
84
+ projectId,
85
+ userId,
86
+ action: types_1.AuditAction.READ_KEY,
87
+ resourceType: types_1.ResourceType.KEY,
88
+ resourceId: keyId,
89
+ details: {
90
+ keyName,
91
+ success,
92
+ },
93
+ });
94
+ }
95
+ /**
96
+ * 记录密钥删除
97
+ */
98
+ async logKeyDeleted(projectId, userId, keyId, keyName, success) {
99
+ await this.log({
100
+ projectId,
101
+ userId,
102
+ action: types_1.AuditAction.DELETE_KEY,
103
+ resourceType: types_1.ResourceType.KEY,
104
+ resourceId: keyId,
105
+ details: {
106
+ keyName,
107
+ success,
108
+ },
109
+ });
110
+ }
111
+ }
112
+ exports.AuditService = AuditService;
113
+ //# sourceMappingURL=audit.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.service.js","sourceRoot":"","sources":["../../src/services/audit.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 认证服务
3
+ * 负责用户认证和授权
4
+ */
5
+ import { UserRepository } from '../repositories/user.repository';
6
+ import { AuditService } from './audit.service';
7
+ import { User, CreateUserData, AuthCredentials, AuthResult } from '../types';
8
+ export declare class AuthService {
9
+ private userRepo;
10
+ private auditService;
11
+ constructor(userRepo: UserRepository, auditService: AuditService);
12
+ /**
13
+ * 创建用户
14
+ */
15
+ createUser(projectId: string, creatorId: string, userData: CreateUserData): Promise<Omit<User, 'passwordHash' | 'apiKeyHash'> & {
16
+ apiKey?: string;
17
+ }>;
18
+ /**
19
+ * 用户登录
20
+ */
21
+ login(projectId: string, credentials: AuthCredentials): Promise<AuthResult>;
22
+ /**
23
+ * 使用API密钥认证
24
+ */
25
+ authenticateWithApiKey(projectId: string, apiKey: string): Promise<User | null>;
26
+ /**
27
+ * 验证用户凭证
28
+ */
29
+ verifyCredentials(projectId: string, username: string, password: string): Promise<boolean>;
30
+ /**
31
+ * 生成API密钥
32
+ */
33
+ private generateApiKey;
34
+ /**
35
+ * 轮换API密钥
36
+ */
37
+ rotateApiKey(projectId: string, userId: string, targetUserId: string): Promise<string>;
38
+ }
39
+ //# sourceMappingURL=auth.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAQ,MAAM,UAAU,CAAC;AAQnF,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;gBADZ,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,YAAY;IAGpC;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA8C3E;;OAEG;IACG,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,UAAU,CAAC;IAqFtB;;OAEG;IACG,sBAAsB,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAevB;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAKnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACG,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC;CAenB"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * 认证服务
4
+ * 负责用户认证和授权
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AuthService = void 0;
8
+ const user_model_1 = require("../models/user.model");
9
+ const bcrypt_1 = require("bcrypt");
10
+ const crypto_1 = require("crypto");
11
+ const types_1 = require("../types");
12
+ const types_2 = require("../types");
13
+ class AuthService {
14
+ userRepo;
15
+ auditService;
16
+ constructor(userRepo, auditService) {
17
+ this.userRepo = userRepo;
18
+ this.auditService = auditService;
19
+ }
20
+ /**
21
+ * 创建用户
22
+ */
23
+ async createUser(projectId, creatorId, userData) {
24
+ // 验证用户数据
25
+ const validation = (0, user_model_1.validateUser)(userData);
26
+ if (!validation.valid) {
27
+ throw new types_1.ValidationError(validation.errors.join(', '));
28
+ }
29
+ // 检查用户名是否已存在
30
+ const existingUser = await this.userRepo.findByProjectAndUsername(projectId, userData.username);
31
+ if (existingUser) {
32
+ throw new types_1.ValidationError('Username already exists');
33
+ }
34
+ // 哈希密码
35
+ const passwordHash = await (0, bcrypt_1.hash)(userData.password, 10);
36
+ // 生成API密钥
37
+ const apiKey = this.generateApiKey();
38
+ const apiKeyHash = await (0, bcrypt_1.hash)(apiKey, 10);
39
+ const user = (0, user_model_1.createUser)(projectId, userData, passwordHash, apiKeyHash);
40
+ await this.userRepo.insertOne(user);
41
+ // 记录审计日志
42
+ await this.auditService.log({
43
+ projectId,
44
+ userId: creatorId,
45
+ action: types_2.AuditAction.CREATE_USER,
46
+ resourceType: types_2.ResourceType.USER,
47
+ resourceId: user.userId,
48
+ details: {
49
+ success: true,
50
+ },
51
+ });
52
+ // 返回用户信息(不包含敏感信息)和API密钥
53
+ return {
54
+ ...(0, user_model_1.toSafeUser)(user),
55
+ apiKey, // 仅在创建时返回一次
56
+ };
57
+ }
58
+ /**
59
+ * 用户登录
60
+ */
61
+ async login(projectId, credentials) {
62
+ const user = await this.userRepo.findByProjectAndUsername(projectId, credentials.username);
63
+ if (!user) {
64
+ await this.auditService.log({
65
+ projectId,
66
+ action: types_2.AuditAction.LOGIN_FAILED,
67
+ resourceType: types_2.ResourceType.USER,
68
+ resourceId: credentials.username,
69
+ details: {
70
+ success: false,
71
+ errorMessage: 'User not found',
72
+ },
73
+ });
74
+ return {
75
+ success: false,
76
+ error: 'Invalid username or password',
77
+ };
78
+ }
79
+ if (user.status !== 'active') {
80
+ await this.auditService.log({
81
+ projectId,
82
+ userId: user.userId,
83
+ action: types_2.AuditAction.LOGIN_FAILED,
84
+ resourceType: types_2.ResourceType.USER,
85
+ resourceId: user.userId,
86
+ details: {
87
+ success: false,
88
+ errorMessage: 'User account is not active',
89
+ },
90
+ });
91
+ return {
92
+ success: false,
93
+ error: 'User account is not active',
94
+ };
95
+ }
96
+ const passwordMatch = await (0, bcrypt_1.compare)(credentials.password, user.passwordHash);
97
+ if (!passwordMatch) {
98
+ await this.auditService.log({
99
+ projectId,
100
+ userId: user.userId,
101
+ action: types_2.AuditAction.LOGIN_FAILED,
102
+ resourceType: types_2.ResourceType.USER,
103
+ resourceId: user.userId,
104
+ details: {
105
+ success: false,
106
+ errorMessage: 'Invalid password',
107
+ },
108
+ });
109
+ return {
110
+ success: false,
111
+ error: 'Invalid username or password',
112
+ };
113
+ }
114
+ // 更新最后登录时间
115
+ await this.userRepo.updateLastLogin(user.userId);
116
+ // 记录审计日志
117
+ await this.auditService.log({
118
+ projectId,
119
+ userId: user.userId,
120
+ action: types_2.AuditAction.LOGIN,
121
+ resourceType: types_2.ResourceType.USER,
122
+ resourceId: user.userId,
123
+ details: {
124
+ success: true,
125
+ },
126
+ });
127
+ return {
128
+ success: true,
129
+ user: (0, user_model_1.toSafeUser)(user),
130
+ };
131
+ }
132
+ /**
133
+ * 使用API密钥认证
134
+ */
135
+ async authenticateWithApiKey(projectId, apiKey) {
136
+ // 查找所有用户并检查API密钥
137
+ const users = await this.userRepo.findByProjectId(projectId);
138
+ for (const user of users) {
139
+ if (user.apiKeyHash && await (0, bcrypt_1.compare)(apiKey, user.apiKeyHash)) {
140
+ if (user.status === 'active') {
141
+ return user;
142
+ }
143
+ }
144
+ }
145
+ return null;
146
+ }
147
+ /**
148
+ * 验证用户凭证
149
+ */
150
+ async verifyCredentials(projectId, username, password) {
151
+ const result = await this.login(projectId, { username, password });
152
+ return result.success;
153
+ }
154
+ /**
155
+ * 生成API密钥
156
+ */
157
+ generateApiKey() {
158
+ const apiKeyPrefix = 'kms_';
159
+ const randomBytesBuffer = (0, crypto_1.randomBytes)(32);
160
+ const randomString = randomBytesBuffer.toString('hex');
161
+ return `${apiKeyPrefix}${randomString}`;
162
+ }
163
+ /**
164
+ * 轮换API密钥
165
+ */
166
+ async rotateApiKey(projectId, userId, targetUserId) {
167
+ const user = await this.userRepo.getByUserId(targetUserId);
168
+ if (user.projectId !== projectId) {
169
+ throw new types_1.ValidationError('User does not belong to this project');
170
+ }
171
+ // 生成新API密钥
172
+ const newApiKey = this.generateApiKey();
173
+ const newApiKeyHash = await (0, bcrypt_1.hash)(newApiKey, 10);
174
+ await this.userRepo.updateUser(targetUserId, { apiKeyHash: newApiKeyHash });
175
+ return newApiKey;
176
+ }
177
+ }
178
+ exports.AuthService = AuthService;
179
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 密钥服务
3
+ * 负责密钥的业务逻辑
4
+ */
5
+ import { KeyRepository } from '../repositories/key.repository';
6
+ import { AuditService } from './audit.service';
7
+ import { PermissionService } from './permission.service';
8
+ import { CryptoService } from '../core/crypto.service';
9
+ import { Key, KeyValue, CreateKeyData, UpdateKeyData, KeyFilters } from '../types';
10
+ export declare class KeyService {
11
+ private keyRepo;
12
+ private auditService;
13
+ private permissionService;
14
+ private cryptoService;
15
+ constructor(keyRepo: KeyRepository, auditService: AuditService, permissionService: PermissionService, cryptoService: CryptoService);
16
+ /**
17
+ * 创建密钥
18
+ */
19
+ createKey(projectId: string, userId: string, masterPassword: string, keyData: CreateKeyData): Promise<Key>;
20
+ /**
21
+ * 获取密钥(解密)
22
+ */
23
+ getKey(projectId: string, userId: string, masterPassword: string, keyId: string): Promise<KeyValue>;
24
+ /**
25
+ * 列出密钥
26
+ */
27
+ listKeys(projectId: string, userId: string, filters?: KeyFilters, options?: {
28
+ page?: number;
29
+ limit?: number;
30
+ }): Promise<{
31
+ keys: Key[];
32
+ total: number;
33
+ }>;
34
+ /**
35
+ * 更新密钥
36
+ */
37
+ updateKey(projectId: string, userId: string, masterPassword: string, keyId: string, updates: UpdateKeyData): Promise<Key>;
38
+ /**
39
+ * 删除密钥
40
+ */
41
+ deleteKey(projectId: string, userId: string, keyId: string): Promise<void>;
42
+ /**
43
+ * 获取项目主密钥(需要从项目服务获取)
44
+ */
45
+ private getMasterKey;
46
+ }
47
+ //# sourceMappingURL=key.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.service.d.ts","sourceRoot":"","sources":["../../src/services/key.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACL,GAAG,EACH,QAAQ,EACR,aAAa,EACb,aAAa,EACb,UAAU,EAEX,MAAM,UAAU,CAAC;AAMlB,qBAAa,UAAU;IAEnB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,aAAa;gBAHb,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa;IAGtC;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,GAAG,CAAC;IA0Cf;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC;IAuCpB;;OAEG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,UAAU,EACpB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAO1C;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,GAAG,CAAC;IA2Bf;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhF;;OAEG;YACW,YAAY;CAM3B"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ /**
3
+ * 密钥服务
4
+ * 负责密钥的业务逻辑
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.KeyService = void 0;
8
+ const key_model_1 = require("../models/key.model");
9
+ const types_1 = require("../types");
10
+ const types_2 = require("../types");
11
+ const crypto_1 = require("../core/crypto");
12
+ class KeyService {
13
+ keyRepo;
14
+ auditService;
15
+ permissionService;
16
+ cryptoService;
17
+ constructor(keyRepo, auditService, permissionService, cryptoService) {
18
+ this.keyRepo = keyRepo;
19
+ this.auditService = auditService;
20
+ this.permissionService = permissionService;
21
+ this.cryptoService = cryptoService;
22
+ }
23
+ /**
24
+ * 创建密钥
25
+ */
26
+ async createKey(projectId, userId, masterPassword, keyData) {
27
+ // 验证权限
28
+ await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_CREATE);
29
+ // 验证密钥数据
30
+ const validation = (0, key_model_1.validateKey)(keyData);
31
+ if (!validation.valid) {
32
+ throw new types_1.ValidationError(validation.errors.join(', '));
33
+ }
34
+ // 检查密钥名称是否已存在
35
+ const existingKey = await this.keyRepo.findByProjectAndName(projectId, keyData.keyName);
36
+ if (existingKey) {
37
+ throw new types_1.ValidationError('Key with this name already exists');
38
+ }
39
+ // 加密密钥值
40
+ const masterKeyHex = await this.getMasterKey(projectId, masterPassword);
41
+ const masterKey = (0, crypto_1.hexToBuffer)(masterKeyHex);
42
+ const encryptedData = await this.cryptoService.encryptKey(keyData.value, masterKey);
43
+ // 创建密钥
44
+ const key = (0, key_model_1.createKey)(projectId, keyData, encryptedData, userId);
45
+ await this.keyRepo.insertOne(key);
46
+ // 记录审计日志
47
+ await this.auditService.logKeyCreated(projectId, userId, key.keyId, key.keyName, key.keyType, true);
48
+ return key;
49
+ }
50
+ /**
51
+ * 获取密钥(解密)
52
+ */
53
+ async getKey(projectId, userId, masterPassword, keyId) {
54
+ // 验证权限
55
+ await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_READ);
56
+ // 获取密钥
57
+ const key = await this.keyRepo.findByKeyId(keyId);
58
+ if (!key) {
59
+ throw new types_1.KeyNotFoundError(keyId);
60
+ }
61
+ // 验证项目
62
+ if (key.projectId !== projectId) {
63
+ throw new types_1.ValidationError('Key does not belong to this project');
64
+ }
65
+ // 检查密钥是否可访问
66
+ if (!(0, key_model_1.isKeyAccessible)(key)) {
67
+ throw new types_1.ValidationError('Key is not accessible');
68
+ }
69
+ // 解密密钥值
70
+ const masterKeyHex = await this.getMasterKey(projectId, masterPassword);
71
+ const masterKey = (0, crypto_1.hexToBuffer)(masterKeyHex);
72
+ const decryptedValue = await this.cryptoService.decryptKey(key.encryptedValue, key.iv, key.authTag, masterKey);
73
+ // 更新最后访问时间
74
+ await this.keyRepo.updateLastAccessed(keyId);
75
+ // 记录审计日志
76
+ await this.auditService.logKeyRead(projectId, userId, keyId, key.keyName, true);
77
+ return (0, key_model_1.toKeyValue)(key, decryptedValue);
78
+ }
79
+ /**
80
+ * 列出密钥
81
+ */
82
+ async listKeys(projectId, userId, filters, options) {
83
+ // 验证权限
84
+ await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_LIST);
85
+ return await this.keyRepo.findByProjectId(projectId, filters, options);
86
+ }
87
+ /**
88
+ * 更新密钥
89
+ */
90
+ async updateKey(projectId, userId, masterPassword, keyId, updates) {
91
+ // 验证权限
92
+ await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_UPDATE);
93
+ const key = await this.keyRepo.getByKeyId(keyId);
94
+ // 验证项目
95
+ if (key.projectId !== projectId) {
96
+ throw new types_1.ValidationError('Key does not belong to this project');
97
+ }
98
+ let newEncryptedData;
99
+ // 如果更新密钥值,需要重新加密
100
+ if (updates.value) {
101
+ const masterKeyHex = await this.getMasterKey(projectId, masterPassword);
102
+ const masterKey = (0, crypto_1.hexToBuffer)(masterKeyHex);
103
+ newEncryptedData = await this.cryptoService.encryptKey(updates.value, masterKey);
104
+ }
105
+ const updatedKey = (0, key_model_1.updateKey)(key, updates, newEncryptedData);
106
+ await this.keyRepo.updateKey(keyId, updatedKey);
107
+ return updatedKey;
108
+ }
109
+ /**
110
+ * 删除密钥
111
+ */
112
+ async deleteKey(projectId, userId, keyId) {
113
+ // 验证权限
114
+ await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_DELETE);
115
+ const key = await this.keyRepo.getByKeyId(keyId);
116
+ // 验证项目
117
+ if (key.projectId !== projectId) {
118
+ throw new types_1.ValidationError('Key does not belong to this project');
119
+ }
120
+ await this.keyRepo.softDeleteKey(keyId);
121
+ // 记录审计日志
122
+ await this.auditService.logKeyDeleted(projectId, userId, keyId, key.keyName, true);
123
+ }
124
+ /**
125
+ * 获取项目主密钥(需要从项目服务获取)
126
+ */
127
+ async getMasterKey(projectId, masterPassword) {
128
+ // 这里需要调用ProjectService来获取主密钥
129
+ // 为了避免循环依赖,我们将这个方法标记为private,实际使用时需要注入ProjectService
130
+ // 或者将密钥派生逻辑提取到独立的模块
131
+ throw new Error('Master key retrieval not implemented - use ProjectService');
132
+ }
133
+ }
134
+ exports.KeyService = KeyService;
135
+ //# sourceMappingURL=key.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.service.js","sourceRoot":"","sources":["../../src/services/key.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 权限服务
3
+ * 负责权限验证和访问控制
4
+ */
5
+ import { UserRepository } from '../repositories/user.repository';
6
+ import { AuditService } from './audit.service';
7
+ import { Role, Permission } from '../types';
8
+ export declare class PermissionService {
9
+ private userRepo;
10
+ private auditService;
11
+ constructor(userRepo: UserRepository, auditService: AuditService);
12
+ /**
13
+ * 检查用户是否拥有指定权限
14
+ */
15
+ checkPermission(projectId: string, userId: string, requiredPermission: Permission): Promise<boolean>;
16
+ /**
17
+ * 要求用户必须拥有指定权限,否则抛出异常
18
+ */
19
+ requirePermission(projectId: string, userId: string, requiredPermission: Permission): Promise<void>;
20
+ /**
21
+ * 检查用户是否拥有指定角色
22
+ */
23
+ hasRole(projectId: string, userId: string, role: Role): Promise<boolean>;
24
+ /**
25
+ * 授予角色
26
+ */
27
+ grantRole(projectId: string, adminUserId: string, targetUserId: string, role: Role): Promise<void>;
28
+ /**
29
+ * 撤销角色
30
+ */
31
+ revokeRole(projectId: string, adminUserId: string, targetUserId: string, role: Role): Promise<void>;
32
+ /**
33
+ * 获取用户的所有权限(包括角色权限)
34
+ */
35
+ getUserPermissions(projectId: string, userId: string): Promise<Permission[]>;
36
+ }
37
+ //# sourceMappingURL=permission.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../src/services/permission.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,UAAU,EAA6C,MAAM,UAAU,CAAC;AAGvF,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;gBADZ,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,YAAY;IAGpC;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,UAAU,GAC7B,OAAO,CAAC,OAAO,CAAC;IA2BnB;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,UAAU,GAC7B,OAAO,CAAC,IAAI,CAAC;IAwBhB;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9E;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,IAAI,CAAC;IA8BhB;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAiBnF"}