| <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> |