@pengzi/kms 1.1.0 → 1.2.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/README.md +64 -5
- package/dist/cli/cli/kms.js +1050 -0
- package/dist/cli/kms.js +1050 -0
- package/dist/cli/src/client.js +254 -0
- package/dist/cli/src/core/asymmetric-crypto.js +170 -0
- package/dist/cli/src/core/crypto.js +99 -0
- package/dist/cli/src/core/crypto.service.js +66 -0
- package/dist/cli/src/core/key-derivation.js +95 -0
- package/dist/cli/src/index.js +50 -0
- package/dist/cli/src/models/audit.model.js +82 -0
- package/dist/cli/src/models/key.model.js +119 -0
- package/dist/cli/src/models/project.model.js +53 -0
- package/dist/cli/src/models/user.model.js +140 -0
- package/dist/cli/src/repositories/audit.repository.js +115 -0
- package/dist/cli/src/repositories/base.repository.js +94 -0
- package/dist/cli/src/repositories/key.repository.js +125 -0
- package/dist/cli/src/repositories/project.repository.js +81 -0
- package/dist/cli/src/repositories/user.repository.js +101 -0
- package/dist/cli/src/services/audit.service.js +111 -0
- package/dist/cli/src/services/auth.service.js +176 -0
- package/dist/cli/src/services/key.service.js +137 -0
- package/dist/cli/src/services/permission.service.js +142 -0
- package/dist/cli/src/services/project.service.js +102 -0
- package/dist/cli/src/types/audit.types.js +54 -0
- package/dist/cli/src/types/crypto.types.js +5 -0
- package/dist/cli/src/types/index.js +90 -0
- package/dist/cli/src/types/key.types.js +27 -0
- package/dist/cli/src/types/project.types.js +15 -0
- package/dist/cli/src/types/user.types.js +48 -0
- package/dist/cli/src/utils/config-loader.js +125 -0
- package/dist/cli/src/utils/constants.js +118 -0
- package/dist/cli/src/utils/error-handler.js +108 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +19 -2
- package/dist/client.js.map +1 -1
- package/dist/models/key.model.js +1 -1
- package/dist/models/key.model.js.map +1 -1
- package/dist/services/key.service.d.ts +5 -0
- package/dist/services/key.service.d.ts.map +1 -1
- package/dist/services/key.service.js +12 -4
- package/dist/services/key.service.js.map +1 -1
- package/dist/src/client.js +269 -0
- package/dist/src/core/asymmetric-crypto.js +170 -0
- package/dist/src/core/crypto.js +99 -0
- package/dist/src/core/crypto.service.js +66 -0
- package/dist/src/core/key-derivation.js +95 -0
- package/dist/src/index.js +50 -0
- package/dist/src/models/audit.model.js +82 -0
- package/dist/src/models/key.model.js +119 -0
- package/dist/src/models/project.model.js +53 -0
- package/dist/src/models/user.model.js +140 -0
- package/dist/src/repositories/audit.repository.js +115 -0
- package/dist/src/repositories/base.repository.js +94 -0
- package/dist/src/repositories/key.repository.js +125 -0
- package/dist/src/repositories/project.repository.js +81 -0
- package/dist/src/repositories/user.repository.js +101 -0
- package/dist/src/services/audit.service.js +111 -0
- package/dist/src/services/auth.service.js +176 -0
- package/dist/src/services/key.service.js +137 -0
- package/dist/src/services/permission.service.js +142 -0
- package/dist/src/services/project.service.js +102 -0
- package/dist/src/types/audit.types.js +54 -0
- package/dist/src/types/crypto.types.js +5 -0
- package/dist/src/types/index.js +90 -0
- package/dist/src/types/key.types.js +27 -0
- package/dist/src/types/project.types.js +15 -0
- package/dist/src/types/user.types.js +48 -0
- package/dist/src/utils/config-loader.js +125 -0
- package/dist/src/utils/constants.js +118 -0
- package/dist/src/utils/error-handler.js +108 -0
- package/dist/types/client.types.d.ts +20 -0
- package/dist/types/client.types.d.ts.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,137 @@
|
|
|
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
|
+
constructor(keyRepo, auditService, permissionService, cryptoService) {
|
|
14
|
+
this.keyRepo = keyRepo;
|
|
15
|
+
this.auditService = auditService;
|
|
16
|
+
this.permissionService = permissionService;
|
|
17
|
+
this.cryptoService = cryptoService;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 设置 ProjectService 引用(避免循环依赖)
|
|
21
|
+
*/
|
|
22
|
+
setProjectService(projectService) {
|
|
23
|
+
this.projectService = projectService;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 创建密钥
|
|
27
|
+
*/
|
|
28
|
+
async createKey(projectId, userId, masterPassword, keyData) {
|
|
29
|
+
// 验证权限
|
|
30
|
+
await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_CREATE);
|
|
31
|
+
// 验证密钥数据
|
|
32
|
+
const validation = (0, key_model_1.validateKey)(keyData);
|
|
33
|
+
if (!validation.valid) {
|
|
34
|
+
throw new types_1.ValidationError(validation.errors.join(', '));
|
|
35
|
+
}
|
|
36
|
+
// 检查密钥名称是否已存在
|
|
37
|
+
const existingKey = await this.keyRepo.findByProjectAndName(projectId, keyData.keyName);
|
|
38
|
+
if (existingKey) {
|
|
39
|
+
throw new types_1.ValidationError('Key with this name already exists');
|
|
40
|
+
}
|
|
41
|
+
// 加密密钥值
|
|
42
|
+
const masterKeyHex = await this.getMasterKey(projectId, masterPassword);
|
|
43
|
+
const masterKey = (0, crypto_1.hexToBuffer)(masterKeyHex);
|
|
44
|
+
const encryptedData = await this.cryptoService.encryptKey(keyData.value, masterKey);
|
|
45
|
+
// 创建密钥
|
|
46
|
+
const key = (0, key_model_1.createKey)(projectId, keyData, encryptedData, userId);
|
|
47
|
+
await this.keyRepo.insertOne(key);
|
|
48
|
+
// 记录审计日志
|
|
49
|
+
await this.auditService.logKeyCreated(projectId, userId, key.keyId, key.keyName, key.keyType, true);
|
|
50
|
+
return key;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 获取密钥(解密)
|
|
54
|
+
*/
|
|
55
|
+
async getKey(projectId, userId, masterPassword, keyId) {
|
|
56
|
+
// 验证权限
|
|
57
|
+
await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_READ);
|
|
58
|
+
// 获取密钥
|
|
59
|
+
const key = await this.keyRepo.findByKeyId(keyId);
|
|
60
|
+
if (!key) {
|
|
61
|
+
throw new types_1.KeyNotFoundError(keyId);
|
|
62
|
+
}
|
|
63
|
+
// 验证项目
|
|
64
|
+
if (key.projectId !== projectId) {
|
|
65
|
+
throw new types_1.ValidationError('Key does not belong to this project');
|
|
66
|
+
}
|
|
67
|
+
// 检查密钥是否可访问
|
|
68
|
+
if (!(0, key_model_1.isKeyAccessible)(key)) {
|
|
69
|
+
throw new types_1.ValidationError('Key is not accessible');
|
|
70
|
+
}
|
|
71
|
+
// 解密密钥值
|
|
72
|
+
const masterKeyHex = await this.getMasterKey(projectId, masterPassword);
|
|
73
|
+
const masterKey = (0, crypto_1.hexToBuffer)(masterKeyHex);
|
|
74
|
+
const decryptedValue = await this.cryptoService.decryptKey(key.encryptedValue, key.iv, key.authTag, masterKey);
|
|
75
|
+
// 更新最后访问时间
|
|
76
|
+
await this.keyRepo.updateLastAccessed(keyId);
|
|
77
|
+
// 记录审计日志
|
|
78
|
+
await this.auditService.logKeyRead(projectId, userId, keyId, key.keyName, true);
|
|
79
|
+
return (0, key_model_1.toKeyValue)(key, decryptedValue);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 列出密钥
|
|
83
|
+
*/
|
|
84
|
+
async listKeys(projectId, userId, filters, options) {
|
|
85
|
+
// 验证权限
|
|
86
|
+
await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_LIST);
|
|
87
|
+
return await this.keyRepo.findByProjectId(projectId, filters, options);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 更新密钥
|
|
91
|
+
*/
|
|
92
|
+
async updateKey(projectId, userId, masterPassword, keyId, updates) {
|
|
93
|
+
// 验证权限
|
|
94
|
+
await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_UPDATE);
|
|
95
|
+
const key = await this.keyRepo.getByKeyId(keyId);
|
|
96
|
+
// 验证项目
|
|
97
|
+
if (key.projectId !== projectId) {
|
|
98
|
+
throw new types_1.ValidationError('Key does not belong to this project');
|
|
99
|
+
}
|
|
100
|
+
let newEncryptedData;
|
|
101
|
+
// 如果更新密钥值,需要重新加密
|
|
102
|
+
if (updates.value) {
|
|
103
|
+
const masterKeyHex = await this.getMasterKey(projectId, masterPassword);
|
|
104
|
+
const masterKey = (0, crypto_1.hexToBuffer)(masterKeyHex);
|
|
105
|
+
newEncryptedData = await this.cryptoService.encryptKey(updates.value, masterKey);
|
|
106
|
+
}
|
|
107
|
+
const updatedKey = (0, key_model_1.updateKey)(key, updates, newEncryptedData);
|
|
108
|
+
await this.keyRepo.updateKey(keyId, updatedKey);
|
|
109
|
+
return updatedKey;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 删除密钥
|
|
113
|
+
*/
|
|
114
|
+
async deleteKey(projectId, userId, keyId) {
|
|
115
|
+
// 验证权限
|
|
116
|
+
await this.permissionService.requirePermission(projectId, userId, types_2.Permission.KEY_DELETE);
|
|
117
|
+
const key = await this.keyRepo.getByKeyId(keyId);
|
|
118
|
+
// 验证项目
|
|
119
|
+
if (key.projectId !== projectId) {
|
|
120
|
+
throw new types_1.ValidationError('Key does not belong to this project');
|
|
121
|
+
}
|
|
122
|
+
await this.keyRepo.softDeleteKey(keyId);
|
|
123
|
+
// 记录审计日志
|
|
124
|
+
await this.auditService.logKeyDeleted(projectId, userId, keyId, key.keyName, true);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 获取项目主密钥(需要从项目服务获取)
|
|
128
|
+
*/
|
|
129
|
+
async getMasterKey(projectId, masterPassword) {
|
|
130
|
+
if (!this.projectService) {
|
|
131
|
+
throw new Error('ProjectService not set. Call setProjectService() first.');
|
|
132
|
+
}
|
|
133
|
+
const masterKey = await this.projectService.unlockProjectMasterKey(projectId, masterPassword);
|
|
134
|
+
return masterKey.toString('hex');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.KeyService = KeyService;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 权限服务
|
|
4
|
+
* 负责权限验证和访问控制
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PermissionService = void 0;
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const constants_1 = require("../utils/constants");
|
|
10
|
+
class PermissionService {
|
|
11
|
+
constructor(userRepo, auditService) {
|
|
12
|
+
this.userRepo = userRepo;
|
|
13
|
+
this.auditService = auditService;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 检查用户是否拥有指定权限
|
|
17
|
+
*/
|
|
18
|
+
async checkPermission(projectId, userId, requiredPermission) {
|
|
19
|
+
// 先尝试按 username 查找
|
|
20
|
+
let user = await this.userRepo.findByProjectAndUsername(projectId, userId);
|
|
21
|
+
// 如果没找到,尝试按 userId 查找
|
|
22
|
+
if (!user) {
|
|
23
|
+
user = await this.userRepo.findByUserId(userId);
|
|
24
|
+
}
|
|
25
|
+
if (!user) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
if (user.status !== 'active') {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
// 检查直接权限
|
|
32
|
+
if (user.permissions.includes(requiredPermission)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// 检查角色权限
|
|
36
|
+
for (const role of user.roles) {
|
|
37
|
+
const rolePermissions = constants_1.ROLE_PERMISSIONS[role];
|
|
38
|
+
if (rolePermissions?.includes(requiredPermission)) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 要求用户必须拥有指定权限,否则抛出异常
|
|
46
|
+
*/
|
|
47
|
+
async requirePermission(projectId, userId, requiredPermission) {
|
|
48
|
+
const hasPermission = await this.checkPermission(projectId, userId, requiredPermission);
|
|
49
|
+
if (!hasPermission) {
|
|
50
|
+
await this.auditService.log({
|
|
51
|
+
projectId,
|
|
52
|
+
userId,
|
|
53
|
+
action: types_1.AuditAction.PERMISSION_DENIED,
|
|
54
|
+
resourceType: types_1.ResourceType.KEY,
|
|
55
|
+
resourceId: requiredPermission,
|
|
56
|
+
details: {
|
|
57
|
+
success: false,
|
|
58
|
+
errorMessage: `User ${userId} does not have permission: ${requiredPermission}`,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
throw new types_1.ForbiddenError(`User does not have required permission: ${requiredPermission}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 检查用户是否拥有指定角色
|
|
66
|
+
*/
|
|
67
|
+
async hasRole(projectId, userId, role) {
|
|
68
|
+
const user = await this.userRepo.findByProjectAndUsername(projectId, userId);
|
|
69
|
+
if (!user) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return user.roles.includes(role);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 授予角色
|
|
76
|
+
*/
|
|
77
|
+
async grantRole(projectId, adminUserId, targetUserId, role) {
|
|
78
|
+
// 验证管理员权限
|
|
79
|
+
await this.requirePermission(projectId, adminUserId, types_1.Permission.USER_UPDATE);
|
|
80
|
+
const user = await this.userRepo.findByProjectAndUsername(projectId, targetUserId);
|
|
81
|
+
if (!user) {
|
|
82
|
+
throw new Error('User not found');
|
|
83
|
+
}
|
|
84
|
+
if (user.roles.includes(role)) {
|
|
85
|
+
return; // 已经拥有该角色
|
|
86
|
+
}
|
|
87
|
+
await this.userRepo.updateUser(user.userId, {
|
|
88
|
+
roles: [...user.roles, role],
|
|
89
|
+
});
|
|
90
|
+
await this.auditService.log({
|
|
91
|
+
projectId,
|
|
92
|
+
userId: adminUserId,
|
|
93
|
+
action: types_1.AuditAction.GRANT_ROLE,
|
|
94
|
+
resourceType: types_1.ResourceType.USER,
|
|
95
|
+
resourceId: user.userId,
|
|
96
|
+
details: {
|
|
97
|
+
success: true,
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 撤销角色
|
|
103
|
+
*/
|
|
104
|
+
async revokeRole(projectId, adminUserId, targetUserId, role) {
|
|
105
|
+
// 验证管理员权限
|
|
106
|
+
await this.requirePermission(projectId, adminUserId, types_1.Permission.USER_UPDATE);
|
|
107
|
+
const user = await this.userRepo.findByProjectAndUsername(projectId, targetUserId);
|
|
108
|
+
if (!user) {
|
|
109
|
+
throw new Error('User not found');
|
|
110
|
+
}
|
|
111
|
+
await this.userRepo.updateUser(user.userId, {
|
|
112
|
+
roles: user.roles.filter((r) => r !== role),
|
|
113
|
+
});
|
|
114
|
+
await this.auditService.log({
|
|
115
|
+
projectId,
|
|
116
|
+
userId: adminUserId,
|
|
117
|
+
action: types_1.AuditAction.REVOKE_ROLE,
|
|
118
|
+
resourceType: types_1.ResourceType.USER,
|
|
119
|
+
resourceId: user.userId,
|
|
120
|
+
details: {
|
|
121
|
+
success: true,
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 获取用户的所有权限(包括角色权限)
|
|
127
|
+
*/
|
|
128
|
+
async getUserPermissions(projectId, userId) {
|
|
129
|
+
const user = await this.userRepo.findByProjectAndUsername(projectId, userId);
|
|
130
|
+
if (!user) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
const permissions = new Set(user.permissions);
|
|
134
|
+
// 添加角色权限
|
|
135
|
+
for (const role of user.roles) {
|
|
136
|
+
const rolePermissions = constants_1.ROLE_PERMISSIONS[role] || [];
|
|
137
|
+
rolePermissions.forEach((p) => permissions.add(p));
|
|
138
|
+
}
|
|
139
|
+
return Array.from(permissions);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.PermissionService = PermissionService;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 项目服务
|
|
4
|
+
* 负责项目的业务逻辑
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ProjectService = void 0;
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const project_model_1 = require("../models/project.model");
|
|
10
|
+
const user_model_1 = require("../models/user.model");
|
|
11
|
+
const key_derivation_1 = require("../core/key-derivation");
|
|
12
|
+
const types_2 = require("../types");
|
|
13
|
+
const constants_1 = require("../utils/constants");
|
|
14
|
+
const types_3 = require("../types");
|
|
15
|
+
const bcrypt_1 = require("bcrypt");
|
|
16
|
+
class ProjectService {
|
|
17
|
+
constructor(projectRepo, userRepo, auditService, cryptoService) {
|
|
18
|
+
this.projectRepo = projectRepo;
|
|
19
|
+
this.userRepo = userRepo;
|
|
20
|
+
this.auditService = auditService;
|
|
21
|
+
this.cryptoService = cryptoService;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 创建项目
|
|
25
|
+
*/
|
|
26
|
+
async createProject(options, userId) {
|
|
27
|
+
// 验证密码强度
|
|
28
|
+
const passwordValidation = (0, constants_1.validatePasswordStrength)(options.masterPassword);
|
|
29
|
+
if (!passwordValidation.valid) {
|
|
30
|
+
throw new types_2.ValidationError(passwordValidation.errors.join(', '));
|
|
31
|
+
}
|
|
32
|
+
// 验证项目名称唯一性
|
|
33
|
+
const existingProject = await this.projectRepo.findByProjectName(options.projectName);
|
|
34
|
+
if (existingProject) {
|
|
35
|
+
throw new types_2.ValidationError('Project name already exists');
|
|
36
|
+
}
|
|
37
|
+
// 派生主密钥
|
|
38
|
+
const salt = (0, key_derivation_1.generateSalt)();
|
|
39
|
+
const masterKey = await this.cryptoService.deriveMasterKey(options.masterPassword, salt);
|
|
40
|
+
const masterKeyHash = await this.cryptoService.hashMasterKey(masterKey);
|
|
41
|
+
// 加密主密钥(这里简化处理,实际应该使用系统主密钥加密)
|
|
42
|
+
// 为了安全,我们存储哈希用于验证,不存储加密的主密钥
|
|
43
|
+
// 使用时需要用户重新提供密码来派生主密钥
|
|
44
|
+
const project = (0, project_model_1.createProject)(options, '', // 加密后的主密钥(可选实现)
|
|
45
|
+
masterKeyHash, salt);
|
|
46
|
+
await this.projectRepo.insertOne(project);
|
|
47
|
+
// 自动创建项目所有者用户(管理员)
|
|
48
|
+
// 使用 userId 作为用户名,这样 setCurrentUser 后可以直接使用
|
|
49
|
+
const ownerUser = (0, user_model_1.createUser)(project.projectId, {
|
|
50
|
+
username: userId, // 使用调用者的 userId 作为用户名
|
|
51
|
+
password: options.masterPassword,
|
|
52
|
+
roles: [types_1.Role.ADMIN]
|
|
53
|
+
}, await (0, bcrypt_1.hash)(options.masterPassword, 10));
|
|
54
|
+
await this.userRepo.insertOne(ownerUser);
|
|
55
|
+
// 记录审计日志
|
|
56
|
+
await this.auditService.logProjectCreated(project.projectId, userId, project.projectName, true);
|
|
57
|
+
return project;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 获取项目
|
|
61
|
+
*/
|
|
62
|
+
async getProject(projectId) {
|
|
63
|
+
const project = await this.projectRepo.findByProjectId(projectId);
|
|
64
|
+
if (!project) {
|
|
65
|
+
throw new types_2.ProjectNotFoundError(projectId);
|
|
66
|
+
}
|
|
67
|
+
return project;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 列出所有项目
|
|
71
|
+
*/
|
|
72
|
+
async listProjects() {
|
|
73
|
+
return await this.projectRepo.findProjects();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 删除项目
|
|
77
|
+
*/
|
|
78
|
+
async deleteProject(projectId, userId) {
|
|
79
|
+
const project = await this.getProject(projectId);
|
|
80
|
+
await this.projectRepo.softDeleteProject(projectId);
|
|
81
|
+
await this.auditService.log({
|
|
82
|
+
projectId,
|
|
83
|
+
userId,
|
|
84
|
+
action: types_3.AuditAction.DELETE_PROJECT,
|
|
85
|
+
resourceType: types_3.ResourceType.PROJECT,
|
|
86
|
+
resourceId: projectId,
|
|
87
|
+
details: {
|
|
88
|
+
keyName: project.projectName,
|
|
89
|
+
success: true,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 解锁项目主密钥(使用主密码)
|
|
95
|
+
*/
|
|
96
|
+
async unlockProjectMasterKey(projectId, masterPassword) {
|
|
97
|
+
const project = await this.getProject(projectId);
|
|
98
|
+
const masterKey = await this.cryptoService.unlockProjectMasterKey(masterPassword, project.salt, project.masterKeyHash);
|
|
99
|
+
return masterKey.toString('hex');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.ProjectService = ProjectService;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 审计日志相关类型定义
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AuditSeverity = exports.ResourceType = exports.AuditAction = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* 操作类型
|
|
9
|
+
*/
|
|
10
|
+
var AuditAction;
|
|
11
|
+
(function (AuditAction) {
|
|
12
|
+
// 项目操作
|
|
13
|
+
AuditAction["CREATE_PROJECT"] = "CREATE_PROJECT";
|
|
14
|
+
AuditAction["UPDATE_PROJECT"] = "UPDATE_PROJECT";
|
|
15
|
+
AuditAction["DELETE_PROJECT"] = "DELETE_PROJECT";
|
|
16
|
+
// 密钥操作
|
|
17
|
+
AuditAction["CREATE_KEY"] = "CREATE_KEY";
|
|
18
|
+
AuditAction["READ_KEY"] = "READ_KEY";
|
|
19
|
+
AuditAction["UPDATE_KEY"] = "UPDATE_KEY";
|
|
20
|
+
AuditAction["DELETE_KEY"] = "DELETE_KEY";
|
|
21
|
+
AuditAction["LIST_KEYS"] = "LIST_KEYS";
|
|
22
|
+
AuditAction["ROTATE_KEY"] = "ROTATE_KEY";
|
|
23
|
+
// 用户操作
|
|
24
|
+
AuditAction["CREATE_USER"] = "CREATE_USER";
|
|
25
|
+
AuditAction["UPDATE_USER"] = "UPDATE_USER";
|
|
26
|
+
AuditAction["DELETE_USER"] = "DELETE_USER";
|
|
27
|
+
AuditAction["GRANT_ROLE"] = "GRANT_ROLE";
|
|
28
|
+
AuditAction["REVOKE_ROLE"] = "REVOKE_ROLE";
|
|
29
|
+
// 认证操作
|
|
30
|
+
AuditAction["LOGIN"] = "LOGIN";
|
|
31
|
+
AuditAction["LOGOUT"] = "LOGOUT";
|
|
32
|
+
AuditAction["LOGIN_FAILED"] = "LOGIN_FAILED";
|
|
33
|
+
// 权限
|
|
34
|
+
AuditAction["PERMISSION_DENIED"] = "PERMISSION_DENIED";
|
|
35
|
+
})(AuditAction || (exports.AuditAction = AuditAction = {}));
|
|
36
|
+
/**
|
|
37
|
+
* 资源类型
|
|
38
|
+
*/
|
|
39
|
+
var ResourceType;
|
|
40
|
+
(function (ResourceType) {
|
|
41
|
+
ResourceType["PROJECT"] = "project";
|
|
42
|
+
ResourceType["KEY"] = "key";
|
|
43
|
+
ResourceType["USER"] = "user";
|
|
44
|
+
})(ResourceType || (exports.ResourceType = ResourceType = {}));
|
|
45
|
+
/**
|
|
46
|
+
* 日志严重级别
|
|
47
|
+
*/
|
|
48
|
+
var AuditSeverity;
|
|
49
|
+
(function (AuditSeverity) {
|
|
50
|
+
AuditSeverity["INFO"] = "info";
|
|
51
|
+
AuditSeverity["WARNING"] = "warning";
|
|
52
|
+
AuditSeverity["ERROR"] = "error";
|
|
53
|
+
AuditSeverity["CRITICAL"] = "critical";
|
|
54
|
+
})(AuditSeverity || (exports.AuditSeverity = AuditSeverity = {}));
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 类型定义统一导出
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.CryptoError = exports.ValidationError = exports.ForbiddenError = exports.AuthenticationError = exports.UserNotFoundError = exports.KeyNotFoundError = exports.ProjectNotFoundError = exports.KMSError = void 0;
|
|
21
|
+
// 加密相关
|
|
22
|
+
__exportStar(require("./crypto.types"), exports);
|
|
23
|
+
// 项目相关
|
|
24
|
+
__exportStar(require("./project.types"), exports);
|
|
25
|
+
// 密钥相关
|
|
26
|
+
__exportStar(require("./key.types"), exports);
|
|
27
|
+
// 用户相关
|
|
28
|
+
__exportStar(require("./user.types"), exports);
|
|
29
|
+
// 审计日志相关
|
|
30
|
+
__exportStar(require("./audit.types"), exports);
|
|
31
|
+
/**
|
|
32
|
+
* 错误类型
|
|
33
|
+
*/
|
|
34
|
+
class KMSError extends Error {
|
|
35
|
+
constructor(message, code) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.code = code;
|
|
38
|
+
this.name = 'KMSError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.KMSError = KMSError;
|
|
42
|
+
class ProjectNotFoundError extends KMSError {
|
|
43
|
+
constructor(projectId) {
|
|
44
|
+
super(`Project not found: ${projectId}`, 'PROJECT_NOT_FOUND');
|
|
45
|
+
this.name = 'ProjectNotFoundError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.ProjectNotFoundError = ProjectNotFoundError;
|
|
49
|
+
class KeyNotFoundError extends KMSError {
|
|
50
|
+
constructor(keyId) {
|
|
51
|
+
super(`Key not found: ${keyId}`, 'KEY_NOT_FOUND');
|
|
52
|
+
this.name = 'KeyNotFoundError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.KeyNotFoundError = KeyNotFoundError;
|
|
56
|
+
class UserNotFoundError extends KMSError {
|
|
57
|
+
constructor(userId) {
|
|
58
|
+
super(`User not found: ${userId}`, 'USER_NOT_FOUND');
|
|
59
|
+
this.name = 'UserNotFoundError';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.UserNotFoundError = UserNotFoundError;
|
|
63
|
+
class AuthenticationError extends KMSError {
|
|
64
|
+
constructor(message = 'Authentication failed') {
|
|
65
|
+
super(message, 'AUTHENTICATION_FAILED');
|
|
66
|
+
this.name = 'AuthenticationError';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.AuthenticationError = AuthenticationError;
|
|
70
|
+
class ForbiddenError extends KMSError {
|
|
71
|
+
constructor(message = 'Permission denied') {
|
|
72
|
+
super(message, 'PERMISSION_DENIED');
|
|
73
|
+
this.name = 'ForbiddenError';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.ForbiddenError = ForbiddenError;
|
|
77
|
+
class ValidationError extends KMSError {
|
|
78
|
+
constructor(message) {
|
|
79
|
+
super(message, 'VALIDATION_ERROR');
|
|
80
|
+
this.name = 'ValidationError';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.ValidationError = ValidationError;
|
|
84
|
+
class CryptoError extends KMSError {
|
|
85
|
+
constructor(message) {
|
|
86
|
+
super(message, 'CRYPTO_ERROR');
|
|
87
|
+
this.name = 'CryptoError';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.CryptoError = CryptoError;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 密钥相关类型定义
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.KeyStatus = exports.KeyType = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* 密钥类型
|
|
9
|
+
*/
|
|
10
|
+
var KeyType;
|
|
11
|
+
(function (KeyType) {
|
|
12
|
+
KeyType["MONGODB"] = "mongodb";
|
|
13
|
+
KeyType["MYSQL"] = "mysql";
|
|
14
|
+
KeyType["POSTGRESQL"] = "postgresql";
|
|
15
|
+
KeyType["REDIS"] = "redis";
|
|
16
|
+
KeyType["CUSTOM"] = "custom";
|
|
17
|
+
})(KeyType || (exports.KeyType = KeyType = {}));
|
|
18
|
+
/**
|
|
19
|
+
* 密钥状态
|
|
20
|
+
*/
|
|
21
|
+
var KeyStatus;
|
|
22
|
+
(function (KeyStatus) {
|
|
23
|
+
KeyStatus["ACTIVE"] = "active";
|
|
24
|
+
KeyStatus["DISABLED"] = "disabled";
|
|
25
|
+
KeyStatus["EXPIRED"] = "expired";
|
|
26
|
+
KeyStatus["DELETED"] = "deleted";
|
|
27
|
+
})(KeyStatus || (exports.KeyStatus = KeyStatus = {}));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 项目相关类型定义
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ProjectStatus = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* 项目状态
|
|
9
|
+
*/
|
|
10
|
+
var ProjectStatus;
|
|
11
|
+
(function (ProjectStatus) {
|
|
12
|
+
ProjectStatus["ACTIVE"] = "active";
|
|
13
|
+
ProjectStatus["SUSPENDED"] = "suspended";
|
|
14
|
+
ProjectStatus["DELETED"] = "deleted";
|
|
15
|
+
})(ProjectStatus || (exports.ProjectStatus = ProjectStatus = {}));
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 用户相关类型定义
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.UserStatus = exports.Permission = exports.Role = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* 用户角色
|
|
9
|
+
*/
|
|
10
|
+
var Role;
|
|
11
|
+
(function (Role) {
|
|
12
|
+
Role["ADMIN"] = "admin";
|
|
13
|
+
Role["OPERATOR"] = "operator";
|
|
14
|
+
Role["DEVELOPER"] = "developer";
|
|
15
|
+
Role["READONLY"] = "readonly";
|
|
16
|
+
Role["AUDITOR"] = "auditor";
|
|
17
|
+
})(Role || (exports.Role = Role = {}));
|
|
18
|
+
/**
|
|
19
|
+
* 用户权限
|
|
20
|
+
*/
|
|
21
|
+
var Permission;
|
|
22
|
+
(function (Permission) {
|
|
23
|
+
// 项目管理
|
|
24
|
+
Permission["PROJECT_CREATE"] = "project:create";
|
|
25
|
+
Permission["PROJECT_UPDATE"] = "project:update";
|
|
26
|
+
Permission["PROJECT_DELETE"] = "project:delete";
|
|
27
|
+
// 密钥管理
|
|
28
|
+
Permission["KEY_CREATE"] = "key:create";
|
|
29
|
+
Permission["KEY_READ"] = "key:read";
|
|
30
|
+
Permission["KEY_UPDATE"] = "key:update";
|
|
31
|
+
Permission["KEY_DELETE"] = "key:delete";
|
|
32
|
+
Permission["KEY_LIST"] = "key:list";
|
|
33
|
+
// 用户管理
|
|
34
|
+
Permission["USER_CREATE"] = "user:create";
|
|
35
|
+
Permission["USER_UPDATE"] = "user:update";
|
|
36
|
+
Permission["USER_DELETE"] = "user:delete";
|
|
37
|
+
// 审计
|
|
38
|
+
Permission["AUDIT_READ"] = "audit:read";
|
|
39
|
+
})(Permission || (exports.Permission = Permission = {}));
|
|
40
|
+
/**
|
|
41
|
+
* 用户状态
|
|
42
|
+
*/
|
|
43
|
+
var UserStatus;
|
|
44
|
+
(function (UserStatus) {
|
|
45
|
+
UserStatus["ACTIVE"] = "active";
|
|
46
|
+
UserStatus["INACTIVE"] = "inactive";
|
|
47
|
+
UserStatus["LOCKED"] = "locked";
|
|
48
|
+
})(UserStatus || (exports.UserStatus = UserStatus = {}));
|