@catladder/cli 1.135.0 → 1.136.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/bin/catci +3 -0
- package/bin/catci-dev +3 -0
- package/dist/apps/catci/catci.d.ts +1 -0
- package/dist/apps/catci/catci.js +71 -0
- package/dist/apps/catci/catci.js.map +1 -0
- package/dist/apps/catci/commands/security/auditDocument.d.ts +19 -0
- package/dist/apps/catci/commands/security/auditDocument.js +90 -0
- package/dist/apps/catci/commands/security/auditDocument.js.map +1 -0
- package/dist/apps/catci/commands/security/commands.d.ts +2 -0
- package/dist/apps/catci/commands/security/commands.js +175 -0
- package/dist/apps/catci/commands/security/commands.js.map +1 -0
- package/dist/apps/catci/commands/security/createSecurityAuditMergeRequest.d.ts +9 -0
- package/dist/apps/catci/commands/security/createSecurityAuditMergeRequest.js +112 -0
- package/dist/apps/catci/commands/security/createSecurityAuditMergeRequest.js.map +1 -0
- package/dist/apps/catci/commands/security/evaluateSecurityAudit.d.ts +5 -0
- package/dist/apps/catci/commands/security/evaluateSecurityAudit.js +76 -0
- package/dist/apps/catci/commands/security/evaluateSecurityAudit.js.map +1 -0
- package/dist/apps/catci/commands/security/topics.json +112 -0
- package/dist/apps/cli/commands/project/commandSecurityEvaluate.d.ts +3 -0
- package/dist/apps/cli/commands/project/commandSecurityEvaluate.js +70 -0
- package/dist/apps/cli/commands/project/commandSecurityEvaluate.js.map +1 -0
- package/dist/apps/cli/commands/project/index.js +2 -0
- package/dist/apps/cli/commands/project/index.js.map +1 -1
- package/dist/bundles/catci/index.js +41 -0
- package/dist/bundles/catenv/index.js +1 -1
- package/dist/bundles/cli/index.js +3 -3
- package/dist/catci.d.ts +1 -0
- package/dist/catci.js +5 -0
- package/dist/catci.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -5
- package/scripts/bundle +2 -0
- package/src/apps/catci/catci.ts +20 -0
- package/src/apps/catci/commands/security/auditDocument.ts +150 -0
- package/src/apps/catci/commands/security/commands.ts +146 -0
- package/src/apps/catci/commands/security/createSecurityAuditMergeRequest.ts +98 -0
- package/src/apps/catci/commands/security/evaluateSecurityAudit.ts +30 -0
- package/src/apps/catci/commands/security/topics.json +120 -0
- package/src/apps/cli/commands/project/commandSecurityEvaluate.ts +26 -0
- package/src/apps/cli/commands/project/index.ts +2 -0
- package/src/catci.ts +3 -0
package/bin/catci
ADDED
package/bin/catci-dev
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCatCi(): Promise<void>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
exports.__esModule = true;
|
|
42
|
+
exports.runCatCi = void 0;
|
|
43
|
+
var vorpal_1 = __importDefault(require("vorpal"));
|
|
44
|
+
var packageInfos_1 = __importDefault(require("../../packageInfos"));
|
|
45
|
+
var commands_1 = __importDefault(require("./commands/security/commands"));
|
|
46
|
+
function runCatCi() {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48
|
+
var vorpal, isInteractive;
|
|
49
|
+
return __generator(this, function (_a) {
|
|
50
|
+
switch (_a.label) {
|
|
51
|
+
case 0:
|
|
52
|
+
vorpal = new vorpal_1["default"]();
|
|
53
|
+
process.exitCode = 0;
|
|
54
|
+
vorpal.delimiter("catci $").history("catci").version(packageInfos_1["default"].version);
|
|
55
|
+
(0, commands_1["default"])(vorpal);
|
|
56
|
+
isInteractive = process.argv.length <= 2;
|
|
57
|
+
if (!isInteractive) return [3 /*break*/, 1];
|
|
58
|
+
vorpal.log("Catladder CI Tools \uD83D\uDE3B\uD83D\uDD28 version ".concat(packageInfos_1["default"].version)).show();
|
|
59
|
+
return [3 /*break*/, 3];
|
|
60
|
+
case 1: return [4 /*yield*/, vorpal.exec(process.argv.slice(2).join(" "))];
|
|
61
|
+
case 2:
|
|
62
|
+
_a.sent();
|
|
63
|
+
process.exit();
|
|
64
|
+
_a.label = 3;
|
|
65
|
+
case 3: return [2 /*return*/];
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
exports.runCatCi = runCatCi;
|
|
71
|
+
//# sourceMappingURL=catci.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catci.js","sourceRoot":"","sources":["../../../src/apps/catci/catci.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA4B;AAC5B,oEAA6C;AAC7C,0EAA4D;AAE5D,SAAsB,QAAQ;;;;;;oBACtB,MAAM,GAAG,IAAI,mBAAM,EAAE,CAAC;oBAE5B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,yBAAW,CAAC,OAAO,CAAC,CAAC;oBAE1E,IAAA,qBAAgB,EAAC,MAAM,CAAC,CAAC;oBAEnB,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;yBAC3C,aAAa,EAAb,wBAAa;oBACf,MAAM,CAAC,GAAG,CAAC,8DAAmC,yBAAW,CAAC,OAAO,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC;;wBAE5E,qBAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAA;;oBAAlD,SAAkD,CAAC;oBACnD,OAAO,CAAC,IAAI,EAAE,CAAC;;;;;;CAElB;AAfD,4BAeC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function makeTemplate(): string;
|
|
2
|
+
export declare type SecurityEvaluation = {
|
|
3
|
+
topics: {
|
|
4
|
+
description: string;
|
|
5
|
+
responsibles: string[];
|
|
6
|
+
note: string;
|
|
7
|
+
isUnknown: boolean;
|
|
8
|
+
isAnswered: boolean;
|
|
9
|
+
isSecured: boolean;
|
|
10
|
+
}[];
|
|
11
|
+
score: {
|
|
12
|
+
rating: number;
|
|
13
|
+
totalTopics: number;
|
|
14
|
+
answeredTopics: number;
|
|
15
|
+
securedTopics: number;
|
|
16
|
+
unknownTopics: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export declare function evaluateDocument(document: string): SecurityEvaluation;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.evaluateDocument = exports.makeTemplate = void 0;
|
|
7
|
+
var topics_json_1 = __importDefault(require("./topics.json"));
|
|
8
|
+
var allTopics = topics_json_1["default"];
|
|
9
|
+
var checkYes = "✅";
|
|
10
|
+
var checkNo = "❌";
|
|
11
|
+
var checkPlaceholder = "".concat(checkYes, "/").concat(checkNo);
|
|
12
|
+
var responsiblePlaceholder = "@...";
|
|
13
|
+
var rows = [
|
|
14
|
+
["Responsible", checkPlaceholder, "Description", "Note", "More Information"],
|
|
15
|
+
].concat(allTopics.map(function (t) { return [
|
|
16
|
+
Array(t.responsibles).fill(responsiblePlaceholder).join(", "),
|
|
17
|
+
checkPlaceholder,
|
|
18
|
+
t.description,
|
|
19
|
+
"",
|
|
20
|
+
t.more,
|
|
21
|
+
]; }));
|
|
22
|
+
function makeTable(rows) {
|
|
23
|
+
var colWidths = calculateColumnWidths(rows);
|
|
24
|
+
return "\n".concat(makeRow(rows[0], colWidths, " "), "\n").concat(makeRow(rows[0].map(function () { return ""; }), colWidths, "-"), "\n").concat(rows
|
|
25
|
+
.slice(1)
|
|
26
|
+
.map(function (row) { return makeRow(row, colWidths, " "); })
|
|
27
|
+
.join("\n"), "\n");
|
|
28
|
+
}
|
|
29
|
+
function calculateColumnWidths(rows) {
|
|
30
|
+
var columnCount = rows[0].length;
|
|
31
|
+
return Array.from({ length: columnCount }, function (_, i) { return i; }).map(function (columnIndex) {
|
|
32
|
+
return Math.max.apply(Math, rows.map(function (row) { return row[columnIndex].length; }));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function makeRow(row, colWidths, fillString) {
|
|
36
|
+
return "| ".concat(row
|
|
37
|
+
.map(function (cell, i) { return cell.padEnd(colWidths[i], fillString); })
|
|
38
|
+
.join(" | "), " |");
|
|
39
|
+
}
|
|
40
|
+
function makeTemplate() {
|
|
41
|
+
return "\n# Security Audit Report\n\nA security audit report document is a comprehensive assessment of an application's security posture, containing security topics that auditors can mark to indicate the state of various security aspects.\n\nIt serves as a structured guide for security team to evaluate different security factors such as authentication, authorization, data encryption, input validation, and more.\n\n## General Information\n\n- Project Owner is @...\n- Dev team:\n - @...\n - @...\n - @...\n\n## Project Security\n\n".concat(makeTable(rows), "\n\n");
|
|
42
|
+
}
|
|
43
|
+
exports.makeTemplate = makeTemplate;
|
|
44
|
+
function evaluateDocument(document) {
|
|
45
|
+
var _a, _b;
|
|
46
|
+
var rawRows = (_b = (_a = document.match(/^\s*\|.*?\|\s*$/gm)) === null || _a === void 0 ? void 0 : _a.map(function (row) { return row.trim(); })) !== null && _b !== void 0 ? _b : [];
|
|
47
|
+
var matchedRows = rawRows
|
|
48
|
+
.map(function (row) { return row.split("|").map(function (col) { return col.trim(); }); })
|
|
49
|
+
.slice(2);
|
|
50
|
+
var knownTopics = new Set(allTopics.map(function (t) { return t.description; }));
|
|
51
|
+
var topics = matchedRows.map(function (col) {
|
|
52
|
+
var responsibles = col[1].split(", ");
|
|
53
|
+
var answer = col[2];
|
|
54
|
+
var description = col[3];
|
|
55
|
+
var note = col[4];
|
|
56
|
+
var isUnknown = !knownTopics.has(description);
|
|
57
|
+
var isAnswered = !isUnknown &&
|
|
58
|
+
!answer.includes(checkPlaceholder) &&
|
|
59
|
+
!responsibles.some(function (responsible) {
|
|
60
|
+
return responsible.includes(responsiblePlaceholder);
|
|
61
|
+
});
|
|
62
|
+
var isSecured = !isUnknown && isAnswered && answer.includes(checkYes);
|
|
63
|
+
return {
|
|
64
|
+
responsibles: responsibles,
|
|
65
|
+
answer: answer,
|
|
66
|
+
description: description,
|
|
67
|
+
note: note,
|
|
68
|
+
isUnknown: isUnknown,
|
|
69
|
+
isAnswered: isAnswered,
|
|
70
|
+
isSecured: isSecured
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
var totalTopics = allTopics.length;
|
|
74
|
+
var answeredTopics = topics.filter(function (t) { return t.isAnswered; }).length;
|
|
75
|
+
var securedTopics = topics.filter(function (t) { return t.isSecured; }).length;
|
|
76
|
+
var unknownTopics = topics.filter(function (t) { return t.isUnknown; }).length;
|
|
77
|
+
var rating = Math.round((securedTopics / totalTopics) * 100);
|
|
78
|
+
return {
|
|
79
|
+
topics: topics,
|
|
80
|
+
score: {
|
|
81
|
+
rating: rating,
|
|
82
|
+
totalTopics: totalTopics,
|
|
83
|
+
answeredTopics: answeredTopics,
|
|
84
|
+
securedTopics: securedTopics,
|
|
85
|
+
unknownTopics: unknownTopics
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
exports.evaluateDocument = evaluateDocument;
|
|
90
|
+
//# sourceMappingURL=auditDocument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditDocument.js","sourceRoot":"","sources":["../../../../../src/apps/catci/commands/security/auditDocument.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.__esModule = true;
|
|
39
|
+
var evaluateSecurityAudit_1 = require("./evaluateSecurityAudit");
|
|
40
|
+
var rest_1 = require("@gitbeaker/rest");
|
|
41
|
+
var createSecurityAuditMergeRequest_1 = require("./createSecurityAuditMergeRequest");
|
|
42
|
+
var GITLAB_HOST = "https://git.panter.ch";
|
|
43
|
+
function default_1(vorpal) {
|
|
44
|
+
commandCiJob(vorpal);
|
|
45
|
+
commandEvaluate(vorpal);
|
|
46
|
+
commandCreate(vorpal);
|
|
47
|
+
}
|
|
48
|
+
exports["default"] = default_1;
|
|
49
|
+
function commandCiJob(vorpal) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
51
|
+
var _this = this;
|
|
52
|
+
return __generator(this, function (_a) {
|
|
53
|
+
vorpal
|
|
54
|
+
.command("security-audit-ci-job <path> <token> <mainBranch> <projectId> <userId>", "Evaluates security audit document. If the document can't be evaluated or does not exist, creates a new MR with security audit document template.\n\n<path> root path of a project with security audit document (".concat(createSecurityAuditMergeRequest_1.SECURITY_AUDIT_FILE_NAME, ")\n<token> gitlab token with 'api' scopes and permissions to create a new branch\n<main-branch> main branch name\n<project-id> project id to create security audit for\n<user-id> gitlab user id that will be assignee of the audit\n"))
|
|
55
|
+
.action(function (args) { return __awaiter(_this, void 0, void 0, function () {
|
|
56
|
+
var evaluation, token, mainBranch, projectId, userId, api, mr;
|
|
57
|
+
return __generator(this, function (_a) {
|
|
58
|
+
switch (_a.label) {
|
|
59
|
+
case 0: return [4 /*yield*/, (0, evaluateSecurityAudit_1.evaluateSecurityAudit)({ path: args.path })];
|
|
60
|
+
case 1:
|
|
61
|
+
evaluation = _a.sent();
|
|
62
|
+
if (!evaluation.isErr()) return [3 /*break*/, 3];
|
|
63
|
+
console.log("could not evaluate security audit document");
|
|
64
|
+
console.log("creating new merge request with security audit template...");
|
|
65
|
+
token = args.token, mainBranch = args.mainBranch, projectId = args.projectId, userId = args.userId;
|
|
66
|
+
api = new rest_1.Gitlab({
|
|
67
|
+
host: GITLAB_HOST,
|
|
68
|
+
token: token
|
|
69
|
+
});
|
|
70
|
+
return [4 /*yield*/, (0, createSecurityAuditMergeRequest_1.createSecurityAuditMergeRequest)({
|
|
71
|
+
api: api,
|
|
72
|
+
mainBranch: mainBranch,
|
|
73
|
+
projectId: projectId,
|
|
74
|
+
userId: parseInt(userId)
|
|
75
|
+
})];
|
|
76
|
+
case 2:
|
|
77
|
+
mr = _a.sent();
|
|
78
|
+
if (mr.isErr()) {
|
|
79
|
+
console.error("could not create merge request with security audit template: ".concat(mr.error));
|
|
80
|
+
process.exitCode = 1;
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
console.log("security audit merge request created successfully");
|
|
84
|
+
console.log("please finish the MR by updating SECURITY.md document: ".concat(mr.value.web_url));
|
|
85
|
+
process.exitCode = 1;
|
|
86
|
+
return [2 /*return*/];
|
|
87
|
+
case 3:
|
|
88
|
+
if (evaluation.value.score.answeredTopics === 0) {
|
|
89
|
+
console.error("audit document has no answered topics");
|
|
90
|
+
console.error("please answer security topics in ".concat(createSecurityAuditMergeRequest_1.SECURITY_AUDIT_FILE_NAME, " by adding responsible people and check/cross in the table"));
|
|
91
|
+
process.exitCode = 1;
|
|
92
|
+
return [2 /*return*/];
|
|
93
|
+
}
|
|
94
|
+
process.exitCode = 0;
|
|
95
|
+
console.log((0, evaluateSecurityAudit_1.makeSecurityAuditOverview)(evaluation.value));
|
|
96
|
+
return [2 /*return*/];
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}); });
|
|
100
|
+
return [2 /*return*/];
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function commandEvaluate(vorpal) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
106
|
+
var _this = this;
|
|
107
|
+
return __generator(this, function (_a) {
|
|
108
|
+
vorpal
|
|
109
|
+
.command("security-audit-evaluate <path>", "Evaluates security audit document in given <path>")
|
|
110
|
+
.action(function (args) { return __awaiter(_this, void 0, void 0, function () {
|
|
111
|
+
var result;
|
|
112
|
+
return __generator(this, function (_a) {
|
|
113
|
+
switch (_a.label) {
|
|
114
|
+
case 0:
|
|
115
|
+
console.log("evaluating security audit document...");
|
|
116
|
+
return [4 /*yield*/, (0, evaluateSecurityAudit_1.evaluateSecurityAudit)({ path: args.path })];
|
|
117
|
+
case 1:
|
|
118
|
+
result = _a.sent();
|
|
119
|
+
if (result.isErr()) {
|
|
120
|
+
console.error(result.error);
|
|
121
|
+
console.error("please make sure the security audit document ".concat(createSecurityAuditMergeRequest_1.SECURITY_AUDIT_FILE_NAME, " is in the repository"));
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
console.log((0, evaluateSecurityAudit_1.makeSecurityAuditOverview)(result.value));
|
|
126
|
+
}
|
|
127
|
+
return [2 /*return*/];
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}); });
|
|
131
|
+
return [2 /*return*/];
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function commandCreate(vorpal) {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
137
|
+
var _this = this;
|
|
138
|
+
return __generator(this, function (_a) {
|
|
139
|
+
vorpal
|
|
140
|
+
.command("security-audit-create <token> <mainBranch> <projectId> <userId>", "Creates a MR in given project with the latest security audit template document\n\n<token> gitlab token with 'api' scopes and permissions to create a new branch\n<main-branch> main branch name\n<project-id> project id to create security audit for\n<user-id> gitlab user id that will be assignee of the audit\n")
|
|
141
|
+
.action(function (args) { return __awaiter(_this, void 0, void 0, function () {
|
|
142
|
+
var token, mainBranch, projectId, userId, api, result;
|
|
143
|
+
return __generator(this, function (_a) {
|
|
144
|
+
switch (_a.label) {
|
|
145
|
+
case 0:
|
|
146
|
+
token = args.token, mainBranch = args.mainBranch, projectId = args.projectId, userId = args.userId;
|
|
147
|
+
api = new rest_1.Gitlab({
|
|
148
|
+
host: GITLAB_HOST,
|
|
149
|
+
token: token
|
|
150
|
+
});
|
|
151
|
+
return [4 /*yield*/, (0, createSecurityAuditMergeRequest_1.createSecurityAuditMergeRequest)({
|
|
152
|
+
api: api,
|
|
153
|
+
mainBranch: mainBranch,
|
|
154
|
+
projectId: projectId,
|
|
155
|
+
userId: parseInt(userId)
|
|
156
|
+
})];
|
|
157
|
+
case 1:
|
|
158
|
+
result = _a.sent();
|
|
159
|
+
if (result.isErr()) {
|
|
160
|
+
console.error("could not create security audit merge request: ".concat(result.error));
|
|
161
|
+
process.exitCode = 1;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
console.log("security audit merge request created successfully");
|
|
165
|
+
console.log("please finish the MR by updating SECURITY.md document: ".concat(result.value.web_url));
|
|
166
|
+
}
|
|
167
|
+
return [2 /*return*/];
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}); });
|
|
171
|
+
return [2 /*return*/];
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/apps/catci/commands/security/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Gitlab } from "@gitbeaker/core";
|
|
2
|
+
import { Err } from "ts-results-es";
|
|
3
|
+
export declare const SECURITY_AUDIT_FILE_NAME: "SECURITY.md";
|
|
4
|
+
export declare function createSecurityAuditMergeRequest({ projectId, mainBranch, userId, api, }: {
|
|
5
|
+
projectId: string;
|
|
6
|
+
mainBranch: string;
|
|
7
|
+
userId: number;
|
|
8
|
+
api: Gitlab;
|
|
9
|
+
}): Promise<Err<string> | import("ts-results-es").Ok<import("@gitbeaker/core").ExpandedMergeRequestSchema>>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.__esModule = true;
|
|
39
|
+
exports.createSecurityAuditMergeRequest = exports.SECURITY_AUDIT_FILE_NAME = void 0;
|
|
40
|
+
var ts_results_es_1 = require("ts-results-es");
|
|
41
|
+
var auditDocument_1 = require("./auditDocument");
|
|
42
|
+
function makeDatedBranchName(branchName) {
|
|
43
|
+
var date = new Date().toISOString().slice(0, -5).replaceAll(/[:.T]/g, "-");
|
|
44
|
+
return "".concat(branchName, "-").concat(date);
|
|
45
|
+
}
|
|
46
|
+
var MR_TITLE = "Draft: chore(security): add security audit document";
|
|
47
|
+
exports.SECURITY_AUDIT_FILE_NAME = "SECURITY.md";
|
|
48
|
+
function createSecurityAuditMergeRequest(_a) {
|
|
49
|
+
var projectId = _a.projectId, mainBranch = _a.mainBranch, userId = _a.userId, api = _a.api;
|
|
50
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
51
|
+
var mrs, existingMr, auditTemplate, branch, commit, mr;
|
|
52
|
+
return __generator(this, function (_b) {
|
|
53
|
+
switch (_b.label) {
|
|
54
|
+
case 0: return [4 /*yield*/, ts_results_es_1.Result.wrapAsync(function () {
|
|
55
|
+
return api.MergeRequests.all({
|
|
56
|
+
state: "opened",
|
|
57
|
+
wip: "yes",
|
|
58
|
+
labels: "security-audit"
|
|
59
|
+
});
|
|
60
|
+
})];
|
|
61
|
+
case 1:
|
|
62
|
+
mrs = (_b.sent()).mapErr(function () { return "could not search for existing merge requests"; });
|
|
63
|
+
if (mrs.isErr())
|
|
64
|
+
return [2 /*return*/, mrs];
|
|
65
|
+
existingMr = mrs.value[0];
|
|
66
|
+
if (existingMr)
|
|
67
|
+
return [2 /*return*/, (0, ts_results_es_1.Err)("open merge request with security audit already exists: ".concat(existingMr.web_url))];
|
|
68
|
+
auditTemplate = ts_results_es_1.Result.wrap(function () { return (0, auditDocument_1.makeTemplate)(); }).mapErr(function () { return "could not make security audit template document"; });
|
|
69
|
+
if (auditTemplate.isErr())
|
|
70
|
+
return [2 /*return*/, auditTemplate];
|
|
71
|
+
return [4 /*yield*/, ts_results_es_1.Result.wrapAsync(function () {
|
|
72
|
+
return api.Branches.create(projectId, makeDatedBranchName("chore/security-audit"), mainBranch);
|
|
73
|
+
})];
|
|
74
|
+
case 2:
|
|
75
|
+
branch = (_b.sent()).mapErr(function (e) {
|
|
76
|
+
console.log(e);
|
|
77
|
+
return "could not create branch";
|
|
78
|
+
});
|
|
79
|
+
if (branch.isErr())
|
|
80
|
+
return [2 /*return*/, branch];
|
|
81
|
+
return [4 /*yield*/, ts_results_es_1.Result.wrapAsync(function () {
|
|
82
|
+
return api.Commits.create(projectId, branch.value.name, "chore(security): add empty security audit document template", [
|
|
83
|
+
{
|
|
84
|
+
action: "create",
|
|
85
|
+
filePath: exports.SECURITY_AUDIT_FILE_NAME,
|
|
86
|
+
content: auditTemplate.value,
|
|
87
|
+
encoding: "text"
|
|
88
|
+
},
|
|
89
|
+
]);
|
|
90
|
+
})];
|
|
91
|
+
case 3:
|
|
92
|
+
commit = (_b.sent()).mapErr(function () { return "could not create commit"; });
|
|
93
|
+
if (commit.isErr())
|
|
94
|
+
return [2 /*return*/, commit];
|
|
95
|
+
return [4 /*yield*/, ts_results_es_1.Result.wrapAsync(function () {
|
|
96
|
+
return api.MergeRequests.create(projectId, branch.value.name, mainBranch, MR_TITLE, {
|
|
97
|
+
description: "Please follow and update security audit document in `".concat(exports.SECURITY_AUDIT_FILE_NAME, "`."),
|
|
98
|
+
assigneeId: userId,
|
|
99
|
+
squash: true,
|
|
100
|
+
labels: "security-audit",
|
|
101
|
+
removeSourceBranch: true
|
|
102
|
+
});
|
|
103
|
+
})];
|
|
104
|
+
case 4:
|
|
105
|
+
mr = (_b.sent()).mapErr(function () { return "could not create merge request"; });
|
|
106
|
+
return [2 /*return*/, mr];
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
exports.createSecurityAuditMergeRequest = createSecurityAuditMergeRequest;
|
|
112
|
+
//# sourceMappingURL=createSecurityAuditMergeRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSecurityAuditMergeRequest.js","sourceRoot":"","sources":["../../../../../src/apps/catci/commands/security/createSecurityAuditMergeRequest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SecurityEvaluation } from "./auditDocument";
|
|
2
|
+
export declare function evaluateSecurityAudit({ path }: {
|
|
3
|
+
path: string;
|
|
4
|
+
}): Promise<import("ts-results-es").Err<string> | import("ts-results-es").Ok<SecurityEvaluation>>;
|
|
5
|
+
export declare function makeSecurityAuditOverview(evaluation: SecurityEvaluation): string;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.__esModule = true;
|
|
39
|
+
exports.makeSecurityAuditOverview = exports.evaluateSecurityAudit = void 0;
|
|
40
|
+
var ts_results_es_1 = require("ts-results-es");
|
|
41
|
+
var path_1 = require("path");
|
|
42
|
+
var promises_1 = require("fs/promises");
|
|
43
|
+
var createSecurityAuditMergeRequest_1 = require("./createSecurityAuditMergeRequest");
|
|
44
|
+
var auditDocument_1 = require("./auditDocument");
|
|
45
|
+
function evaluateSecurityAudit(_a) {
|
|
46
|
+
var path = _a.path;
|
|
47
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48
|
+
var _this = this;
|
|
49
|
+
return __generator(this, function (_b) {
|
|
50
|
+
switch (_b.label) {
|
|
51
|
+
case 0: return [4 /*yield*/, ts_results_es_1.Result.wrapAsync(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
52
|
+
var filePath, docData, doc;
|
|
53
|
+
return __generator(this, function (_a) {
|
|
54
|
+
switch (_a.label) {
|
|
55
|
+
case 0:
|
|
56
|
+
filePath = (0, path_1.join)(path, createSecurityAuditMergeRequest_1.SECURITY_AUDIT_FILE_NAME);
|
|
57
|
+
return [4 /*yield*/, (0, promises_1.readFile)(filePath)];
|
|
58
|
+
case 1:
|
|
59
|
+
docData = _a.sent();
|
|
60
|
+
doc = docData.toString("utf-8");
|
|
61
|
+
return [2 /*return*/, (0, auditDocument_1.evaluateDocument)(doc)];
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}); })];
|
|
65
|
+
case 1: return [2 /*return*/, (_b.sent()).mapErr(function (e) { return "could not evaluate ".concat(createSecurityAuditMergeRequest_1.SECURITY_AUDIT_FILE_NAME, ": ").concat(e); })];
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
exports.evaluateSecurityAudit = evaluateSecurityAudit;
|
|
71
|
+
function makeSecurityAuditOverview(evaluation) {
|
|
72
|
+
var ratingToEmo = function (r) { return (r < 33 ? "🟥" : r < 66 ? "🟨" : "🟩"); };
|
|
73
|
+
return "Project security posture overview:\n \uD83E\uDDD0 Total topics: ".concat(evaluation.score.totalTopics, "\n \uD83D\uDD12 Secured topics: ").concat(evaluation.score.securedTopics, "\n \uD83D\uDCE2 Answered topics: ").concat(evaluation.score.answeredTopics, "\n \u2754 Unknown topics: ").concat(evaluation.score.unknownTopics, "\n \uD83D\uDCCA Rating: ").concat(ratingToEmo(evaluation.score.rating), " ").concat(evaluation.score.rating, "/100");
|
|
74
|
+
}
|
|
75
|
+
exports.makeSecurityAuditOverview = makeSecurityAuditOverview;
|
|
76
|
+
//# sourceMappingURL=evaluateSecurityAudit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluateSecurityAudit.js","sourceRoot":"","sources":["../../../../../src/apps/catci/commands/security/evaluateSecurityAudit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAuC;AACvC,6BAA4B;AAC5B,wCAAuC;AACvC,qFAA6E;AAE7E,iDAAmD;AAEnD,SAAsB,qBAAqB,CAAC,EAA0B;QAAxB,IAAI,UAAA;;;;;wBAE9C,qBAAM,sBAAM,CAAC,SAAS,CAAC;;;;;oCACf,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,0DAAwB,CAAC,CAAC;oCACtC,qBAAM,IAAA,mBAAQ,EAAC,QAAQ,CAAC,EAAA;;oCAAlC,OAAO,GAAG,SAAwB;oCAClC,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oCACtC,sBAAO,IAAA,gCAAgB,EAAC,GAAG,CAAC,EAAC;;;yBAC9B,CAAC,EAAA;wBANJ,sBAAO,CACL,SAKE,CACH,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,6BAAsB,0DAAwB,eAAK,CAAC,CAAE,EAAtD,CAAsD,CAAC,EAAC;;;;CACzE;AATD,sDASC;AAED,SAAgB,yBAAyB,CAAC,UAA8B;IACtE,IAAM,WAAW,GAAG,UAAC,CAAS,IAAK,OAAA,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAtC,CAAsC,CAAC;IAE1E,OAAO,0EACW,UAAU,CAAC,KAAK,CAAC,WAAW,6CAC1B,UAAU,CAAC,KAAK,CAAC,aAAa,8CAC7B,UAAU,CAAC,KAAK,CAAC,cAAc,uCACjC,UAAU,CAAC,KAAK,CAAC,aAAa,qCACrC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,cAC9C,UAAU,CAAC,KAAK,CAAC,MAAM,SACnB,CAAC;AACT,CAAC;AAXD,8DAWC"}
|