@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.
Files changed (3) hide show
  1. package/back.js +72 -125
  2. package/front.js +7 -7
  3. 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 asset = { podNamespace, podName, containerName };
129
- const sendIfKnown = (result) => {
130
- if (!result.known) return;
131
- const payload = {
132
- msgtype: "trivymessageresponse",
133
- msgsubtype: "add",
134
- id: "",
135
- namespace: asset.podNamespace,
136
- group: "",
137
- pod: asset.podName,
138
- container: asset.containerName,
139
- action: import_kwirth_common.EInstanceMessageAction.NONE,
140
- flow: import_kwirth_common.EInstanceMessageFlow.UNSOLICITED,
141
- type: import_kwirth_common.EInstanceMessageType.DATA,
142
- channel: import_kwirth_common.EInstanceMessageChannel.TRIVY,
143
- instance: instance.instanceId
144
- };
145
- payload.data = result;
146
- webSocket.send(JSON.stringify(payload));
147
- };
148
- sendIfKnown(await this.getAssetVulnReport(instance, asset));
149
- sendIfKnown(await this.getAssetAuditReport(instance, asset));
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
- for (const informer of this.informers.values()) {
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, instance) => {
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(_providerId, _obj) {
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, { fontSize: 12 }, 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))))));
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, { fontSize: 12, 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")));
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, { fontSize: 12 }, 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())));
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, { fontSize: 12 }, 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))));
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.14",
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"