@kwirthmagnify/kwirth-plugin-trivy 0.2.14 → 0.2.16
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/back.js +72 -125
- package/front.js +7 -7
- package/package.json +3 -1
package/back.js
CHANGED
|
@@ -67,11 +67,11 @@ var TRIVY_API_VULN_PLURAL = "vulnerabilityreports";
|
|
|
67
67
|
var TRIVY_API_AUDIT_PLURAL = "configauditreports";
|
|
68
68
|
var TRIVY_API_SBOM_PLURAL = "sbomreports";
|
|
69
69
|
var TRIVY_API_EXPOSED_PLURAL = "exposedsecretreports";
|
|
70
|
+
var ALL_PLURALS = [TRIVY_API_VULN_PLURAL, TRIVY_API_AUDIT_PLURAL, TRIVY_API_SBOM_PLURAL, TRIVY_API_EXPOSED_PLURAL];
|
|
70
71
|
var TrivyChannel = class {
|
|
71
72
|
constructor(clusterInfo, backChannelObject) {
|
|
72
73
|
this.channelId = "trivy";
|
|
73
|
-
this.requirements = { storage: false, providers: [] };
|
|
74
|
-
this.informers = /* @__PURE__ */ new Map();
|
|
74
|
+
this.requirements = { storage: false, providers: ["trivy"] };
|
|
75
75
|
this.webSockets = [];
|
|
76
76
|
this.getChannelData = () => ({
|
|
77
77
|
id: this.channelId,
|
|
@@ -88,6 +88,7 @@ var TrivyChannel = class {
|
|
|
88
88
|
});
|
|
89
89
|
this.getChannelScopeLevel = (scope) => ["", "trivy$workload", "trivy$kubernetes", "cluster"].indexOf(scope);
|
|
90
90
|
this.startChannel = async () => {
|
|
91
|
+
this.clusterInfo.addSubscriber("trivy", this, { reportTypes: ALL_PLURALS });
|
|
91
92
|
};
|
|
92
93
|
this.containsAsset = (webSocket, podNamespace, podName, containerName) => {
|
|
93
94
|
const socket = this.webSockets.find((s) => s.ws === webSocket);
|
|
@@ -125,38 +126,31 @@ var TrivyChannel = class {
|
|
|
125
126
|
instance.maxMedium = ic.maxMedium;
|
|
126
127
|
instance.maxLow = ic.maxLow;
|
|
127
128
|
}
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
sendIfKnown(await this.getAssetSbomReport(instance, asset));
|
|
151
|
-
sendIfKnown(await this.getAssetExposedReport(instance, asset));
|
|
152
|
-
instance.assets.push(asset);
|
|
153
|
-
for (const plural of [TRIVY_API_VULN_PLURAL, TRIVY_API_AUDIT_PLURAL, TRIVY_API_SBOM_PLURAL, TRIVY_API_EXPOSED_PLURAL]) {
|
|
154
|
-
if (!this.informers.has(plural)) {
|
|
155
|
-
const informer = this.createInformer(webSocket, instance, plural);
|
|
156
|
-
this.informers.set(plural, informer);
|
|
157
|
-
informer.start();
|
|
129
|
+
const workloadName = await this.resolveWorkloadName(podNamespace, podName);
|
|
130
|
+
const asset = { podNamespace, podName, containerName, workloadName };
|
|
131
|
+
const trivyProv = this.clusterInfo.providers?.find((p) => p.id === "trivy");
|
|
132
|
+
if (trivyProv?.getReportsForAsset) {
|
|
133
|
+
const initialReports = await trivyProv.getReportsForAsset(podNamespace, podName, containerName, ALL_PLURALS);
|
|
134
|
+
for (const pe of initialReports) {
|
|
135
|
+
const payload = {
|
|
136
|
+
msgtype: "trivymessageresponse",
|
|
137
|
+
msgsubtype: "add",
|
|
138
|
+
id: "",
|
|
139
|
+
namespace: podNamespace,
|
|
140
|
+
group: "",
|
|
141
|
+
pod: podName,
|
|
142
|
+
container: containerName,
|
|
143
|
+
action: import_kwirth_common.EInstanceMessageAction.NONE,
|
|
144
|
+
flow: import_kwirth_common.EInstanceMessageFlow.UNSOLICITED,
|
|
145
|
+
type: import_kwirth_common.EInstanceMessageType.DATA,
|
|
146
|
+
channel: import_kwirth_common.EInstanceMessageChannel.TRIVY,
|
|
147
|
+
instance: instance.instanceId
|
|
148
|
+
};
|
|
149
|
+
payload.data = { resource: pe.plural, known: { container: containerName, name: podName, namespace: podNamespace, report: pe.report } };
|
|
150
|
+
webSocket.send(JSON.stringify(payload));
|
|
158
151
|
}
|
|
159
152
|
}
|
|
153
|
+
instance.assets.push(asset);
|
|
160
154
|
return true;
|
|
161
155
|
};
|
|
162
156
|
this.deleteObject = async (webSocket, instanceConfig, podNamespace, podName, containerName) => {
|
|
@@ -181,13 +175,7 @@ var TrivyChannel = class {
|
|
|
181
175
|
if (pos >= 0) socket.instances.splice(pos, 1);
|
|
182
176
|
}
|
|
183
177
|
if (!this.webSockets.some((s) => s.instances.length > 0)) {
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
informer.stop();
|
|
187
|
-
} catch {
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
this.informers.clear();
|
|
178
|
+
this.clusterInfo.removeSubscriber("trivy", this);
|
|
191
179
|
}
|
|
192
180
|
};
|
|
193
181
|
this.containsConnection = (webSocket) => Boolean(this.webSockets.find((s) => s.ws === webSocket));
|
|
@@ -217,33 +205,6 @@ var TrivyChannel = class {
|
|
|
217
205
|
const requiredLevel = this.getChannelScopeLevel(scope);
|
|
218
206
|
return resources.some((r) => r.scopes.split(",").some((sc) => this.getChannelScopeLevel(sc) >= requiredLevel));
|
|
219
207
|
};
|
|
220
|
-
this.createInformer = (webSocket, instance, plural) => {
|
|
221
|
-
const handlers = {
|
|
222
|
-
onAdd: (obj) => this.processInformerEvent(webSocket, instance, plural, "add", obj),
|
|
223
|
-
onUpdate: (obj) => this.processInformerEvent(webSocket, instance, plural, "update", obj),
|
|
224
|
-
onDelete: (obj) => this.processInformerEvent(webSocket, instance, plural, "delete", obj),
|
|
225
|
-
onError: (err) => {
|
|
226
|
-
try {
|
|
227
|
-
console.error("[trivy] Informer error:", err);
|
|
228
|
-
if (err["HTTP-Code"] === "404" || err.statusCode === 404)
|
|
229
|
-
console.log("[trivy] CRD not found, informer will not restart");
|
|
230
|
-
else
|
|
231
|
-
setTimeout(() => {
|
|
232
|
-
informer.start();
|
|
233
|
-
console.log("[trivy] Informer restarted");
|
|
234
|
-
}, 5e3);
|
|
235
|
-
} catch (e) {
|
|
236
|
-
console.error("[trivy] Error managing informer error:", e);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
};
|
|
240
|
-
const informer = (0, import_kwirth_common_back.createCrdInformer)(this.clusterInfo, TRIVY_API_GROUP, TRIVY_API_VERSION, plural, handlers);
|
|
241
|
-
return informer;
|
|
242
|
-
};
|
|
243
|
-
this.getAssetVulnReport = (instance, asset) => this.getReport(TRIVY_API_VULN_PLURAL, instance, asset, true);
|
|
244
|
-
this.getAssetAuditReport = (instance, asset) => this.getReport(TRIVY_API_AUDIT_PLURAL, instance, asset, false);
|
|
245
|
-
this.getAssetSbomReport = (instance, asset) => this.getReport(TRIVY_API_SBOM_PLURAL, instance, asset, true);
|
|
246
|
-
this.getAssetExposedReport = (instance, asset) => this.getReport(TRIVY_API_EXPOSED_PLURAL, instance, asset, true);
|
|
247
208
|
this.removeReport = async (plural, trivyMessage) => {
|
|
248
209
|
const crdName = await this.getCrdName(trivyMessage.namespace, trivyMessage.pod, trivyMessage.container);
|
|
249
210
|
if (crdName) {
|
|
@@ -256,7 +217,7 @@ var TrivyChannel = class {
|
|
|
256
217
|
}
|
|
257
218
|
return `Couldn't get CRD name`;
|
|
258
219
|
};
|
|
259
|
-
this.executeCommand = async (trivyMessage,
|
|
220
|
+
this.executeCommand = async (trivyMessage, _instance) => {
|
|
260
221
|
const resp = {
|
|
261
222
|
msgtype: "trivymessageresponse",
|
|
262
223
|
id: "",
|
|
@@ -277,46 +238,6 @@ var TrivyChannel = class {
|
|
|
277
238
|
}
|
|
278
239
|
return resp;
|
|
279
240
|
};
|
|
280
|
-
this.processInformerEvent = async (webSocket, instance, plural, event, obj) => {
|
|
281
|
-
const asset = instance.assets.find(
|
|
282
|
-
(a) => "Pod" === obj.metadata.labels["trivy-operator.resource.kind"] && a.containerName === obj.metadata.labels["trivy-operator.container.name"] && a.podNamespace === obj.metadata.labels["trivy-operator.resource.namespace"] && a.podName.startsWith(obj.metadata.labels["trivy-operator.resource.name"])
|
|
283
|
-
);
|
|
284
|
-
if (!asset) return;
|
|
285
|
-
const payload = {
|
|
286
|
-
msgtype: "trivymessageresponse",
|
|
287
|
-
msgsubtype: event,
|
|
288
|
-
id: "",
|
|
289
|
-
namespace: asset.podNamespace,
|
|
290
|
-
group: "",
|
|
291
|
-
pod: asset.podName,
|
|
292
|
-
container: asset.containerName,
|
|
293
|
-
action: import_kwirth_common.EInstanceMessageAction.NONE,
|
|
294
|
-
flow: import_kwirth_common.EInstanceMessageFlow.UNSOLICITED,
|
|
295
|
-
type: import_kwirth_common.EInstanceMessageType.DATA,
|
|
296
|
-
channel: import_kwirth_common.EInstanceMessageChannel.TRIVY,
|
|
297
|
-
instance: instance.instanceId
|
|
298
|
-
};
|
|
299
|
-
if (event === "add" || event === "update") {
|
|
300
|
-
switch (plural) {
|
|
301
|
-
case TRIVY_API_VULN_PLURAL:
|
|
302
|
-
payload.data = await this.getAssetVulnReport(instance, asset);
|
|
303
|
-
break;
|
|
304
|
-
case TRIVY_API_AUDIT_PLURAL:
|
|
305
|
-
payload.data = await this.getAssetAuditReport(instance, asset);
|
|
306
|
-
break;
|
|
307
|
-
case TRIVY_API_SBOM_PLURAL:
|
|
308
|
-
payload.data = await this.getAssetSbomReport(instance, asset);
|
|
309
|
-
break;
|
|
310
|
-
case TRIVY_API_EXPOSED_PLURAL:
|
|
311
|
-
payload.data = await this.getAssetExposedReport(instance, asset);
|
|
312
|
-
break;
|
|
313
|
-
}
|
|
314
|
-
} else {
|
|
315
|
-
payload.data = { known: { name: asset.podName, namespace: asset.podNamespace, container: asset.containerName, report: void 0 } };
|
|
316
|
-
}
|
|
317
|
-
payload.data.resource = plural;
|
|
318
|
-
webSocket.send(JSON.stringify(payload));
|
|
319
|
-
};
|
|
320
241
|
this.getCrdName = async (namespace, podName, containerName) => {
|
|
321
242
|
try {
|
|
322
243
|
const podData = await this.clusterInfo.coreApi.readNamespacedPod({ name: podName, namespace });
|
|
@@ -328,10 +249,53 @@ var TrivyChannel = class {
|
|
|
328
249
|
return void 0;
|
|
329
250
|
}
|
|
330
251
|
};
|
|
252
|
+
// Resuelve el nombre del workload dueño del pod (= `resource.name` de Trivy):
|
|
253
|
+
// el controlador (ReplicaSet…) si lo hay, o el propio pod si es un pod suelto.
|
|
254
|
+
this.resolveWorkloadName = async (namespace, podName) => {
|
|
255
|
+
try {
|
|
256
|
+
const podData = await this.clusterInfo.coreApi.readNamespacedPod({ name: podName, namespace });
|
|
257
|
+
const ctrl = podData.metadata?.ownerReferences?.find((or) => or.controller);
|
|
258
|
+
return ctrl ? ctrl.name : podName;
|
|
259
|
+
} catch (err) {
|
|
260
|
+
console.error("[trivy] Cannot resolve workload name:", err);
|
|
261
|
+
return podName;
|
|
262
|
+
}
|
|
263
|
+
};
|
|
331
264
|
this.clusterInfo = clusterInfo;
|
|
332
265
|
this.backChannelObject = backChannelObject;
|
|
333
266
|
}
|
|
334
|
-
processProviderEvent(
|
|
267
|
+
processProviderEvent(providerId, obj) {
|
|
268
|
+
if (providerId !== "trivy") return;
|
|
269
|
+
const pe = obj;
|
|
270
|
+
const isAudit = pe.plural === TRIVY_API_AUDIT_PLURAL;
|
|
271
|
+
for (const socket of this.webSockets) {
|
|
272
|
+
for (const instance of socket.instances) {
|
|
273
|
+
const asset = instance.assets.find(
|
|
274
|
+
(a) => a.podNamespace === pe.namespace && a.workloadName === pe.podName && (isAudit || a.containerName === pe.containerName)
|
|
275
|
+
);
|
|
276
|
+
if (!asset) continue;
|
|
277
|
+
const payload = {
|
|
278
|
+
msgtype: "trivymessageresponse",
|
|
279
|
+
msgsubtype: pe.event,
|
|
280
|
+
id: "",
|
|
281
|
+
namespace: asset.podNamespace,
|
|
282
|
+
group: "",
|
|
283
|
+
pod: asset.podName,
|
|
284
|
+
container: asset.containerName,
|
|
285
|
+
action: import_kwirth_common.EInstanceMessageAction.NONE,
|
|
286
|
+
flow: import_kwirth_common.EInstanceMessageFlow.UNSOLICITED,
|
|
287
|
+
type: import_kwirth_common.EInstanceMessageType.DATA,
|
|
288
|
+
channel: import_kwirth_common.EInstanceMessageChannel.TRIVY,
|
|
289
|
+
instance: instance.instanceId
|
|
290
|
+
};
|
|
291
|
+
if (pe.event === "delete") {
|
|
292
|
+
payload.data = { resource: pe.plural, known: { name: asset.podName, namespace: asset.podNamespace, container: asset.containerName, report: void 0 } };
|
|
293
|
+
} else {
|
|
294
|
+
payload.data = { resource: pe.plural, known: { name: asset.podName, namespace: asset.podNamespace, container: asset.containerName, report: pe.report } };
|
|
295
|
+
}
|
|
296
|
+
socket.ws.send(JSON.stringify(payload));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
335
299
|
}
|
|
336
300
|
async endpointRequest(endpoint, req, res) {
|
|
337
301
|
console.log(`[trivy] endpointRequest: ${endpoint} ${req.method} ${req.url}`);
|
|
@@ -375,23 +339,6 @@ var TrivyChannel = class {
|
|
|
375
339
|
}
|
|
376
340
|
modifyInstance(_webSocket, _instanceConfig) {
|
|
377
341
|
}
|
|
378
|
-
async getReport(plural, instance, asset, withContainer) {
|
|
379
|
-
try {
|
|
380
|
-
const crdName = await this.getCrdName(asset.podNamespace, asset.podName, withContainer ? asset.containerName : void 0);
|
|
381
|
-
if (crdName) {
|
|
382
|
-
try {
|
|
383
|
-
const crdObject = await this.clusterInfo.crdApi.getNamespacedCustomObject({ group: TRIVY_API_GROUP, version: TRIVY_API_VERSION, namespace: asset.podNamespace, plural, name: crdName });
|
|
384
|
-
return { resource: plural, known: { container: asset.containerName, name: asset.podName, namespace: asset.podNamespace, report: crdObject.report } };
|
|
385
|
-
} catch (err) {
|
|
386
|
-
return { resource: plural, unknown: { container: asset.containerName, name: asset.podName, namespace: asset.podNamespace, statusCode: 0, statusMessage: err.toString() } };
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
return { resource: plural, unknown: { container: asset.containerName, name: asset.podName, namespace: asset.podNamespace, statusCode: 999, statusMessage: "Cannot get CRD name" } };
|
|
390
|
-
} catch (err) {
|
|
391
|
-
console.error("[trivy] Caught error:", err);
|
|
392
|
-
return { resource: plural, unknown: { container: asset.containerName, name: asset.podName, namespace: asset.podNamespace, statusCode: 999, statusMessage: err } };
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
342
|
};
|
|
396
343
|
// Annotate the CommonJS export names for ESM import in node:
|
|
397
344
|
0 && (module.exports = {
|
package/front.js
CHANGED
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
(0, import_react.useEffect)(() => {
|
|
114
114
|
getStatus();
|
|
115
115
|
}, []);
|
|
116
|
-
return /* @__PURE__ */ import_react.default.createElement(import_material.Dialog, { open: true }, /* @__PURE__ */ import_react.default.createElement(import_material.DialogTitle, null, "Trivy operator"), /* @__PURE__ */ import_react.default.createElement(import_material.DialogContent, null, /* @__PURE__ */ import_react.default.createElement(import_material.Stack, { spacing: 2, direction: "column", sx: { width: "40vh" } }, /* @__PURE__ */ import_react.default.createElement(import_material.Typography, null, "Status: ", status), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { onClick: () => props.onClose("install") }, "INSTALL"), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { onClick: () => props.onClose("remove") }, "REMOVE"), /* @__PURE__ */ import_react.default.createElement(import_material.Typography, null, "Select scan mode: "), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { onClick: () => props.onClose("configfs") }, "FILESYSTEM"), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { onClick: () => props.onClose("configimg") }, "IMAGE"))), /* @__PURE__ */ import_react.default.createElement(import_material.DialogActions, null, /* @__PURE__ */ import_react.default.createElement(import_material.Button, { onClick: () => props.onClose() }, "CANCEL")));
|
|
116
|
+
return /* @__PURE__ */ import_react.default.createElement(import_material.Dialog, { open: true }, /* @__PURE__ */ import_react.default.createElement(import_material.DialogTitle, null, "Trivy operator"), /* @__PURE__ */ import_react.default.createElement(import_material.DialogContent, null, /* @__PURE__ */ import_react.default.createElement(import_material.Stack, { spacing: 2, direction: "column", sx: { width: "40vh" } }, /* @__PURE__ */ import_react.default.createElement(import_material.Typography, null, "Status: ", status), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { variant: "outlined", onClick: () => props.onClose("install") }, "INSTALL"), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { variant: "outlined", onClick: () => props.onClose("remove") }, "REMOVE"), /* @__PURE__ */ import_react.default.createElement(import_material.Typography, null, "Select scan mode: "), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { variant: "outlined", onClick: () => props.onClose("configfs") }, "FILESYSTEM"), /* @__PURE__ */ import_react.default.createElement(import_material.Button, { variant: "outlined", onClick: () => props.onClose("configimg") }, "IMAGE"))), /* @__PURE__ */ import_react.default.createElement(import_material.DialogActions, null, /* @__PURE__ */ import_react.default.createElement(import_material.Button, { variant: "outlined", onClick: () => props.onClose() }, "CANCEL")));
|
|
117
117
|
};
|
|
118
118
|
|
|
119
119
|
// src/front/TrivySetup.tsx
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
setMsgBox((0, import_kwirth_common_front.MsgBoxOkError)("Trivy", `Trivy action has shown some errors: ${await result.text()}.`, setMsgBox));
|
|
152
152
|
}
|
|
153
153
|
};
|
|
154
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_material2.Dialog, { open: true, maxWidth: false, sx: { "& .MuiDialog-paper": { width: "28vw", minWidth: "500px", maxWidth: "50vw", height: "55vh" } } }, /* @__PURE__ */ import_react2.default.createElement(import_material2.DialogTitle, null, "Configure Trivy channel"), /* @__PURE__ */ import_react2.default.createElement(import_material2.DialogContent, null, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "column", justifyContent: "space-between", height: "100%" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { spacing: 2, direction: "column", sx: { mt: "16px" } }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, null, "Activate or deactivate severities for including or excluding them from Trivy reports:"), /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { flex: 1 }), /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, null, "Ignore")), [["Critical", ignoreCritical, setIgnoreCritical], ["High", ignoreHigh, setIgnoreHigh], ["Medium", ignoreMedium, setIgnoreMedium], ["Low", ignoreLow, setIgnoreLow]].map(([label, val, setter]) => /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { key: label, direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { flex: 1, fontWeight: 800, width: "80px" }, label), /* @__PURE__ */ import_react2.default.createElement(import_material2.Checkbox, { checked: val, onChange: () => setter(!val) }))))), /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "row" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, null, "You can manage your cluster Trivy installation from Kwirth."), /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { fontSize: "10px" }, "You need to start the channel at least once in order to be able to configure Trivy operator.")), /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { flex: 1 }), /* @__PURE__ */ import_react2.default.createElement(import_material2.Button, { onClick: () => setShowOperatorManage(true), disabled: !trivyData.ri }, "Manage Trivy")))), /* @__PURE__ */ import_react2.default.createElement(import_material2.DialogActions, null, /* @__PURE__ */ import_react2.default.createElement(import_material2.FormControlLabel, { control: /* @__PURE__ */ import_react2.default.createElement(import_material2.Checkbox, { slotProps: { input: { ref: defaultRef } } }), label: "Set as default", sx: { width: "100%", ml: "8px" } }), /* @__PURE__ */ import_react2.default.createElement(import_material2.Button, { onClick: ok }, "OK"), /* @__PURE__ */ import_react2.default.createElement(import_material2.Button, { onClick: cancel }, "CANCEL"))), showOperatorManage && /* @__PURE__ */ import_react2.default.createElement(TrivyOperator, { onClose: onOperatorManageClosed, clusterUrl: props.channelObject.clusterUrl, accessString: props.channelObject.accessString, channelObject: props.channelObject }), msgBox);
|
|
154
|
+
return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_material2.Dialog, { open: true, maxWidth: false, sx: { "& .MuiDialog-paper": { width: "28vw", minWidth: "500px", maxWidth: "50vw", height: "55vh" } } }, /* @__PURE__ */ import_react2.default.createElement(import_material2.DialogTitle, null, "Configure Trivy channel"), /* @__PURE__ */ import_react2.default.createElement(import_material2.DialogContent, null, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "column", justifyContent: "space-between", height: "100%" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { spacing: 2, direction: "column", sx: { mt: "16px" } }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, null, "Activate or deactivate severities for including or excluding them from Trivy reports:"), /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { flex: 1 }), /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, null, "Ignore")), [["Critical", ignoreCritical, setIgnoreCritical], ["High", ignoreHigh, setIgnoreHigh], ["Medium", ignoreMedium, setIgnoreMedium], ["Low", ignoreLow, setIgnoreLow]].map(([label, val, setter]) => /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { key: label, direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { flex: 1, fontWeight: 800, width: "80px" }, label), /* @__PURE__ */ import_react2.default.createElement(import_material2.Checkbox, { checked: val, onChange: () => setter(!val) }))))), /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "row" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Stack, { direction: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, null, "You can manage your cluster Trivy installation from Kwirth."), /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { fontSize: "10px" }, "You need to start the channel at least once in order to be able to configure Trivy operator.")), /* @__PURE__ */ import_react2.default.createElement(import_material2.Typography, { flex: 1 }), /* @__PURE__ */ import_react2.default.createElement(import_material2.Button, { variant: "outlined", onClick: () => setShowOperatorManage(true), disabled: !trivyData.ri }, "Manage Trivy")))), /* @__PURE__ */ import_react2.default.createElement(import_material2.DialogActions, null, /* @__PURE__ */ import_react2.default.createElement(import_material2.FormControlLabel, { control: /* @__PURE__ */ import_react2.default.createElement(import_material2.Checkbox, { slotProps: { input: { ref: defaultRef } } }), label: "Set as default", sx: { width: "100%", ml: "8px" } }), /* @__PURE__ */ import_react2.default.createElement(import_material2.Button, { variant: "outlined", onClick: ok }, "OK"), /* @__PURE__ */ import_react2.default.createElement(import_material2.Button, { variant: "outlined", onClick: cancel }, "CANCEL"))), showOperatorManage && /* @__PURE__ */ import_react2.default.createElement(TrivyOperator, { onClose: onOperatorManageClosed, clusterUrl: props.channelObject.clusterUrl, accessString: props.channelObject.accessString, channelObject: props.channelObject }), msgBox);
|
|
155
155
|
};
|
|
156
156
|
|
|
157
157
|
// src/front/TrivyTabContent.tsx
|
|
@@ -228,7 +228,7 @@
|
|
|
228
228
|
let title = check.title || check.checkID;
|
|
229
229
|
const i = title.indexOf(":");
|
|
230
230
|
if (i >= 0) title = title.substring(0, i);
|
|
231
|
-
return /* @__PURE__ */ import_react4.default.createElement(import_material3.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react4.default.createElement(import_material3.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.ExpandMore, null) }, /* @__PURE__ */ import_react4.default.createElement(import_material3.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { sx: { width: "120px" } }, check.severity), /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, {
|
|
231
|
+
return /* @__PURE__ */ import_react4.default.createElement(import_material3.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react4.default.createElement(import_material3.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.ExpandMore, null) }, /* @__PURE__ */ import_react4.default.createElement(import_material3.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { sx: { width: "120px" } }, check.severity), /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { variant: "body2" }, title))), /* @__PURE__ */ import_react4.default.createElement(import_material3.AccordionDetails, null, /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { variant: "body2" }, /* @__PURE__ */ import_react4.default.createElement("b", null, "Id: "), /* @__PURE__ */ import_react4.default.createElement("a", { href: check.primaryLink, target: "_blank", rel: "noreferrer" }, check.checkID), date.getFullYear() ? /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, "\xA0\xA0(published ", published, ")") : /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null)), /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { variant: "body2" }, /* @__PURE__ */ import_react4.default.createElement("b", null, "Category: "), check.category), /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { variant: "body2" }, /* @__PURE__ */ import_react4.default.createElement("b", null, "Description: "), check.description), /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { variant: "body2" }, /* @__PURE__ */ import_react4.default.createElement("b", null, "Remediation: "), check.remediation), /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { variant: "body2" }, /* @__PURE__ */ import_react4.default.createElement("b", null, "Messages: ")), /* @__PURE__ */ import_react4.default.createElement(import_material3.List, null, check.messages.map((m, index) => /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItem, { key: index }, /* @__PURE__ */ import_react4.default.createElement(import_material3.Typography, { variant: "body2" }, m))))));
|
|
232
232
|
};
|
|
233
233
|
|
|
234
234
|
// src/front/components/TrivyTabContentAssetVulns.tsx
|
|
@@ -242,7 +242,7 @@
|
|
|
242
242
|
let title = vuln.title || vuln.vulnerabilityID;
|
|
243
243
|
const i = title.indexOf(":");
|
|
244
244
|
if (i >= 0) title = title.substring(0, i);
|
|
245
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_material4.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react5.default.createElement(import_icons_material3.ExpandMore, null) }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { sx: { width: "120px" }, variant: "body2" }, vuln.severity), /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, {
|
|
245
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_material4.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react5.default.createElement(import_icons_material3.ExpandMore, null) }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { sx: { width: "120px" }, variant: "body2" }, vuln.severity), /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2" }, title))), /* @__PURE__ */ import_react5.default.createElement(import_material4.AccordionDetails, null, /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2" }, /* @__PURE__ */ import_react5.default.createElement("b", null, "Id: "), /* @__PURE__ */ import_react5.default.createElement("a", { href: vuln.primaryLink, target: "_blank", rel: "noreferrer" }, vuln.vulnerabilityID), date.getFullYear() ? /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, "\xA0\xA0(published ", published, ")") : /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null)), /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2" }, /* @__PURE__ */ import_react5.default.createElement("b", null, "Resource: "), vuln.resource), vuln.title && /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2" }, /* @__PURE__ */ import_react5.default.createElement("b", null, "Description: "), vuln.title), /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2" }, /* @__PURE__ */ import_react5.default.createElement("b", null, "Installed: "), vuln.installedVersion), /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2" }, /* @__PURE__ */ import_react5.default.createElement("b", null, "Fixed: "), vuln.fixedVersion || "n/a")));
|
|
246
246
|
};
|
|
247
247
|
|
|
248
248
|
// src/front/components/TrivyTabContentAssetSbom.tsx
|
|
@@ -256,7 +256,7 @@
|
|
|
256
256
|
if (deps?.dependsOn) return deps.dependsOn.map((d) => /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { key: d, variant: "body2" }, d));
|
|
257
257
|
return /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null);
|
|
258
258
|
};
|
|
259
|
-
return /* @__PURE__ */ import_react6.default.createElement(import_material5.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react6.default.createElement(import_icons_material4.ExpandMore, null) }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, {
|
|
259
|
+
return /* @__PURE__ */ import_react6.default.createElement(import_material5.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react6.default.createElement(import_icons_material4.ExpandMore, null) }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2" }, component.name))), /* @__PURE__ */ import_react6.default.createElement(import_material5.AccordionDetails, null, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2" }, /* @__PURE__ */ import_react6.default.createElement("b", null, "Version: "), component.version), /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2" }, /* @__PURE__ */ import_react6.default.createElement("b", null, "Type: "), component.type), /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2" }, /* @__PURE__ */ import_react6.default.createElement("b", null, "Provider: "), component.supplier?.name), /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2" }, /* @__PURE__ */ import_react6.default.createElement("b", null, "Licenses: "), component.licenses?.map((l) => l.license?.id ?? l.license?.name ?? l.expression ?? "").filter(Boolean).join(", ")), /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2" }, /* @__PURE__ */ import_react6.default.createElement("b", null, "Dependencies: "), showDependencies())));
|
|
260
260
|
};
|
|
261
261
|
|
|
262
262
|
// src/front/components/TrivyTabContentAssetExposed.tsx
|
|
@@ -265,7 +265,7 @@
|
|
|
265
265
|
var import_material6 = __toESM(require_material(), 1);
|
|
266
266
|
var TrivyTabContentAssetExposed = (props) => {
|
|
267
267
|
const secret = props.secret;
|
|
268
|
-
return /* @__PURE__ */ import_react7.default.createElement(import_material6.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react7.default.createElement(import_material6.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react7.default.createElement(import_icons_material5.ExpandMore, null) }, /* @__PURE__ */ import_react7.default.createElement(import_material6.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react7.default.createElement(import_material6.Typography, {
|
|
268
|
+
return /* @__PURE__ */ import_react7.default.createElement(import_material6.Accordion, { sx: { m: 0.1 } }, /* @__PURE__ */ import_react7.default.createElement(import_material6.AccordionSummary, { expandIcon: /* @__PURE__ */ import_react7.default.createElement(import_icons_material5.ExpandMore, null) }, /* @__PURE__ */ import_react7.default.createElement(import_material6.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react7.default.createElement(import_material6.Typography, { variant: "body2" }, secret.title))), /* @__PURE__ */ import_react7.default.createElement(import_material6.AccordionDetails, null, /* @__PURE__ */ import_react7.default.createElement(import_material6.Typography, { variant: "body2" }, /* @__PURE__ */ import_react7.default.createElement("b", null, "Rule ID: "), secret.ruleID), /* @__PURE__ */ import_react7.default.createElement(import_material6.Typography, { variant: "body2" }, /* @__PURE__ */ import_react7.default.createElement("b", null, "Severity: "), secret.severity), /* @__PURE__ */ import_react7.default.createElement(import_material6.Typography, { variant: "body2" }, /* @__PURE__ */ import_react7.default.createElement("b", null, "Category: "), secret.category), /* @__PURE__ */ import_react7.default.createElement(import_material6.Typography, { variant: "body2" }, /* @__PURE__ */ import_react7.default.createElement("b", null, "Target: "), secret.target), /* @__PURE__ */ import_react7.default.createElement(import_material6.Typography, { variant: "body2", component: "div" }, /* @__PURE__ */ import_react7.default.createElement("b", null, "Match: "), /* @__PURE__ */ import_react7.default.createElement("pre", null, secret.match))));
|
|
269
269
|
};
|
|
270
270
|
|
|
271
271
|
// src/front/components/TrivyTabContentAssetDetails.tsx
|
|
@@ -292,7 +292,7 @@
|
|
|
292
292
|
if (props.trivyInstanceConfig.ignoreLow && item.severity === "LOW") return false;
|
|
293
293
|
return true;
|
|
294
294
|
});
|
|
295
|
-
return /* @__PURE__ */ import_react8.default.createElement(import_material7.Dialog, { open: true, disableRestoreFocus: true, PaperProps: { sx: { backgroundColor: "background.paper", borderWidth: "1px", borderStyle: "solid", borderColor: "divider" } } }, /* @__PURE__ */ import_react8.default.createElement(import_material7.DialogTitle, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Stack, { direction: "row", spacing: 2, alignItems: "center" }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Avatar, null, getAvatarContent(report?.os?.family || "X")), /* @__PURE__ */ import_react8.default.createElement(import_material7.Stack, { direction: "column" }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, asset.namespace), /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, asset.name, "/", asset.container)))), /* @__PURE__ */ import_react8.default.createElement(import_material7.DialogContent, { sx: { overflowY: "hidden" } }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Stack, { direction: "column", spacing: 1, mt: 1 }, (props.detail === TRIVY_API_VULN_PLURAL || props.detail === TRIVY_API_AUDIT_PLURAL || props.detail === TRIVY_API_EXPOSED_PLURAL) && summaryVulnAuditExposed(props.asset, props.detail), /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, { sx: { p: 1 } }, props.detail === TRIVY_API_VULN_PLURAL && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, /* @__PURE__ */ import_react8.default.createElement("b", null, "Image:"), " ", `${report.registry.server}/${report.artifact.repository}:${report.artifact.tag}`), /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, /* @__PURE__ */ import_react8.default.createElement("b", null, "OS:"), " ", `${report.os.family}/${report.os.name}`)), /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, /* @__PURE__ */ import_react8.default.createElement("b", null, "Scan:"), " ", `${report.scanner.name} ${report.scanner.version} (${report.scanner.vendor}) on ${report.updateTimestamp}`)), props.detail === TRIVY_API_SBOM_PLURAL && /* @__PURE__ */ import_react8.default.createElement(import_material7.TextField, { inputRef: filter, variant: "standard", label: "Filter", sx: { mb: 2, ml: 1, mr: 1 }, onChange: () => setTick((t) => t + 1) }), /* @__PURE__ */ import_react8.default.createElement(import_material7.Box, { sx: { display: "flex", flexDirection: "column", overflowY: "auto", overflowX: "hidden", width: "100%", flexGrow: 1, height: "50vh" } }, props.detail === TRIVY_API_VULN_PLURAL && (vulns.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No vulnerabilities found.")) : filterBySeverity(vulns).map((vuln, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetVulns, { key: i, vuln }))), props.detail === TRIVY_API_AUDIT_PLURAL && (checks.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No config errors detected.")) : filterBySeverity(checks).map((check, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetAudit, { key: i, check }))), props.detail === TRIVY_API_EXPOSED_PLURAL && (secrets.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No exposed secrets detected.")) : filterBySeverity(secrets).map((secret, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetExposed, { key: i, secret }))), props.detail === TRIVY_API_SBOM_PLURAL && (components.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No components detected.")) : components.sort((a, b) => a.name.localeCompare(b.name)).filter((a) => !filter.current || a.name.toLowerCase().includes(filter.current?.value)).map((component, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetSbom, { key: i, component, sbomReport: props.asset.sbomreports.report })))))), /* @__PURE__ */ import_react8.default.createElement(import_material7.DialogActions, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Button, { onClick: () => props.onClose() }, "ok")));
|
|
295
|
+
return /* @__PURE__ */ import_react8.default.createElement(import_material7.Dialog, { open: true, disableRestoreFocus: true, PaperProps: { sx: { backgroundColor: "background.paper", borderWidth: "1px", borderStyle: "solid", borderColor: "divider" } } }, /* @__PURE__ */ import_react8.default.createElement(import_material7.DialogTitle, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Stack, { direction: "row", spacing: 2, alignItems: "center" }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Avatar, null, getAvatarContent(report?.os?.family || "X")), /* @__PURE__ */ import_react8.default.createElement(import_material7.Stack, { direction: "column" }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, asset.namespace), /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, asset.name, "/", asset.container)))), /* @__PURE__ */ import_react8.default.createElement(import_material7.DialogContent, { sx: { overflowY: "hidden" } }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Stack, { direction: "column", spacing: 1, mt: 1 }, (props.detail === TRIVY_API_VULN_PLURAL || props.detail === TRIVY_API_AUDIT_PLURAL || props.detail === TRIVY_API_EXPOSED_PLURAL) && summaryVulnAuditExposed(props.asset, props.detail), /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, { sx: { p: 1 } }, props.detail === TRIVY_API_VULN_PLURAL && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, /* @__PURE__ */ import_react8.default.createElement("b", null, "Image:"), " ", `${report.registry.server}/${report.artifact.repository}:${report.artifact.tag}`), /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, /* @__PURE__ */ import_react8.default.createElement("b", null, "OS:"), " ", `${report.os.family}/${report.os.name}`)), /* @__PURE__ */ import_react8.default.createElement(import_material7.Typography, { variant: "body2" }, /* @__PURE__ */ import_react8.default.createElement("b", null, "Scan:"), " ", `${report.scanner.name} ${report.scanner.version} (${report.scanner.vendor}) on ${report.updateTimestamp}`)), props.detail === TRIVY_API_SBOM_PLURAL && /* @__PURE__ */ import_react8.default.createElement(import_material7.TextField, { inputRef: filter, variant: "standard", label: "Filter", sx: { mb: 2, ml: 1, mr: 1 }, onChange: () => setTick((t) => t + 1) }), /* @__PURE__ */ import_react8.default.createElement(import_material7.Box, { sx: { display: "flex", flexDirection: "column", overflowY: "auto", overflowX: "hidden", width: "100%", flexGrow: 1, height: "50vh" } }, props.detail === TRIVY_API_VULN_PLURAL && (vulns.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No vulnerabilities found.")) : filterBySeverity(vulns).map((vuln, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetVulns, { key: i, vuln }))), props.detail === TRIVY_API_AUDIT_PLURAL && (checks.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No config errors detected.")) : filterBySeverity(checks).map((check, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetAudit, { key: i, check }))), props.detail === TRIVY_API_EXPOSED_PLURAL && (secrets.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No exposed secrets detected.")) : filterBySeverity(secrets).map((secret, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetExposed, { key: i, secret }))), props.detail === TRIVY_API_SBOM_PLURAL && (components.length === 0 ? /* @__PURE__ */ import_react8.default.createElement(import_material7.Card, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.CardContent, null, "No components detected.")) : components.sort((a, b) => a.name.localeCompare(b.name)).filter((a) => !filter.current || a.name.toLowerCase().includes(filter.current?.value)).map((component, i) => /* @__PURE__ */ import_react8.default.createElement(TrivyTabContentAssetSbom, { key: i, component, sbomReport: props.asset.sbomreports.report })))))), /* @__PURE__ */ import_react8.default.createElement(import_material7.DialogActions, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Button, { variant: "outlined", onClick: () => props.onClose() }, "ok")));
|
|
296
296
|
};
|
|
297
297
|
|
|
298
298
|
// src/front/components/TrivyTabContentAsset.tsx
|
package/package.json
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
+
"type": "commonjs",
|
|
3
|
+
"extensionType": "plugin",
|
|
2
4
|
"id": "trivy",
|
|
3
5
|
"name": "@kwirthmagnify/kwirth-plugin-trivy",
|
|
4
6
|
"displayName": "Trivy",
|
|
5
|
-
"version": "0.2.
|
|
7
|
+
"version": "0.2.16",
|
|
6
8
|
"description": "Trivy security scanning channel plugin for Kwirth",
|
|
7
9
|
"icon": "VerifiedUser",
|
|
8
10
|
"website": "https://kwirthmagnify.dev"
|