1
0
Fork 0
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:
Sascha L. Teichmann 2023-01-25 10:27:44 +01:00
parent 1d0499ddea
commit e004939abf
3 changed files with 56 additions and 4 deletions

View file

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

View file

@ -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()

View file

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