2016-02-22 23:39:04 +00:00
|
|
|
<div class="image-feature-view-element">
|
|
|
|
<!-- Not scanned -->
|
|
|
|
<div class="empty" ng-if="securityStatus == 'queued'">
|
|
|
|
<div class="empty-primary-msg">This image has not been indexed yet</div>
|
|
|
|
<div class="empty-secondary-msg">
|
|
|
|
Please try again in a few minutes.
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<!-- Unable to scan -->
|
|
|
|
<div class="empty" ng-if="securityStatus == 'failed'">
|
|
|
|
<div class="empty-primary-msg">This image could not be indexed</div>
|
|
|
|
<div class="empty-secondary-msg">
|
|
|
|
Our security scanner was unable to index this image.
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
2016-03-04 23:07:44 +00:00
|
|
|
<!-- Scanned and has no features -->
|
2016-03-09 20:28:21 +00:00
|
|
|
<div ng-if="securityStatus == 'scanned' && !featuresInfo.features.length">
|
2016-03-04 23:07:44 +00:00
|
|
|
<div class="empty" style="margin-top: 20px;">
|
|
|
|
<div class="empty-icon">
|
|
|
|
<i class="fa ci-package"></i>
|
|
|
|
</div>
|
|
|
|
<div class="empty-primary-msg">Image is not supported by Quay Security Scanner</div>
|
|
|
|
<div class="empty-secondary-msg">
|
|
|
|
This image has an operating system or package manager unsupported by Quay Security Scanner.
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
2016-02-22 23:39:04 +00:00
|
|
|
<!-- Scanned -->
|
2016-03-09 20:28:21 +00:00
|
|
|
<div ng-if="securityStatus == 'scanned' && featuresInfo.features.length">
|
2016-02-22 23:39:04 +00:00
|
|
|
<!-- Header -->
|
|
|
|
<div class="security-header row">
|
|
|
|
<div class="donut-col col-md-3">
|
|
|
|
<div id="featureDonutChart" style="position: relative;">
|
|
|
|
<svg style="height:250px; width:250px"></svg>
|
|
|
|
<span class="donut-icon">
|
|
|
|
<i class="fa ci-package"></i>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="summary-col col-md-9">
|
|
|
|
<ul class="summary-list">
|
2016-03-09 20:28:21 +00:00
|
|
|
<li class="title-item">Quay Security Scanner has recognized <strong>{{ featuresInfo.features.length }}</strong> packages.</li>
|
|
|
|
<li ng-repeat="severity in featuresInfo.severityBreakdown">
|
|
|
|
<span class="package-item" ng-if="severity.label != 'None'">
|
|
|
|
<i class="fa ci-package" ng-style="{'color': severity.color}"></i> <strong>{{ severity.value }}</strong> packages with {{ severity.label }}-level vulnerabilities.
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
2016-03-09 20:28:21 +00:00
|
|
|
<span class="package-item" ng-if="severity.label == 'None'" style="margin-top: 20px; display: inline-block;">
|
|
|
|
<i class="fa ci-package" ng-style="{'color': severity.color}"></i> <strong>{{ severity.value }}</strong> packages with no vulnerabilities.
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<!-- Filter -->
|
|
|
|
<span class="co-filter-box">
|
2016-03-09 20:28:21 +00:00
|
|
|
<span class="filter-message" ng-if="options.filter">
|
|
|
|
Showing {{ orderedFeatures.entries.length }} of {{ featuresInfo.features.length }} packages
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
2016-03-09 20:28:21 +00:00
|
|
|
<input class="form-control" type="text" ng-model="options.filter" placeholder="Filter Packages...">
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
|
|
|
<h3>Image Packages</h3>
|
|
|
|
|
|
|
|
<!-- Table -->
|
|
|
|
<table class="co-table">
|
|
|
|
<thead>
|
2016-03-09 20:28:21 +00:00
|
|
|
<td ng-class="TableService.tablePredicateClass('name', options.predicate, options.reverse)">
|
|
|
|
<a href="javascript:void(0)" ng-click="TableService.orderBy('name', options)">Package Name</a>
|
2016-02-22 23:39:04 +00:00
|
|
|
</td>
|
|
|
|
<td class="hidden-xs">
|
|
|
|
Package Version
|
|
|
|
</td>
|
2016-03-09 20:28:21 +00:00
|
|
|
<td ng-class="TableService.tablePredicateClass('score', options.predicate, options.reverse)">
|
|
|
|
<a href="javascript:void(0)" ng-click="TableService.orderBy('score', options)">Vulnerabilities</a>
|
2016-02-22 23:39:04 +00:00
|
|
|
</td>
|
|
|
|
<td class="hidden-xs hidden-sm hidden-md"
|
2016-03-09 20:28:21 +00:00
|
|
|
ng-class="TableService.tablePredicateClass('leftoverScore', options.predicate, options.reverse)"
|
2016-02-22 23:39:04 +00:00
|
|
|
data-title="Identified vulnerabilities remaining after the package is upgraded to the latest version"
|
|
|
|
data-container="body" bs-tooltip>
|
2016-03-09 20:28:21 +00:00
|
|
|
<a href="javascript:void(0)" ng-click="TableService.orderBy('leftoverScore', options)">Remaining after upgrade</a>
|
2016-02-22 23:39:04 +00:00
|
|
|
</td>
|
2016-03-09 20:28:21 +00:00
|
|
|
<td ng-class="TableService.tablePredicateClass('fixableScore', options.predicate, options.reverse)">
|
|
|
|
<a href="javascript:void(0)" ng-click="TableService.orderBy('fixableScore', options)"
|
2016-02-22 23:39:04 +00:00
|
|
|
data-title="Delta of the severity of vulnerabilities in the package before->after upgrading" data-container="body" bs-tooltip>Upgrade impact</a>
|
|
|
|
</td>
|
|
|
|
<td class="hidden-xs hidden-sm hidden-md">
|
|
|
|
Introduced In Image
|
|
|
|
</td>
|
|
|
|
<td class="hidden-xs options-col"></td>
|
|
|
|
</thead>
|
|
|
|
<tbody ng-repeat="feature in orderedFeatures.visibleEntries" bindonce>
|
2016-03-10 20:02:38 +00:00
|
|
|
<tr ng-class="feature.primarySeverity.index == 0 ? 'defcon1' : ''">
|
2016-02-22 23:39:04 +00:00
|
|
|
<td class="single-col">
|
|
|
|
<span bo-text="feature.name"></span>
|
|
|
|
</td>
|
|
|
|
<td class="single-col hidden-xs">
|
|
|
|
<span bo-text="feature.version"></span>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<span class="no-vulns" bo-if="feature.vulnCount == 0">
|
|
|
|
<i class="fa fa-check-circle"></i>None Detected
|
|
|
|
</span>
|
|
|
|
<span class="vuln-summary" bo-if="feature.vulnCount != 0">
|
2016-03-09 20:28:21 +00:00
|
|
|
<span ng-style="{'color': feature.severityBreakdown[0].color}">
|
2016-02-22 23:39:04 +00:00
|
|
|
<i class="fa fa fa-exclamation-triangle"></i>
|
2016-03-09 20:28:21 +00:00
|
|
|
{{ feature.primarySeverity.value }}
|
|
|
|
{{ feature.primarySeverity.label }}
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
2016-03-09 20:28:21 +00:00
|
|
|
<span bo-if="feature.vulnCount - feature.primarySeverity.value > 0">
|
|
|
|
+ {{ feature.vulnCount - feature.primarySeverity.value }} additional
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
|
|
|
</span>
|
|
|
|
</td>
|
|
|
|
<td class="hidden-xs hidden-sm hidden-md">
|
|
|
|
<span class="empty" bo-if="feature.vulnCount == 0">
|
|
|
|
(N/A)
|
|
|
|
</span>
|
2016-03-09 20:28:21 +00:00
|
|
|
<span class="no-vulns" bo-if="feature.vulnCount != 0 && feature.leftoverCount == 0">
|
2016-02-22 23:39:04 +00:00
|
|
|
<i class="fa fa-arrow-circle-right"></i>
|
|
|
|
All identified vulnerabilities fixed
|
|
|
|
</span>
|
2016-03-09 20:28:21 +00:00
|
|
|
<span class="vuln-summary" bo-if="feature.vulnCount != 0 && feature.leftoverCount != 0">
|
2016-02-22 23:39:04 +00:00
|
|
|
<span ng-style="{'color': feature.primaryLeftover.color}">
|
|
|
|
<i class="fa fa-arrow-circle-right"></i>
|
2016-03-09 20:28:21 +00:00
|
|
|
{{ feature.primaryLeftover.value }}
|
|
|
|
{{ feature.primaryLeftover.label }}
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
2016-03-09 20:28:21 +00:00
|
|
|
<span bo-if="feature.leftoverCount - feature.primaryLeftover.value > 0">
|
|
|
|
+ {{ feature.leftoverCount - feature.primaryLeftover.value }} additional
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
|
|
|
</span>
|
|
|
|
</td>
|
|
|
|
<td class="impact-col">
|
|
|
|
<span class="empty" bo-if="feature.vulnCount == 0">
|
|
|
|
(N/A)
|
|
|
|
</span>
|
2016-03-09 20:28:21 +00:00
|
|
|
<span class="empty" bo-if="feature.fixableScore == 0">
|
|
|
|
(No changes)
|
|
|
|
</span>
|
|
|
|
<span bo-if="feature.vulnCount > 0 && feature.fixableScore > 0">
|
|
|
|
<span class="strength-indicator" value="feature.fixableScore" maximum="featuresInfo.highestFixableScore"
|
2016-02-22 23:39:04 +00:00
|
|
|
log-base="2"></span>
|
|
|
|
</span>
|
|
|
|
</td>
|
|
|
|
<td class="double-col image-col hidden-xs hidden-sm hidden-md">
|
2016-03-17 20:55:41 +00:00
|
|
|
<span bo-if="feature.imageCommand">
|
|
|
|
<span data-title="{{ feature.imageCommand }}" data-container="body" bs-tooltip>
|
|
|
|
<span class="dockerfile-command" command="feature.imageCommand"></span>
|
|
|
|
</span>
|
|
|
|
<a href="/repository/{{ repository.namespace }}/{{ repository.name }}/image/{{ feature.imageId }}"><i class="fa fa-archive"></i></a>
|
|
|
|
</span>
|
|
|
|
<span bo-if="!feature.imageCommand">
|
|
|
|
<span class="image-link" repository="repository" image-id="feature.imageId"></span>
|
2016-02-22 23:39:04 +00:00
|
|
|
</span>
|
|
|
|
</td>
|
|
|
|
<td></td>
|
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
2016-03-09 20:28:21 +00:00
|
|
|
<div class="empty" ng-if="featuresInfo.features.length && !orderedFeatures.entries.length"
|
2016-02-22 23:39:04 +00:00
|
|
|
style="margin-top: 20px;">
|
|
|
|
<div class="empty-primary-msg">No matching packages found.</div>
|
|
|
|
<div class="empty-secondary-msg">Try expanding your filtering terms.</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|