1
0
Fork 0
mirror of https://github.com/gocsaf/csaf.git synced 2025-12-22 18:15:42 +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"`
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
}
@ -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() {
opts := new(options)
@ -172,9 +187,7 @@ func main() {
return
}
p := newProcessor(opts)
report, err := p.run(buildReporters(), domains)
report, err := run(opts, domains)
errCheck(err)
errCheck(writeReport(report, opts))

View file

@ -41,6 +41,7 @@ type topicMessages []Message
type processor struct {
opts *options
validator csaf.RemoteValidator
client util.Client
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
// 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{
opts: opts,
alreadyChecked: map[string]whereType{},
expr: util.NewPathEval(),
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
}
// Validate against JSON schema.
errors, err := csaf.ValidateCSAF(doc)
if err != nil {
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))
}
// 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.
p.badFolders.use()

View file

@ -15,6 +15,9 @@ Application Options:
-v, --verbose Verbose output
-r, --rate= The average upper limit of https operations per second
-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:
-h, --help Show this help message