blob: b45340555b76dafbbece08197f66a12e8e3f040e [file]
<template>
<div class="cvss">
<div class="cvss-header">
<p class="score">{{cvssVersion}} score: <strong>{{cvssData.score}}</strong></p>
<button class="toggle-cvss" @click="showHide">{{showHideText}} {{cvssVersion}} details</button>
</div>
<div v-show="isShowing" class='cvss-columns'>
<div class='cvss-column' v-for="(values, category) in cvss" v-bind:key="category">
<h5>{{category}}</h5>
<div v-for="(active, type) in values" v-bind:key="type">
<div v-if="active" class="cvss-metric cvss-highlighted">{{ type }}</div>
<div v-if="!active" class="cvss-metric">{{ type }}</div>
</div>
</div>
</div>
</div>
</template>
<script>
var cvss3Template = {
'Attack Vector': {
'Network': false,
'Adjacent': false,
'Local': false,
'Physical': false
},
'Attack Complexity': {
'Low': false,
'High': false
},
'Availability': {
'Low': false,
'High': false,
'None': false
},
'Confidentiality': {
'None': false,
'Partial': false,
'Complete': false
},
'Integrity': {
'None': false,
'Partial': false,
'Complete': false
},
'Privileges Required': {
'None': false,
'Low': false,
'High': false
},
'Scope': {
'Changed': false,
'Unchanged': false
},
'User Interaction': {
'None': false,
'Required': false
}
}
var cvss2Template = {
'Access Complexity': {
'Low': false,
'Medium': false,
'High': false
},
'Access Vector': {
'Local Access': false,
'Adjacent Network': false,
'Network Accessible': false
},
'Authentication': {
'Multiple': false,
'Single': false,
'None': false
},
'Availability Impact': {
'None': false,
'Partial': false,
'Complete': false
},
'Confidentiality Impact': {
'None': false,
'Partial': false,
'Complete': false
},
'Integrity Impact': {
'None': false,
'Partial': false,
'Complete': false
}
}
export default {
props: ['cvssData', 'cvssVersion'],
data () {
return {
stream: [],
contents: [],
cvss: null,
errors: [],
isShowing: false,
showHideText: 'show'
}
},
created () {
this.load()
},
watch: {
'$route' () {
this.load()
}
},
methods: {
load: function () {
// set cvss template based on cvssVersion
if (this.$props.cvssVersion === 'cvss2') {this.$data.cvss = cvss2Template}
if (this.$props.cvssVersion === 'cvss3') {this.$data.cvss = cvss3Template}
var data = this.$props.cvssData
for (var [key, value] of Object.entries(this.$data.cvss)) {
for (var name of Object.keys(value)) {
if (data[key] == name) {
this.$data.cvss[key][name] = true
}
else {
this.$data.cvss[key][name] = false
}
}
}
},
showHide: function () {
this.$data.isShowing ^= true
if (this.$data.showHideText == 'show') {
this.$data.showHideText = 'hide'
} else {
this.$data.showHideText = 'show'
}
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.cvss-header {
margin: 2em 0 0 0;
padding: 0 0 0 1em;
color: white;
background-color: #354649;
}
.score {
text-transform: uppercase;
font-size: 1.25em;
display: inline-block;
}
.score strong {
font-size: 1.5em;
}
.toggle-cvss {
font-size: 10px;
font-weight: 700;
color: #354649;
text-transform: uppercase;
background-color: white;
border: none;
padding: .5em;
float: right;
display: inline-block;
margin: .5em;
}
.cvss-metric {
width: 8em;
margin: 0 1em .5em 0;
padding: .5em;
background-color:lightgrey;
border: none;
display: block;
}
.cvss-highlighted {
background-color: #ffc2ab;
}
.cvss-column {
display: inline-block;
vertical-align: top;
margin: 0 .5em 0 0;
}
.cvss-column h5 {
text-align: left;
}
</style>