mirror of
https://github.com/gocsaf/csaf.git
synced 2025-12-22 05:40:11 +01:00
Implement remote validation in checker.
This commit is contained in:
parent
1d0499ddea
commit
e004939abf
3 changed files with 56 additions and 4 deletions
|
|
@ -39,6 +39,10 @@ type options struct {
|
||||||
Rate *float64 `long:"rate" short:"r" description:"The average upper limit of https operations per second"`
|
Rate *float64 `long:"rate" short:"r" description:"The average upper limit of https operations per second"`
|
||||||
Years *uint `long:"years" short:"y" description:"Number of years to look back from now" value-name:"YEARS"`
|
Years *uint `long:"years" short:"y" description:"Number of years to look back from now" value-name:"YEARS"`
|
||||||
|
|
||||||
|
RemoteValidator string `long:"validator" description:"URL to validate documents remotely" value-name:"URL"`
|
||||||
|
RemoteValidatorCache string `long:"validatorcache" description:"FILE to cache remote validations" value-name:"FILE"`
|
||||||
|
RemoteValidatorPresets []string `long:"validatorpreset" description:"One or more presets to validate remotely"`
|
||||||
|
|
||||||
clientCerts []tls.Certificate
|
clientCerts []tls.Certificate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -154,6 +158,17 @@ func buildReporters() []reporter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run uses a processor to check all the given domains
|
||||||
|
// and generates a report.
|
||||||
|
func run(opts *options, domains []string) (*Report, error) {
|
||||||
|
p, err := newProcessor(opts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer p.close()
|
||||||
|
return p.run(buildReporters(), domains)
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
opts := new(options)
|
opts := new(options)
|
||||||
|
|
||||||
|
|
@ -172,9 +187,7 @@ func main() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
p := newProcessor(opts)
|
report, err := run(opts, domains)
|
||||||
|
|
||||||
report, err := p.run(buildReporters(), domains)
|
|
||||||
errCheck(err)
|
errCheck(err)
|
||||||
|
|
||||||
errCheck(writeReport(report, opts))
|
errCheck(writeReport(report, opts))
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ type topicMessages []Message
|
||||||
|
|
||||||
type processor struct {
|
type processor struct {
|
||||||
opts *options
|
opts *options
|
||||||
|
validator csaf.RemoteValidator
|
||||||
client util.Client
|
client util.Client
|
||||||
ageAccept func(time.Time) bool
|
ageAccept func(time.Time) bool
|
||||||
|
|
||||||
|
|
@ -146,12 +147,37 @@ func (m *topicMessages) used() bool { return *m != nil }
|
||||||
|
|
||||||
// newProcessor returns a processor structure after assigning the given options to the opts attribute
|
// newProcessor returns a processor structure after assigning the given options to the opts attribute
|
||||||
// and initializing the "alreadyChecked" and "expr" fields.
|
// and initializing the "alreadyChecked" and "expr" fields.
|
||||||
func newProcessor(opts *options) *processor {
|
func newProcessor(opts *options) (*processor, error) {
|
||||||
|
|
||||||
|
var validator csaf.RemoteValidator
|
||||||
|
|
||||||
|
if opts.RemoteValidator != "" {
|
||||||
|
validatorOptions := csaf.RemoteValidatorOptions{
|
||||||
|
URL: opts.RemoteValidator,
|
||||||
|
Presets: opts.RemoteValidatorPresets,
|
||||||
|
Cache: opts.RemoteValidatorCache,
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
if validator, err = validatorOptions.Open(); err != nil {
|
||||||
|
return nil, fmt.Errorf(
|
||||||
|
"preparing remote validator failed: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return &processor{
|
return &processor{
|
||||||
opts: opts,
|
opts: opts,
|
||||||
alreadyChecked: map[string]whereType{},
|
alreadyChecked: map[string]whereType{},
|
||||||
expr: util.NewPathEval(),
|
expr: util.NewPathEval(),
|
||||||
ageAccept: ageAccept(opts),
|
ageAccept: ageAccept(opts),
|
||||||
|
validator: validator,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// close closes external ressources of the processor.
|
||||||
|
func (p *processor) close() {
|
||||||
|
if p.validator != nil {
|
||||||
|
p.validator.Close()
|
||||||
|
p.validator = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -451,6 +477,7 @@ func (p *processor) integrity(
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate against JSON schema.
|
||||||
errors, err := csaf.ValidateCSAF(doc)
|
errors, err := csaf.ValidateCSAF(doc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lg(ErrorType, "Failed to validate %s: %v", u, err)
|
lg(ErrorType, "Failed to validate %s: %v", u, err)
|
||||||
|
|
@ -460,6 +487,15 @@ func (p *processor) integrity(
|
||||||
lg(ErrorType, "CSAF file %s has %d validation errors.", u, len(errors))
|
lg(ErrorType, "CSAF file %s has %d validation errors.", u, len(errors))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate against remote validator.
|
||||||
|
if p.validator != nil {
|
||||||
|
if ok, err := p.validator.Validate(doc); err != nil {
|
||||||
|
lg(ErrorType, "Calling remote validator on %s failed: %v", u, err)
|
||||||
|
} else if !ok {
|
||||||
|
lg(ErrorType, "Remote validation of %s failed.", u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check if file is in the right folder.
|
// Check if file is in the right folder.
|
||||||
p.badFolders.use()
|
p.badFolders.use()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,9 @@ Application Options:
|
||||||
-v, --verbose Verbose output
|
-v, --verbose Verbose output
|
||||||
-r, --rate= The average upper limit of https operations per second
|
-r, --rate= The average upper limit of https operations per second
|
||||||
-y, --years=YEARS Number of years to look back from now
|
-y, --years=YEARS Number of years to look back from now
|
||||||
|
--validator=URL URL to validate documents remotely
|
||||||
|
--validatorcache=FILE FILE to cache remote validations
|
||||||
|
--validatorpreset= One or more presets to validate remotely
|
||||||
|
|
||||||
Help Options:
|
Help Options:
|
||||||
-h, --help Show this help message
|
-h, --help Show this help message
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue