long-git-cli 1.0.12 → 1.0.15
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 +148 -0
- package/dist/commands/config.d.ts +9 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +33 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +413 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/tag.d.ts.map +1 -1
- package/dist/commands/tag.js +9 -7
- package/dist/commands/tag.js.map +1 -1
- package/dist/devops/api/bitbucket-client.d.ts +101 -0
- package/dist/devops/api/bitbucket-client.d.ts.map +1 -0
- package/dist/devops/api/bitbucket-client.js +335 -0
- package/dist/devops/api/bitbucket-client.js.map +1 -0
- package/dist/devops/api/jenkins-client.d.ts +110 -0
- package/dist/devops/api/jenkins-client.d.ts.map +1 -0
- package/dist/devops/api/jenkins-client.js +345 -0
- package/dist/devops/api/jenkins-client.js.map +1 -0
- package/dist/devops/config/config-manager.d.ts +96 -0
- package/dist/devops/config/config-manager.d.ts.map +1 -0
- package/dist/devops/config/config-manager.js +331 -0
- package/dist/devops/config/config-manager.js.map +1 -0
- package/dist/devops/config/encryption.d.ts +39 -0
- package/dist/devops/config/encryption.d.ts.map +1 -0
- package/dist/devops/config/encryption.js +133 -0
- package/dist/devops/config/encryption.js.map +1 -0
- package/dist/devops/config/storage.d.ts +37 -0
- package/dist/devops/config/storage.d.ts.map +1 -0
- package/dist/devops/config/storage.js +132 -0
- package/dist/devops/config/storage.js.map +1 -0
- package/dist/devops/constants.d.ts +51 -0
- package/dist/devops/constants.d.ts.map +1 -0
- package/dist/devops/constants.js +95 -0
- package/dist/devops/constants.js.map +1 -0
- package/dist/devops/deployer/full-deployer.d.ts +77 -0
- package/dist/devops/deployer/full-deployer.d.ts.map +1 -0
- package/dist/devops/deployer/full-deployer.js +221 -0
- package/dist/devops/deployer/full-deployer.js.map +1 -0
- package/dist/devops/deployer/jenkins-deployer.d.ts +55 -0
- package/dist/devops/deployer/jenkins-deployer.d.ts.map +1 -0
- package/dist/devops/deployer/jenkins-deployer.js +110 -0
- package/dist/devops/deployer/jenkins-deployer.js.map +1 -0
- package/dist/devops/monitor/pipeline-monitor.d.ts +52 -0
- package/dist/devops/monitor/pipeline-monitor.d.ts.map +1 -0
- package/dist/devops/monitor/pipeline-monitor.js +205 -0
- package/dist/devops/monitor/pipeline-monitor.js.map +1 -0
- package/dist/devops/test-ui.d.ts +6 -0
- package/dist/devops/test-ui.d.ts.map +1 -0
- package/dist/devops/test-ui.js +31 -0
- package/dist/devops/test-ui.js.map +1 -0
- package/dist/devops/types.d.ts +138 -0
- package/dist/devops/types.d.ts.map +1 -0
- package/dist/devops/types.js +20 -0
- package/dist/devops/types.js.map +1 -0
- package/dist/devops/ui/server.d.ts +53 -0
- package/dist/devops/ui/server.d.ts.map +1 -0
- package/dist/devops/ui/server.js +1310 -0
- package/dist/devops/ui/server.js.map +1 -0
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/jenkins-auto-login.d.ts +41 -0
- package/dist/utils/jenkins-auto-login.d.ts.map +1 -0
- package/dist/utils/jenkins-auto-login.js +189 -0
- package/dist/utils/jenkins-auto-login.js.map +1 -0
- package/dist/utils/message.d.ts +0 -2
- package/dist/utils/message.d.ts.map +1 -1
- package/dist/utils/message.js +7 -15
- package/dist/utils/message.js.map +1 -1
- package/dist/utils/tag.d.ts +65 -6
- package/dist/utils/tag.d.ts.map +1 -1
- package/dist/utils/tag.js +148 -14
- package/dist/utils/tag.js.map +1 -1
- package/package.json +20 -2
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 配置管理器
|
|
4
|
+
* 管理所有配置数据的读取、写入、验证和加密
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.ConfigManager = void 0;
|
|
41
|
+
const storage_1 = require("./storage");
|
|
42
|
+
const encryption_1 = require("./encryption");
|
|
43
|
+
const constants_1 = require("../constants");
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
/**
|
|
46
|
+
* ConfigManager 类
|
|
47
|
+
* 负责配置的 CRUD 操作
|
|
48
|
+
*/
|
|
49
|
+
class ConfigManager {
|
|
50
|
+
constructor(storage) {
|
|
51
|
+
/** 内存缓存(用于存储明文密码,仅在运行时有效) */
|
|
52
|
+
this.credentialsCache = {
|
|
53
|
+
jenkinsTokens: new Map(),
|
|
54
|
+
};
|
|
55
|
+
this.storage = storage || new storage_1.Storage();
|
|
56
|
+
this.configFilename = path.basename(constants_1.CONFIG_FILE);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 加载配置
|
|
60
|
+
*/
|
|
61
|
+
async loadConfig() {
|
|
62
|
+
const config = await this.storage.read(this.configFilename);
|
|
63
|
+
if (!config) {
|
|
64
|
+
/** 返回默认配置 */
|
|
65
|
+
return this.getDefaultConfig();
|
|
66
|
+
}
|
|
67
|
+
return config;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 保存配置(不验证完整性)
|
|
71
|
+
* 用于部分更新配置
|
|
72
|
+
*/
|
|
73
|
+
async saveConfigWithoutValidation(config) {
|
|
74
|
+
await this.storage.write(this.configFilename, config);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 保存配置
|
|
78
|
+
*/
|
|
79
|
+
async saveConfig(config) {
|
|
80
|
+
/** 验证配置 */
|
|
81
|
+
const isValid = await this.validateConfig(config);
|
|
82
|
+
if (!isValid) {
|
|
83
|
+
throw new Error("配置验证失败");
|
|
84
|
+
}
|
|
85
|
+
await this.storage.write(this.configFilename, config);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 验证配置完整性
|
|
89
|
+
*/
|
|
90
|
+
async validateConfig(config) {
|
|
91
|
+
try {
|
|
92
|
+
/** 检查必需字段 */
|
|
93
|
+
if (!config.version) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
/** 检查 Bitbucket 配置 */
|
|
97
|
+
if (!config.bitbucket?.username) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
// 兼容新旧两种 token 格式
|
|
101
|
+
if (!config.bitbucket?.apiTokenHash && !config.bitbucket?.appPasswordHash) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
/** 检查至少有一个 Jenkins 实例 */
|
|
105
|
+
if (!config.jenkins || config.jenkins.length === 0) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
/** 检查每个 Jenkins 实例的配置 */
|
|
109
|
+
for (const jenkins of config.jenkins) {
|
|
110
|
+
if (!jenkins.type ||
|
|
111
|
+
!jenkins.url ||
|
|
112
|
+
!jenkins.username ||
|
|
113
|
+
!jenkins.apiTokenHash) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** 检查至少有一个项目配置 */
|
|
118
|
+
const projectPaths = Object.keys(config.projects || {});
|
|
119
|
+
if (projectPaths.length === 0) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
/** 检查每个项目至少有一个环境 */
|
|
123
|
+
for (const projectPath of projectPaths) {
|
|
124
|
+
const project = config.projects[projectPath];
|
|
125
|
+
const envs = Object.keys(project.environments || {});
|
|
126
|
+
if (envs.length === 0) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 获取项目配置
|
|
138
|
+
*/
|
|
139
|
+
async getProjectConfig(projectPath) {
|
|
140
|
+
const config = await this.loadConfig();
|
|
141
|
+
return config.projects[projectPath] || null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 更新项目配置
|
|
145
|
+
*/
|
|
146
|
+
async updateProjectConfig(projectPath, projectConfig) {
|
|
147
|
+
const config = await this.loadConfig();
|
|
148
|
+
config.projects[projectPath] = projectConfig;
|
|
149
|
+
// 使用不验证的保存方法,允许部分配置
|
|
150
|
+
await this.saveConfigWithoutValidation(config);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 删除项目配置
|
|
154
|
+
*/
|
|
155
|
+
async deleteProjectConfig(projectPath) {
|
|
156
|
+
const config = await this.loadConfig();
|
|
157
|
+
delete config.projects[projectPath];
|
|
158
|
+
// 使用不验证的保存方法,允许部分配置
|
|
159
|
+
await this.saveConfigWithoutValidation(config);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 加密 Token
|
|
163
|
+
*/
|
|
164
|
+
async encryptToken(token) {
|
|
165
|
+
return encryption_1.Encryption.encrypt(token);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 解密 Token
|
|
169
|
+
*/
|
|
170
|
+
decryptToken(encryptedToken) {
|
|
171
|
+
return encryption_1.Encryption.decrypt(encryptedToken);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 验证 Token
|
|
175
|
+
* @deprecated 不再需要,直接解密使用
|
|
176
|
+
*/
|
|
177
|
+
async verifyToken(token, hash) {
|
|
178
|
+
return encryption_1.Encryption.verify(token, hash);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 更新 Bitbucket 配置
|
|
182
|
+
* @param username Bitbucket 用户名
|
|
183
|
+
* @param token API Token 或 App Password(兼容旧版)
|
|
184
|
+
*/
|
|
185
|
+
async updateBitbucketConfig(username, token) {
|
|
186
|
+
const config = await this.loadConfig();
|
|
187
|
+
const tokenHash = await this.encryptToken(token);
|
|
188
|
+
config.bitbucket = {
|
|
189
|
+
username,
|
|
190
|
+
apiTokenHash: tokenHash,
|
|
191
|
+
// 保留旧字段以兼容
|
|
192
|
+
appPasswordHash: tokenHash,
|
|
193
|
+
};
|
|
194
|
+
/** 缓存明文 token */
|
|
195
|
+
this.credentialsCache.bitbucketPassword = token;
|
|
196
|
+
// 使用不验证的保存方法,允许部分配置
|
|
197
|
+
await this.saveConfigWithoutValidation(config);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 获取 Bitbucket 明文密码
|
|
201
|
+
* 优先从缓存获取,如果没有则从配置文件解密
|
|
202
|
+
*/
|
|
203
|
+
async getBitbucketPassword() {
|
|
204
|
+
// 先尝试从缓存获取
|
|
205
|
+
if (this.credentialsCache.bitbucketPassword) {
|
|
206
|
+
return this.credentialsCache.bitbucketPassword;
|
|
207
|
+
}
|
|
208
|
+
// 从配置文件解密
|
|
209
|
+
const config = await this.loadConfig();
|
|
210
|
+
const encryptedToken = config.bitbucket.apiTokenHash || config.bitbucket.appPasswordHash;
|
|
211
|
+
if (encryptedToken) {
|
|
212
|
+
try {
|
|
213
|
+
const decrypted = this.decryptToken(encryptedToken);
|
|
214
|
+
// 缓存到内存
|
|
215
|
+
this.credentialsCache.bitbucketPassword = decrypted;
|
|
216
|
+
return decrypted;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error('解密 Bitbucket token 失败:', error);
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 更新 Jenkins 配置
|
|
227
|
+
*/
|
|
228
|
+
async updateJenkinsConfig(jenkinsConfigs) {
|
|
229
|
+
const config = await this.loadConfig();
|
|
230
|
+
config.jenkins = jenkinsConfigs;
|
|
231
|
+
// 使用不验证的保存方法,允许部分配置
|
|
232
|
+
await this.saveConfigWithoutValidation(config);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* 添加 Jenkins 实例
|
|
236
|
+
*/
|
|
237
|
+
async addJenkinsInstance(type, url, username, apiToken) {
|
|
238
|
+
const config = await this.loadConfig();
|
|
239
|
+
const apiTokenHash = await this.encryptToken(apiToken);
|
|
240
|
+
const newJenkins = {
|
|
241
|
+
type,
|
|
242
|
+
url,
|
|
243
|
+
username,
|
|
244
|
+
apiTokenHash,
|
|
245
|
+
};
|
|
246
|
+
/** 检查是否已存在相同类型的实例 */
|
|
247
|
+
const existingIndex = config.jenkins.findIndex((j) => j.type === type);
|
|
248
|
+
if (existingIndex >= 0) {
|
|
249
|
+
/** 更新现有实例 */
|
|
250
|
+
config.jenkins[existingIndex] = newJenkins;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
/** 添加新实例 */
|
|
254
|
+
config.jenkins.push(newJenkins);
|
|
255
|
+
}
|
|
256
|
+
/** 缓存明文 token */
|
|
257
|
+
this.credentialsCache.jenkinsTokens?.set(type, apiToken);
|
|
258
|
+
// 使用不验证的保存方法,允许部分配置
|
|
259
|
+
await this.saveConfigWithoutValidation(config);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* 获取 Jenkins 明文 token
|
|
263
|
+
* 优先从缓存获取,如果没有则从配置文件解密
|
|
264
|
+
*/
|
|
265
|
+
async getJenkinsToken(type) {
|
|
266
|
+
// 先尝试从缓存获取
|
|
267
|
+
const cached = this.credentialsCache.jenkinsTokens?.get(type);
|
|
268
|
+
if (cached) {
|
|
269
|
+
return cached;
|
|
270
|
+
}
|
|
271
|
+
// 从配置文件解密
|
|
272
|
+
const config = await this.loadConfig();
|
|
273
|
+
const jenkinsConfig = config.jenkins.find((j) => j.type === type);
|
|
274
|
+
if (jenkinsConfig?.apiTokenHash) {
|
|
275
|
+
try {
|
|
276
|
+
const decrypted = this.decryptToken(jenkinsConfig.apiTokenHash);
|
|
277
|
+
// 缓存到内存
|
|
278
|
+
this.credentialsCache.jenkinsTokens?.set(type, decrypted);
|
|
279
|
+
return decrypted;
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
console.error(`解密 Jenkins ${type} token 失败:`, error);
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* 更新部署状态
|
|
290
|
+
*/
|
|
291
|
+
async updateDeployStatus(projectPath, environment, status) {
|
|
292
|
+
const config = await this.loadConfig();
|
|
293
|
+
const project = config.projects[projectPath];
|
|
294
|
+
if (!project) {
|
|
295
|
+
throw new Error(`项目不存在: ${projectPath}`);
|
|
296
|
+
}
|
|
297
|
+
const env = project.environments[environment];
|
|
298
|
+
if (!env) {
|
|
299
|
+
throw new Error(`环境不存在: ${environment}`);
|
|
300
|
+
}
|
|
301
|
+
// 更新部署状态
|
|
302
|
+
env.deployStatus = {
|
|
303
|
+
...env.deployStatus,
|
|
304
|
+
...status,
|
|
305
|
+
lastUpdated: new Date().toISOString(),
|
|
306
|
+
};
|
|
307
|
+
await this.saveConfigWithoutValidation(config);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* 获取默认配置
|
|
311
|
+
*/
|
|
312
|
+
getDefaultConfig() {
|
|
313
|
+
return {
|
|
314
|
+
version: constants_1.CONFIG_VERSION,
|
|
315
|
+
projects: {},
|
|
316
|
+
bitbucket: {
|
|
317
|
+
username: "",
|
|
318
|
+
apiTokenHash: "",
|
|
319
|
+
},
|
|
320
|
+
jenkins: [],
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* 检查配置文件是否存在
|
|
325
|
+
*/
|
|
326
|
+
async configExists() {
|
|
327
|
+
return this.storage.exists(this.configFilename);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
exports.ConfigManager = ConfigManager;
|
|
331
|
+
//# sourceMappingURL=config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/devops/config/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 加密模块
|
|
3
|
+
* 使用 AES-256-GCM 进行可逆加密
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 加密类
|
|
7
|
+
*/
|
|
8
|
+
export declare class Encryption {
|
|
9
|
+
private static readonly ENCRYPTION_KEY;
|
|
10
|
+
/**
|
|
11
|
+
* 加密文本
|
|
12
|
+
* @param text 明文
|
|
13
|
+
* @returns 加密后的文本(格式:iv:encryptedData:authTag)
|
|
14
|
+
*/
|
|
15
|
+
static encrypt(text: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* 解密文本
|
|
18
|
+
* @param encryptedText 加密的文本(格式:iv:encryptedData:authTag)
|
|
19
|
+
* @returns 明文
|
|
20
|
+
*/
|
|
21
|
+
static decrypt(encryptedText: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* 验证加密文本是否有效
|
|
24
|
+
* @param encryptedText 加密的文本
|
|
25
|
+
* @returns 是否有效
|
|
26
|
+
*/
|
|
27
|
+
static isValid(encryptedText: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 兼容旧版本:hash 方法(现在直接调用 encrypt)
|
|
30
|
+
* @deprecated 使用 encrypt 代替
|
|
31
|
+
*/
|
|
32
|
+
static hash(text: string): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* 兼容旧版本:verify 方法(现在通过解密比较)
|
|
35
|
+
* @deprecated 不再需要验证,直接解密使用
|
|
36
|
+
*/
|
|
37
|
+
static verify(text: string, hash: string): Promise<boolean>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../../src/devops/config/encryption.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,qBAAa,UAAU;IAGrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAG1B;IAEZ;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAsBpC;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IA8B7C;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAS9C;;;OAGG;WACU,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhD;;;OAGG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQlE"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 加密模块
|
|
4
|
+
* 使用 AES-256-GCM 进行可逆加密
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.Encryption = void 0;
|
|
41
|
+
const crypto = __importStar(require("crypto"));
|
|
42
|
+
/**
|
|
43
|
+
* 加密类
|
|
44
|
+
*/
|
|
45
|
+
class Encryption {
|
|
46
|
+
/**
|
|
47
|
+
* 加密文本
|
|
48
|
+
* @param text 明文
|
|
49
|
+
* @returns 加密后的文本(格式:iv:encryptedData:authTag)
|
|
50
|
+
*/
|
|
51
|
+
static encrypt(text) {
|
|
52
|
+
// 生成随机 IV
|
|
53
|
+
const iv = crypto.randomBytes(16);
|
|
54
|
+
// 创建加密器
|
|
55
|
+
const cipher = crypto.createCipheriv("aes-256-gcm", this.ENCRYPTION_KEY, iv);
|
|
56
|
+
// 加密数据
|
|
57
|
+
let encrypted = cipher.update(text, "utf8", "hex");
|
|
58
|
+
encrypted += cipher.final("hex");
|
|
59
|
+
// 获取认证标签
|
|
60
|
+
const authTag = cipher.getAuthTag();
|
|
61
|
+
// 返回格式:iv:encryptedData:authTag
|
|
62
|
+
return `${iv.toString("hex")}:${encrypted}:${authTag.toString("hex")}`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 解密文本
|
|
66
|
+
* @param encryptedText 加密的文本(格式:iv:encryptedData:authTag)
|
|
67
|
+
* @returns 明文
|
|
68
|
+
*/
|
|
69
|
+
static decrypt(encryptedText) {
|
|
70
|
+
try {
|
|
71
|
+
// 分割加密数据
|
|
72
|
+
const parts = encryptedText.split(":");
|
|
73
|
+
if (parts.length !== 3) {
|
|
74
|
+
throw new Error("Invalid encrypted text format");
|
|
75
|
+
}
|
|
76
|
+
const iv = Buffer.from(parts[0], "hex");
|
|
77
|
+
const encrypted = parts[1];
|
|
78
|
+
const authTag = Buffer.from(parts[2], "hex");
|
|
79
|
+
// 创建解密器
|
|
80
|
+
const decipher = crypto.createDecipheriv("aes-256-gcm", this.ENCRYPTION_KEY, iv);
|
|
81
|
+
decipher.setAuthTag(authTag);
|
|
82
|
+
// 解密数据
|
|
83
|
+
let decrypted = decipher.update(encrypted, "hex", "utf8");
|
|
84
|
+
decrypted += decipher.final("utf8");
|
|
85
|
+
return decrypted;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`Decryption failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 验证加密文本是否有效
|
|
93
|
+
* @param encryptedText 加密的文本
|
|
94
|
+
* @returns 是否有效
|
|
95
|
+
*/
|
|
96
|
+
static isValid(encryptedText) {
|
|
97
|
+
try {
|
|
98
|
+
this.decrypt(encryptedText);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 兼容旧版本:hash 方法(现在直接调用 encrypt)
|
|
107
|
+
* @deprecated 使用 encrypt 代替
|
|
108
|
+
*/
|
|
109
|
+
static async hash(text) {
|
|
110
|
+
return this.encrypt(text);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 兼容旧版本:verify 方法(现在通过解密比较)
|
|
114
|
+
* @deprecated 不再需要验证,直接解密使用
|
|
115
|
+
*/
|
|
116
|
+
static async verify(text, hash) {
|
|
117
|
+
try {
|
|
118
|
+
const decrypted = this.decrypt(hash);
|
|
119
|
+
return decrypted === text;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.Encryption = Encryption;
|
|
127
|
+
// 加密密钥(实际应用中应该从环境变量或用户输入获取)
|
|
128
|
+
// 这里使用固定密钥,因为是本地存储
|
|
129
|
+
Encryption.ENCRYPTION_KEY = crypto
|
|
130
|
+
.createHash("sha256")
|
|
131
|
+
.update("long-cli-encryption-key-v1")
|
|
132
|
+
.digest();
|
|
133
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../../src/devops/config/encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地存储模块
|
|
3
|
+
* 处理本地 JSON 文件的读写操作
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Storage 类
|
|
7
|
+
* 负责本地文件的读写操作
|
|
8
|
+
*/
|
|
9
|
+
export declare class Storage {
|
|
10
|
+
private storagePath;
|
|
11
|
+
constructor(storagePath?: string);
|
|
12
|
+
/**
|
|
13
|
+
* 读取文件
|
|
14
|
+
*/
|
|
15
|
+
read<T>(filename: string): Promise<T | null>;
|
|
16
|
+
/**
|
|
17
|
+
* 写入文件
|
|
18
|
+
*/
|
|
19
|
+
write<T>(filename: string, data: T): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* 检查文件是否存在
|
|
22
|
+
*/
|
|
23
|
+
exists(filename: string): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* 删除文件
|
|
26
|
+
*/
|
|
27
|
+
delete(filename: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* 获取存储路径
|
|
30
|
+
*/
|
|
31
|
+
getStoragePath(): string;
|
|
32
|
+
/**
|
|
33
|
+
* 确保目录存在
|
|
34
|
+
*/
|
|
35
|
+
private ensureDir;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/devops/config/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,GAAE,MAAmB;IAI5C;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAclD;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxD;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhD;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;YACW,SAAS;CAOxB"}
|