164 lines
4.6 KiB
Go
164 lines
4.6 KiB
Go
package lint
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
/*
|
|
* ZLint Copyright 2024 Regents of the University of Michigan
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
// LintSource is a type representing a known lint source that lints cite
|
|
// requirements from.
|
|
//
|
|
//nolint:revive
|
|
type LintSource string
|
|
|
|
const (
|
|
UnknownLintSource LintSource = "Unknown"
|
|
RFC3279 LintSource = "RFC3279"
|
|
RFC5280 LintSource = "RFC5280"
|
|
RFC5480 LintSource = "RFC5480"
|
|
RFC5891 LintSource = "RFC5891"
|
|
RFC6960 LintSource = "RFC6960"
|
|
RFC6962 LintSource = "RFC6962"
|
|
RFC8813 LintSource = "RFC8813"
|
|
CABFBaselineRequirements LintSource = "CABF_BR"
|
|
CABFCSBaselineRequirements LintSource = "CABF_CS_BR"
|
|
CABFSMIMEBaselineRequirements LintSource = "CABF_SMIME_BR"
|
|
CABFEVGuidelines LintSource = "CABF_EV"
|
|
MozillaRootStorePolicy LintSource = "Mozilla"
|
|
AppleRootStorePolicy LintSource = "Apple"
|
|
Community LintSource = "Community"
|
|
EtsiEsi LintSource = "ETSI_ESI"
|
|
)
|
|
|
|
// UnmarshalJSON implements the json.Unmarshaler interface. It ensures that the
|
|
// unmarshaled value is a known LintSource.
|
|
func (s *LintSource) UnmarshalJSON(data []byte) error {
|
|
var throwAway string
|
|
if err := json.Unmarshal(data, &throwAway); err != nil {
|
|
return err
|
|
}
|
|
|
|
switch LintSource(throwAway) {
|
|
case RFC3279,
|
|
RFC5280,
|
|
RFC5480,
|
|
RFC5891,
|
|
RFC6960,
|
|
RFC6962,
|
|
RFC8813,
|
|
CABFBaselineRequirements,
|
|
CABFCSBaselineRequirements,
|
|
CABFSMIMEBaselineRequirements,
|
|
CABFEVGuidelines,
|
|
MozillaRootStorePolicy,
|
|
AppleRootStorePolicy,
|
|
Community,
|
|
EtsiEsi:
|
|
*s = LintSource(throwAway)
|
|
return nil
|
|
default:
|
|
*s = UnknownLintSource
|
|
return fmt.Errorf("unknown LintSource value %q", throwAway)
|
|
}
|
|
}
|
|
|
|
// FromString sets the LintSource value based on the source string provided
|
|
// (case sensitive). If the src string does not match any of the known
|
|
// LintSource's then s is set to the UnknownLintSource.
|
|
func (s *LintSource) FromString(src string) {
|
|
// Start with the unknown lint source
|
|
*s = UnknownLintSource
|
|
// Trim space and try to match a known value
|
|
src = strings.TrimSpace(src)
|
|
switch LintSource(src) {
|
|
case RFC3279:
|
|
*s = RFC3279
|
|
case RFC5280:
|
|
*s = RFC5280
|
|
case RFC5480:
|
|
*s = RFC5480
|
|
case RFC5891:
|
|
*s = RFC5891
|
|
case RFC6962:
|
|
*s = RFC6962
|
|
case RFC8813:
|
|
*s = RFC8813
|
|
case CABFBaselineRequirements:
|
|
*s = CABFBaselineRequirements
|
|
case CABFCSBaselineRequirements:
|
|
*s = CABFCSBaselineRequirements
|
|
case CABFSMIMEBaselineRequirements:
|
|
*s = CABFSMIMEBaselineRequirements
|
|
case CABFEVGuidelines:
|
|
*s = CABFEVGuidelines
|
|
case MozillaRootStorePolicy:
|
|
*s = MozillaRootStorePolicy
|
|
case AppleRootStorePolicy:
|
|
*s = AppleRootStorePolicy
|
|
case Community:
|
|
*s = Community
|
|
case EtsiEsi:
|
|
*s = EtsiEsi
|
|
}
|
|
}
|
|
|
|
// SourceList is a slice of LintSources that can be sorted.
|
|
//
|
|
//nolint:recvcheck
|
|
type SourceList []LintSource
|
|
|
|
// Len returns the length of the list.
|
|
func (l SourceList) Len() int {
|
|
return len(l)
|
|
}
|
|
|
|
// Swap swaps the LintSource at index i and j in the list.
|
|
func (l SourceList) Swap(i, j int) {
|
|
l[i], l[j] = l[j], l[i]
|
|
}
|
|
|
|
// Less compares the LintSources at index i and j lexicographically.
|
|
func (l SourceList) Less(i, j int) bool {
|
|
return l[i] < l[j]
|
|
}
|
|
|
|
// FromString populates a SourceList (replacing any existing content) with the
|
|
// comma separated list of sources provided in raw. If any of the comma
|
|
// separated values are not known LintSource's an error is returned.
|
|
func (l *SourceList) FromString(raw string) error {
|
|
// Start with an empty list
|
|
*l = SourceList{}
|
|
|
|
values := strings.Split(raw, ",")
|
|
for _, val := range values {
|
|
val = strings.TrimSpace(val)
|
|
if val == "" {
|
|
continue
|
|
}
|
|
// Populate the LintSource with the trimmed value.
|
|
var src LintSource
|
|
src.FromString(val)
|
|
// If the LintSource is UnknownLintSource then return an error.
|
|
if src == UnknownLintSource {
|
|
return fmt.Errorf("unknown lint source in list: %q", val)
|
|
}
|
|
*l = append(*l, src)
|
|
}
|
|
return nil
|
|
}
|