cvss2/temporal_metrics.go (93 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cvss2
import "fmt"
type TemporalMetrics struct {
Exploitablity
RemediationLevel
ReportConfidence
}
type Exploitablity int
const (
ExploitablityNotDefined Exploitablity = iota
ExploitablityUnproven
ExploitablityProofOfConcept
ExploitablityFunctional
ExploitablityHigh
)
var (
weightsExploitablity = []float64{1, 0.85, 0.9, 0.95, 1}
codeExploitablity = []string{"ND", "U", "POC", "F", "H"}
)
func (e Exploitablity) defined() bool {
return e != ExploitablityNotDefined
}
func (e Exploitablity) weight() float64 {
return weightsExploitablity[e]
}
func (e Exploitablity) String() string {
return codeExploitablity[e]
}
func (e *Exploitablity) parse(str string) error {
idx, found := findIndex(str, codeExploitablity)
if found {
*e = Exploitablity(idx)
return nil
}
return fmt.Errorf("illegal exploitability code %s", str)
}
type RemediationLevel int
const (
RemediationLevelNotDefined RemediationLevel = iota
RemediationLevelOfficialFix
RemediationLevelTemporaryFix
RemediationLevelWorkaround
RemediationLevelUnavailable
)
var (
weightsRemediationLevel = []float64{1, 0.87, 0.9, 0.95, 1}
codeRemediationLevel = []string{"ND", "OF", "TF", "W", "U"}
)
func (rl RemediationLevel) defined() bool {
return rl != RemediationLevelNotDefined
}
func (rl RemediationLevel) weight() float64 {
return weightsRemediationLevel[rl]
}
func (rl RemediationLevel) String() string {
return codeRemediationLevel[rl]
}
func (rl *RemediationLevel) parse(str string) error {
idx, found := findIndex(str, codeRemediationLevel)
if found {
*rl = RemediationLevel(idx)
return nil
}
return fmt.Errorf("illegal remediation level code %s", str)
}
type ReportConfidence int
const (
ReportConfidenceNotDefined ReportConfidence = iota
ReportConfidenceUnconfirmed
ReportConfidenceUncorroborated
ReportConfidenceConfirmed
)
var (
weightsReportConfidence = []float64{1, 0.9, 0.95, 1}
codeReportConfidence = []string{"ND", "UC", "UR", "C"}
)
func (rc ReportConfidence) defined() bool {
return rc != ReportConfidenceNotDefined
}
func (rc ReportConfidence) weight() float64 {
return weightsReportConfidence[rc]
}
func (rc ReportConfidence) String() string {
return codeReportConfidence[rc]
}
func (rc *ReportConfidence) parse(str string) error {
idx, found := findIndex(str, codeReportConfidence)
if found {
*rc = ReportConfidence(idx)
return nil
}
return fmt.Errorf("illegal report confidence code %s", str)
}