mirror of
https://github.com/gocsaf/csaf.git
synced 2025-12-22 18:15:42 +01:00
Merge branch 'main' into sha-handling
This commit is contained in:
commit
a5f4b10c4e
67 changed files with 236 additions and 215 deletions
4
.github/workflows/itest.yml
vendored
4
.github/workflows/itest.yml
vendored
|
|
@ -9,7 +9,7 @@ jobs:
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: 1.21.0
|
go-version: 1.22.0
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
|
|
@ -25,7 +25,7 @@ jobs:
|
||||||
sudo apt install -y make nginx fcgiwrap gnutls-bin
|
sudo apt install -y make nginx fcgiwrap gnutls-bin
|
||||||
cp -r $GITHUB_WORKSPACE ~
|
cp -r $GITHUB_WORKSPACE ~
|
||||||
cd ~
|
cd ~
|
||||||
cd csaf_distribution/docs/scripts/
|
cd csaf/docs/scripts/
|
||||||
# keep in sync with docs/scripts/Readme.md
|
# keep in sync with docs/scripts/Readme.md
|
||||||
export FOLDERNAME=devca1 ORGANAME="CSAF Tools Development (internal)"
|
export FOLDERNAME=devca1 ORGANAME="CSAF Tools Development (internal)"
|
||||||
source ./TLSConfigsForITest.sh
|
source ./TLSConfigsForITest.sh
|
||||||
|
|
|
||||||
6
.github/workflows/release.yml
vendored
6
.github/workflows/release.yml
vendored
|
|
@ -8,6 +8,8 @@ jobs:
|
||||||
releases-matrix:
|
releases-matrix:
|
||||||
name: Release Go binaries
|
name: Release Go binaries
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
@ -24,5 +26,5 @@ jobs:
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
dist/csaf_distribution-*.zip
|
dist/csaf-*.zip
|
||||||
dist/csaf_distribution-*.tar.gz
|
dist/csaf-*.tar.gz
|
||||||
|
|
|
||||||
16
Makefile
16
Makefile
|
|
@ -6,7 +6,7 @@
|
||||||
# SPDX-FileCopyrightText: 2021 German Federal Office for Information Security (BSI) <https://www.bsi.bund.de>
|
# SPDX-FileCopyrightText: 2021 German Federal Office for Information Security (BSI) <https://www.bsi.bund.de>
|
||||||
# Software-Engineering: 2021 Intevation GmbH <https://intevation.de>
|
# Software-Engineering: 2021 Intevation GmbH <https://intevation.de>
|
||||||
#
|
#
|
||||||
# Makefile to build csaf_distribution components
|
# Makefile to build csaf components
|
||||||
|
|
||||||
SHELL = /bin/bash
|
SHELL = /bin/bash
|
||||||
BUILD = go build
|
BUILD = go build
|
||||||
|
|
@ -41,7 +41,7 @@ tag_checked_out:
|
||||||
# into a semver version. For this we increase the PATCH number, so that
|
# into a semver version. For this we increase the PATCH number, so that
|
||||||
# any commit after a tag is considered newer than the semver from the tag
|
# any commit after a tag is considered newer than the semver from the tag
|
||||||
# without an optional 'v'
|
# without an optional 'v'
|
||||||
# Note we need `--tags` because github release only creates lightweight tags
|
# Note we need `--tags` because github releases only create lightweight tags
|
||||||
# (see feature request https://github.com/github/feedback/discussions/4924).
|
# (see feature request https://github.com/github/feedback/discussions/4924).
|
||||||
# We use `--always` in case of being run as github action with shallow clone.
|
# We use `--always` in case of being run as github action with shallow clone.
|
||||||
# In this case we might in some situations see an error like
|
# In this case we might in some situations see an error like
|
||||||
|
|
@ -50,16 +50,16 @@ tag_checked_out:
|
||||||
GITDESC := $(shell git describe --tags --always)
|
GITDESC := $(shell git describe --tags --always)
|
||||||
GITDESCPATCH := $(shell echo '$(GITDESC)' | sed -E 's/v?[0-9]+\.[0-9]+\.([0-9]+)[-+]?.*/\1/')
|
GITDESCPATCH := $(shell echo '$(GITDESC)' | sed -E 's/v?[0-9]+\.[0-9]+\.([0-9]+)[-+]?.*/\1/')
|
||||||
SEMVERPATCH := $(shell echo $$(( $(GITDESCPATCH) + 1 )))
|
SEMVERPATCH := $(shell echo $$(( $(GITDESCPATCH) + 1 )))
|
||||||
# Hint: The regexp in the next line only matches if there is a hyphen (`-`)
|
# Hint: The second regexp in the next line only matches
|
||||||
# followed by a number, by which we assume that git describe
|
# if there is a hyphen (`-`) followed by a number,
|
||||||
# has added a string after the tag
|
# by which we assume that git describe has added a string after the tag
|
||||||
SEMVER := $(shell echo '$(GITDESC)' | sed -E 's/v?([0-9]+\.[0-9]+\.)([0-9]+)(-[1-9].*)/\1$(SEMVERPATCH)\3/' )
|
SEMVER := $(shell echo '$(GITDESC)' | sed -E -e 's/^v//' -e 's/([0-9]+\.[0-9]+\.)([0-9]+)(-[1-9].*)/\1$(SEMVERPATCH)\3/' )
|
||||||
testsemver:
|
testsemver:
|
||||||
@echo from \'$(GITDESC)\' transformed to \'$(SEMVER)\'
|
@echo from \'$(GITDESC)\' transformed to \'$(SEMVER)\'
|
||||||
|
|
||||||
|
|
||||||
# Set -ldflags parameter to pass the semversion.
|
# Set -ldflags parameter to pass the semversion.
|
||||||
LDFLAGS = -ldflags "-X github.com/csaf-poc/csaf_distribution/v3/util.SemVersion=$(SEMVER)"
|
LDFLAGS = -ldflags "-X github.com/gocsaf/csaf/v3/util.SemVersion=$(SEMVER)"
|
||||||
|
|
||||||
# Build binaries and place them under bin-$(GOOS)-$(GOARCH)
|
# Build binaries and place them under bin-$(GOOS)-$(GOARCH)
|
||||||
# Using 'Target-specific Variable Values' to specify the build target system
|
# Using 'Target-specific Variable Values' to specify the build target system
|
||||||
|
|
@ -78,7 +78,7 @@ build_linux build_win build_mac_amd64 build_mac_arm64:
|
||||||
env GOARCH=$(GOARCH) GOOS=$(GOOS) $(BUILD) -o $(BINDIR) $(LDFLAGS) -v ./cmd/...
|
env GOARCH=$(GOARCH) GOOS=$(GOOS) $(BUILD) -o $(BINDIR) $(LDFLAGS) -v ./cmd/...
|
||||||
|
|
||||||
|
|
||||||
DISTDIR := csaf_distribution-$(SEMVER)
|
DISTDIR := csaf-$(SEMVER)
|
||||||
dist: build_linux build_win build_mac_amd64 build_mac_arm64
|
dist: build_linux build_win build_mac_amd64 build_mac_arm64
|
||||||
mkdir -p dist
|
mkdir -p dist
|
||||||
mkdir -p dist/$(DISTDIR)-windows-amd64/bin-windows-amd64
|
mkdir -p dist/$(DISTDIR)-windows-amd64/bin-windows-amd64
|
||||||
|
|
|
||||||
22
README.md
22
README.md
|
|
@ -8,7 +8,17 @@
|
||||||
Software-Engineering: 2024 Intevation GmbH <https://intevation.de>
|
Software-Engineering: 2024 Intevation GmbH <https://intevation.de>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
# csaf_distribution
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> To avoid future breakage, if you still use `csaf-poc`:
|
||||||
|
> 1. Adjust your HTML links.
|
||||||
|
> 2. Adjust your go module paths, see [#579](https://github.com/gocsaf/csaf/issues/579#issuecomment-2497244379).
|
||||||
|
>
|
||||||
|
> (This repository was moved here on 2024-10-28. The old one is deprecated
|
||||||
|
> and redirection will be switched off a few months later.)
|
||||||
|
|
||||||
|
|
||||||
|
# csaf
|
||||||
|
|
||||||
Implements a [CSAF](https://csaf.io/)
|
Implements a [CSAF](https://csaf.io/)
|
||||||
([specification v2.0](https://docs.oasis-open.org/csaf/csaf/v2.0/os/csaf-v2.0-os.html)
|
([specification v2.0](https://docs.oasis-open.org/csaf/csaf/v2.0/os/csaf-v2.0-os.html)
|
||||||
|
|
@ -42,10 +52,10 @@ is a CSAF Aggregator, to list or mirror providers.
|
||||||
## Other stuff
|
## Other stuff
|
||||||
|
|
||||||
### [examples](./examples/README.md)
|
### [examples](./examples/README.md)
|
||||||
are small examples of how to use `github.com/csaf-poc/csaf_distribution`
|
are small examples of how to use `github.com/gocsaf/csaf`
|
||||||
as an API. Currently this is a work in progress, as usage of this repository
|
as an API. Currently this is a work in progress, as usage of this repository
|
||||||
as a library to access is _not officially supported_, e.g.
|
as a library to access is _not officially supported_, e.g.
|
||||||
see https://github.com/csaf-poc/csaf_distribution/issues/367 .
|
see https://github.com/gocsaf/csaf/issues/367 .
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
Binaries for the server side are only available and tested
|
Binaries for the server side are only available and tested
|
||||||
|
|
@ -69,9 +79,9 @@ Download the binaries from the most recent release assets on Github.
|
||||||
|
|
||||||
### Build from sources
|
### Build from sources
|
||||||
|
|
||||||
- A recent version of **Go** (1.21+) should be installed. [Go installation](https://go.dev/doc/install)
|
- A recent version of **Go** (1.22+) should be installed. [Go installation](https://go.dev/doc/install)
|
||||||
|
|
||||||
- Clone the repository `git clone https://github.com/csaf-poc/csaf_distribution.git `
|
- Clone the repository `git clone https://github.com/gocsaf/csaf.git `
|
||||||
|
|
||||||
- Build Go components Makefile supplies the following targets:
|
- Build Go components Makefile supplies the following targets:
|
||||||
- Build for GNU/Linux system: `make build_linux`
|
- Build for GNU/Linux system: `make build_linux`
|
||||||
|
|
@ -100,7 +110,7 @@ For further details of the development process consult our [development page](./
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
- `csaf_distribution` is licensed as Free Software under the terms of the [Apache License, Version 2.0](./LICENSES/Apache-2.0.txt).
|
- `csaf` is licensed as Free Software under the terms of the [Apache License, Version 2.0](./LICENSES/Apache-2.0.txt).
|
||||||
|
|
||||||
- See the specific source files
|
- See the specific source files
|
||||||
for details, the license itself can be found in the directory `LICENSES/`.
|
for details, the license itself can be found in the directory `LICENSES/`.
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errNotFound = errors.New("not found")
|
var errNotFound = errors.New("not found")
|
||||||
|
|
|
||||||
|
|
@ -20,12 +20,12 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/certs"
|
"github.com/gocsaf/csaf/v3/internal/certs"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/filter"
|
"github.com/gocsaf/csaf/v3/internal/filter"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/models"
|
"github.com/gocsaf/csaf/v3/internal/models"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
"golang.org/x/time/rate"
|
"golang.org/x/time/rate"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -301,6 +301,11 @@ func (c *config) httpClient(p *provider) util.Client {
|
||||||
Client: client,
|
Client: client,
|
||||||
Header: c.ExtraHeader,
|
Header: c.ExtraHeader,
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
client = &util.HeaderClient{
|
||||||
|
Client: client,
|
||||||
|
Header: http.Header{},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Verbose {
|
if c.Verbose {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type fullJob struct {
|
type fullJob struct {
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type interimJob struct {
|
type interimJob struct {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type lazyTransaction struct {
|
type lazyTransaction struct {
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// mirrorAllowed checks if mirroring is allowed.
|
// mirrorAllowed checks if mirroring is allowed.
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
|
|
||||||
"github.com/gofrs/flock"
|
"github.com/gofrs/flock"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,8 @@ import (
|
||||||
"github.com/ProtonMail/gopenpgp/v2/constants"
|
"github.com/ProtonMail/gopenpgp/v2/constants"
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// mirrorAllowed checks if mirroring is allowed.
|
// mirrorAllowed checks if mirroring is allowed.
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
|
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,10 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/certs"
|
"github.com/gocsaf/csaf/v3/internal/certs"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/filter"
|
"github.com/gocsaf/csaf/v3/internal/filter"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/models"
|
"github.com/gocsaf/csaf/v3/internal/models"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
type outputFormat string
|
type outputFormat string
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import (
|
||||||
|
|
||||||
"github.com/PuerkitoBio/goquery"
|
"github.com/PuerkitoBio/goquery"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
// run uses a processor to check all the given domains or direct urls
|
// run uses a processor to check all the given domains or direct urls
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,8 @@ import (
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
"golang.org/x/time/rate"
|
"golang.org/x/time/rate"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// topicMessages stores the collected topicMessages for a specific topic.
|
// topicMessages stores the collected topicMessages for a specific topic.
|
||||||
|
|
@ -429,12 +429,10 @@ func (p *processor) fullClient() util.Client {
|
||||||
client := util.Client(&hClient)
|
client := util.Client(&hClient)
|
||||||
|
|
||||||
// Add extra headers.
|
// Add extra headers.
|
||||||
if len(p.cfg.ExtraHeader) > 0 {
|
|
||||||
client = &util.HeaderClient{
|
client = &util.HeaderClient{
|
||||||
Client: client,
|
Client: client,
|
||||||
Header: p.cfg.ExtraHeader,
|
Header: p.cfg.ExtraHeader,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Add optional URL logging.
|
// Add optional URL logging.
|
||||||
if p.cfg.Verbose {
|
if p.cfg.Verbose {
|
||||||
|
|
@ -1443,9 +1441,9 @@ func (p *processor) checkWellknownSecurityDNS(domain string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkPGPKeys checks if the OpenPGP keys are available and valid, fetches
|
// checkPGPKeys checks if the OpenPGP keys are available and valid, fetches
|
||||||
// the the remotely keys and compares the fingerprints.
|
// the remote pubkeys and compares the fingerprints.
|
||||||
// As a result of these a respective error messages are passed to badPGP method
|
// As a result of these checks respective error messages are passed
|
||||||
// in case of errors. It returns nil if all checks are passed.
|
// to badPGP methods. It returns nil if all checks are passed.
|
||||||
func (p *processor) checkPGPKeys(_ string) error {
|
func (p *processor) checkPGPKeys(_ string) error {
|
||||||
p.badPGPs.use()
|
p.badPGPs.use()
|
||||||
|
|
||||||
|
|
@ -1511,7 +1509,7 @@ func (p *processor) checkPGPKeys(_ string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !strings.EqualFold(ckey.GetFingerprint(), string(key.Fingerprint)) {
|
if !strings.EqualFold(ckey.GetFingerprint(), string(key.Fingerprint)) {
|
||||||
p.badPGPs.error("Fingerprint of public OpenPGP key %s does not match remotely loaded.", u)
|
p.badPGPs.error("Given Fingerprint (%q) of public OpenPGP key %q does not match remotely loaded (%q).", string(key.Fingerprint), u, ckey.GetFingerprint())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if p.keys == nil {
|
if p.keys == nil {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/models"
|
"github.com/gocsaf/csaf/v3/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MessageType is the kind of the message.
|
// MessageType is the kind of the message.
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// identifier consist of document/tracking/id and document/publisher/namespace,
|
// identifier consist of document/tracking/id and document/publisher/namespace,
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ruleCondition int
|
type ruleCondition int
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,10 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/certs"
|
"github.com/gocsaf/csaf/v3/internal/certs"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/filter"
|
"github.com/gocsaf/csaf/v3/internal/filter"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/models"
|
"github.com/gocsaf/csaf/v3/internal/models"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -34,8 +34,8 @@ import (
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
"golang.org/x/time/rate"
|
"golang.org/x/time/rate"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type hashFetchInfo struct {
|
type hashFetchInfo struct {
|
||||||
|
|
@ -138,12 +138,10 @@ func (d *downloader) httpClient() util.Client {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add extra headers.
|
// Add extra headers.
|
||||||
if len(d.cfg.ExtraHeader) > 0 {
|
|
||||||
client = &util.HeaderClient{
|
client = &util.HeaderClient{
|
||||||
Client: client,
|
Client: client,
|
||||||
Header: d.cfg.ExtraHeader,
|
Header: d.cfg.ExtraHeader,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Add optional URL logging.
|
// Add optional URL logging.
|
||||||
if d.cfg.verbose() {
|
if d.cfg.verbose() {
|
||||||
|
|
@ -378,7 +376,7 @@ func (d *downloader) loadOpenPGPKeys(
|
||||||
if !strings.EqualFold(ckey.GetFingerprint(), string(key.Fingerprint)) {
|
if !strings.EqualFold(ckey.GetFingerprint(), string(key.Fingerprint)) {
|
||||||
slog.Warn(
|
slog.Warn(
|
||||||
"Fingerprint of public OpenPGP key does not match remotely loaded",
|
"Fingerprint of public OpenPGP key does not match remotely loaded",
|
||||||
"url", u)
|
"url", u, "fingerprint", key.Fingerprint, "remote-fingerprint", ckey.GetFingerprint())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if d.keys == nil {
|
if d.keys == nil {
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/misc"
|
"github.com/gocsaf/csaf/v3/internal/misc"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// failedForwardDir is the name of the special sub folder
|
// failedForwardDir is the name of the special sub folder
|
||||||
|
|
@ -111,12 +111,10 @@ func (f *forwarder) httpClient() util.Client {
|
||||||
client := util.Client(&hClient)
|
client := util.Client(&hClient)
|
||||||
|
|
||||||
// Add extra headers.
|
// Add extra headers.
|
||||||
if len(f.cfg.ForwardHeader) > 0 {
|
|
||||||
client = &util.HeaderClient{
|
client = &util.HeaderClient{
|
||||||
Client: client,
|
Client: client,
|
||||||
Header: f.cfg.ForwardHeader,
|
Header: f.cfg.ForwardHeader,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Add optional URL logging.
|
// Add optional URL logging.
|
||||||
if f.cfg.verbose() {
|
if f.cfg.verbose() {
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidationStatusUpdate(t *testing.T) {
|
func TestValidationStatusUpdate(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
func run(cfg *config, domains []string) error {
|
func run(cfg *config, domains []string) error {
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ import (
|
||||||
"github.com/ProtonMail/gopenpgp/v2/constants"
|
"github.com/ProtonMail/gopenpgp/v2/constants"
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
const dateFormat = time.RFC3339
|
const dateFormat = time.RFC3339
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import (
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,8 @@ import (
|
||||||
|
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ensureFolders initializes the paths and call functions to create
|
// ensureFolders initializes the paths and call functions to create
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"crypto/sha512"
|
"crypto/sha512"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func writeHashedFile(fname, name string, data []byte, armored string) error {
|
func writeHashedFile(fname, name string, data []byte, armored string) error {
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func updateIndex(dir, fname string) error {
|
func updateIndex(dir, fname string) error {
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import (
|
||||||
|
|
||||||
"github.com/jessevdk/go-flags"
|
"github.com/jessevdk/go-flags"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type options struct {
|
type options struct {
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// mergeCategories merges the given categories into the old ones.
|
// mergeCategories merges the given categories into the old ones.
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func doTransaction(
|
func doTransaction(
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import (
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
"golang.org/x/term"
|
"golang.org/x/term"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/certs"
|
"github.com/gocsaf/csaf/v3/internal/certs"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
"github.com/gocsaf/csaf/v3/internal/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
// Implements a command line tool that uploads csaf documents to csaf_provider.
|
// Implements a command line tool that uploads csaf documents to csaf_provider.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/csaf-poc/csaf_distribution/v3/internal/options"
|
import "github.com/gocsaf/csaf/v3/internal/options"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
args, cfg, err := parseArgsConfig()
|
args, cfg, err := parseArgsConfig()
|
||||||
|
|
|
||||||
|
|
@ -26,9 +26,9 @@ import (
|
||||||
"github.com/ProtonMail/gopenpgp/v2/constants"
|
"github.com/ProtonMail/gopenpgp/v2/constants"
|
||||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/internal/misc"
|
"github.com/gocsaf/csaf/v3/internal/misc"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type processor struct {
|
type processor struct {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import (
|
||||||
|
|
||||||
"github.com/jessevdk/go-flags"
|
"github.com/jessevdk/go-flags"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type options struct {
|
type options struct {
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AdvisoryFile constructs the urls of a remote file.
|
// AdvisoryFile constructs the urls of a remote file.
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TLPLabel is the traffic light policy of the CSAF.
|
// TLPLabel is the traffic light policy of the CSAF.
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProviderMetadataLoader helps load provider-metadata.json from
|
// ProviderMetadataLoader helps load provider-metadata.json from
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ROLIEServiceWorkspaceCollectionCategoriesCategory is a category in a ROLIE service collection.
|
// ROLIEServiceWorkspaceCollectionCategoriesCategory is a category in a ROLIE service collection.
|
||||||
|
|
|
||||||
|
|
@ -175,7 +175,7 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"metadata",
|
"metadata",
|
||||||
"mirror",
|
"mirrors",
|
||||||
"update_interval"
|
"update_interval"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ package csaf
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
## Supported Go versions
|
## Supported Go versions
|
||||||
|
|
||||||
We support the latest version and the one before
|
We support the latest version and the one before
|
||||||
the latest version of Go (currently 1.22 and 1.21).
|
the latest version of Go (currently 1.22 and 1.23).
|
||||||
|
|
||||||
## Generated files
|
## Generated files
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ Help Options:
|
||||||
```
|
```
|
||||||
|
|
||||||
If no config file is explictly given the follwing places are searched for a config file:
|
If no config file is explictly given the follwing places are searched for a config file:
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.config/csaf/aggregator.toml
|
~/.config/csaf/aggregator.toml
|
||||||
~/.csaf_aggregator.toml
|
~/.csaf_aggregator.toml
|
||||||
|
|
@ -25,6 +26,7 @@ csaf_aggregator.toml
|
||||||
with `~` expanding to `$HOME` on unixoid systems and `%HOMEPATH` on Windows systems.
|
with `~` expanding to `$HOME` on unixoid systems and `%HOMEPATH` on Windows systems.
|
||||||
|
|
||||||
Usage example for a single run, to test if the config is good:
|
Usage example for a single run, to test if the config is good:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./csaf_aggregator -c docs/examples/aggregator.toml
|
./csaf_aggregator -c docs/examples/aggregator.toml
|
||||||
```
|
```
|
||||||
|
|
@ -62,7 +64,6 @@ SHELL=/bin/bash
|
||||||
30 0-23 * * * $HOME/bin/csaf_aggregator --config /etc/csaf_aggregator.toml --interim >> /var/log/csaf_aggregator/interim.log 2>&1
|
30 0-23 * * * $HOME/bin/csaf_aggregator --config /etc/csaf_aggregator.toml --interim >> /var/log/csaf_aggregator/interim.log 2>&1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
#### serve via web server
|
#### serve via web server
|
||||||
|
|
||||||
Serve the paths where the aggregator writes its `html/` output
|
Serve the paths where the aggregator writes its `html/` output
|
||||||
|
|
@ -78,7 +79,6 @@ a template. For the aggregator the difference is that you can leave out
|
||||||
the cgi-bin part, potentially commend out the TLS client parts and
|
the cgi-bin part, potentially commend out the TLS client parts and
|
||||||
adjust the `root` path accordingly.
|
adjust the `root` path accordingly.
|
||||||
|
|
||||||
|
|
||||||
### config options
|
### config options
|
||||||
|
|
||||||
The config file is written in [TOML](https://toml.io/en/v1.0.0).
|
The config file is written in [TOML](https://toml.io/en/v1.0.0).
|
||||||
|
|
@ -118,10 +118,12 @@ Next we have two TOML _tables_:
|
||||||
aggregator // basic infos for the aggregator object
|
aggregator // basic infos for the aggregator object
|
||||||
remote_validator // config for optional remote validation checker
|
remote_validator // config for optional remote validation checker
|
||||||
```
|
```
|
||||||
|
|
||||||
[See the provider config](csaf_provider.md#provider-options) about
|
[See the provider config](csaf_provider.md#provider-options) about
|
||||||
how to configure `remote_validator`.
|
how to configure `remote_validator`.
|
||||||
|
|
||||||
At last there is the TOML _array of tables_:
|
At last there is the TOML _array of tables_:
|
||||||
|
|
||||||
```
|
```
|
||||||
providers // each entry to be mirrored or listed
|
providers // each entry to be mirrored or listed
|
||||||
```
|
```
|
||||||
|
|
@ -148,6 +150,9 @@ header
|
||||||
|
|
||||||
Where valid `name` and `domain` settings are required.
|
Where valid `name` and `domain` settings are required.
|
||||||
|
|
||||||
|
If no user agent is specified with `header = "user-agent:custom-agent/1.0"`
|
||||||
|
then the default agent in the form of `csaf_distribution/VERSION` is sent.
|
||||||
|
|
||||||
If you want an entry to be listed instead of mirrored
|
If you want an entry to be listed instead of mirrored
|
||||||
in a `aggregator.category == "aggregator"` instance,
|
in a `aggregator.category == "aggregator"` instance,
|
||||||
set `category` to `lister` in the entry.
|
set `category` to `lister` in the entry.
|
||||||
|
|
@ -170,10 +175,11 @@ The latter is evaluated as JSONPath and the result will be added into the
|
||||||
categories document. For a more detailed explanation and examples,
|
categories document. For a more detailed explanation and examples,
|
||||||
[refer to the provider config](csaf_provider.md#provider-options).
|
[refer to the provider config](csaf_provider.md#provider-options).
|
||||||
|
|
||||||
|
|
||||||
#### Example config file
|
#### Example config file
|
||||||
|
|
||||||
<!-- MARKDOWN-AUTO-DOCS:START (CODE:src=../docs/examples/aggregator.toml) -->
|
<!-- MARKDOWN-AUTO-DOCS:START (CODE:src=../docs/examples/aggregator.toml) -->
|
||||||
<!-- The below code snippet is automatically added from ../docs/examples/aggregator.toml -->
|
<!-- The below code snippet is automatically added from ../docs/examples/aggregator.toml -->
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
workers = 2
|
workers = 2
|
||||||
folder = "/var/csaf_aggregator"
|
folder = "/var/csaf_aggregator"
|
||||||
|
|
@ -233,8 +239,8 @@ insecure = true
|
||||||
category = "lister"
|
category = "lister"
|
||||||
# ignore_pattern = [".*white.*", ".*red.*"]
|
# ignore_pattern = [".*white.*", ".*red.*"]
|
||||||
```
|
```
|
||||||
<!-- MARKDOWN-AUTO-DOCS:END -->
|
|
||||||
|
|
||||||
|
<!-- MARKDOWN-AUTO-DOCS:END -->
|
||||||
|
|
||||||
#### Publish others' advisories
|
#### Publish others' advisories
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,12 @@ Help Options:
|
||||||
|
|
||||||
Will check all given _domains_, by trying each as a CSAF provider.
|
Will check all given _domains_, by trying each as a CSAF provider.
|
||||||
|
|
||||||
|
If no user agent is specified with `--header=user-agent:custom-agent/1.0` then the default agent in the form of `csaf_distribution/VERSION` is sent.
|
||||||
|
|
||||||
If a _domain_ starts with `https://` it is instead considered a direct URL to the `provider-metadata.json` and checking proceeds from there.
|
If a _domain_ starts with `https://` it is instead considered a direct URL to the `provider-metadata.json` and checking proceeds from there.
|
||||||
|
|
||||||
If no config file is explictly given the follwing places are searched for a config file:
|
If no config file is explictly given the follwing places are searched for a config file:
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.config/csaf/checker.toml
|
~/.config/csaf/checker.toml
|
||||||
~/.csaf_checker.toml
|
~/.csaf_checker.toml
|
||||||
|
|
@ -41,6 +44,7 @@ csaf_checker.toml
|
||||||
|
|
||||||
with `~` expanding to `$HOME` on unixoid systems and `%HOMEPATH` on Windows systems.
|
with `~` expanding to `$HOME` on unixoid systems and `%HOMEPATH` on Windows systems.
|
||||||
Supported options in config files:
|
Supported options in config files:
|
||||||
|
|
||||||
```
|
```
|
||||||
output = ""
|
output = ""
|
||||||
format = "json"
|
format = "json"
|
||||||
|
|
@ -58,9 +62,10 @@ validator_preset = ["mandatory"]
|
||||||
```
|
```
|
||||||
|
|
||||||
Usage example:
|
Usage example:
|
||||||
` ./csaf_checker example.com -f html --rate=5.3 -H apikey:SECRET -o check-results.html`
|
`./csaf_checker example.com -f html --rate=5.3 -H apikey:SECRET -o check-results.html`
|
||||||
|
|
||||||
Each performed check has a return type of either 0,1 or 2:
|
Each performed check has a return type of either 0,1 or 2:
|
||||||
|
|
||||||
```
|
```
|
||||||
type 0: success
|
type 0: success
|
||||||
type 1: warning
|
type 1: warning
|
||||||
|
|
@ -73,13 +78,13 @@ The option `timerange` allows to only check advisories from a given time
|
||||||
interval. It can only be given once. See the
|
interval. It can only be given once. See the
|
||||||
[downloader documentation](csaf_downloader.md#timerange-option) for details.
|
[downloader documentation](csaf_downloader.md#timerange-option) for details.
|
||||||
|
|
||||||
|
|
||||||
You can ignore certain advisories while checking by specifying a list
|
You can ignore certain advisories while checking by specifying a list
|
||||||
of regular expressions[^1] to match their URLs by using the `ignorepattern`
|
of regular expressions[^1] to match their URLs by using the `ignorepattern`
|
||||||
option.
|
option.
|
||||||
E.g. `-i='.*white.*' -i='*.red.*'` will ignore files which URLs contain
|
E.g. `-i='.*white.*' -i='*.red.*'` will ignore files which URLs contain
|
||||||
the sub strings **white** or **red**.
|
the sub strings **white** or **red**.
|
||||||
In the config file this has to be noted as:
|
In the config file this has to be noted as:
|
||||||
|
|
||||||
```
|
```
|
||||||
ignorepattern = [".*white.*", ".*red.*"]
|
ignorepattern = [".*white.*", ".*red.*"]
|
||||||
```
|
```
|
||||||
|
|
@ -88,7 +93,7 @@ ignorepattern = [".*white.*", ".*red.*"]
|
||||||
|
|
||||||
The `role` given in the `provider-metadata.json` is not
|
The `role` given in the `provider-metadata.json` is not
|
||||||
yet considered to change the overall result,
|
yet considered to change the overall result,
|
||||||
see https://github.com/csaf-poc/csaf_distribution/issues/221 .
|
see <https://github.com/gocsaf/csaf/issues/221> .
|
||||||
|
|
||||||
If a provider hosts one or more advisories with a TLP level of AMBER or RED, then these advisories must be access protected.
|
If a provider hosts one or more advisories with a TLP level of AMBER or RED, then these advisories must be access protected.
|
||||||
To check these advisories, authorization can be given via custom headers or certificates.
|
To check these advisories, authorization can be given via custom headers or certificates.
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
## csaf_downloader
|
## csaf_downloader
|
||||||
|
|
||||||
A tool to download CSAF documents from CSAF providers.
|
A tool to download CSAF documents from CSAF providers.
|
||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
@ -21,6 +22,7 @@ Application Options:
|
||||||
-f, --folder=FOLDER Download into a given subFOLDER
|
-f, --folder=FOLDER Download into a given subFOLDER
|
||||||
-i, --ignore_pattern=PATTERN Do not download files if their URLs match any of the given PATTERNs
|
-i, --ignore_pattern=PATTERN Do not download files if their URLs match any of the given PATTERNs
|
||||||
-H, --header= One or more extra HTTP header fields
|
-H, --header= One or more extra HTTP header fields
|
||||||
|
--enumerate_pmd_only If this flag is set to true, the downloader will only enumerate valid provider metadata files, but not download documents
|
||||||
--validator=URL URL to validate documents remotely
|
--validator=URL URL to validate documents remotely
|
||||||
--validator_cache=FILE FILE to cache remote validations
|
--validator_cache=FILE FILE to cache remote validations
|
||||||
--validator_preset=PRESETS One or more PRESETS to validate remotely (default: [mandatory])
|
--validator_preset=PRESETS One or more PRESETS to validate remotely (default: [mandatory])
|
||||||
|
|
@ -29,8 +31,8 @@ Application Options:
|
||||||
--forward_header= One or more extra HTTP header fields used by forwarding
|
--forward_header= One or more extra HTTP header fields used by forwarding
|
||||||
--forward_queue=LENGTH Maximal queue LENGTH before forwarder (default: 5)
|
--forward_queue=LENGTH Maximal queue LENGTH before forwarder (default: 5)
|
||||||
--forward_insecure Do not check TLS certificates from forward endpoint
|
--forward_insecure Do not check TLS certificates from forward endpoint
|
||||||
--logfile=FILE FILE to log downloading to (default: downloader.log)
|
--log_file=FILE FILE to log downloading to (default: downloader.log)
|
||||||
--loglevel=LEVEL[debug|info|warn|error] LEVEL of logging details (default: info)
|
--log_level=LEVEL[debug|info|warn|error] LEVEL of logging details (default: info)
|
||||||
-c, --config=TOML-FILE Path to config TOML file
|
-c, --config=TOML-FILE Path to config TOML file
|
||||||
--preferred_hash=HASH[sha256|sha512] HASH to prefer
|
--preferred_hash=HASH[sha256|sha512] HASH to prefer
|
||||||
|
|
||||||
|
|
@ -40,6 +42,8 @@ Help Options:
|
||||||
|
|
||||||
Will download all CSAF documents for the given _domains_, by trying each as a CSAF provider.
|
Will download all CSAF documents for the given _domains_, by trying each as a CSAF provider.
|
||||||
|
|
||||||
|
If no user agent is specified with `--header=user-agent:custom-agent/1.0` then the default agent in the form of `csaf_distribution/VERSION` is sent.
|
||||||
|
|
||||||
If a _domain_ starts with `https://` it is instead considered a direct URL to the `provider-metadata.json` and downloading procedes from there.
|
If a _domain_ starts with `https://` it is instead considered a direct URL to the `provider-metadata.json` and downloading procedes from there.
|
||||||
|
|
||||||
Increasing the number of workers opens more connections to the web servers
|
Increasing the number of workers opens more connections to the web servers
|
||||||
|
|
@ -48,6 +52,7 @@ However, since this also increases the load on the servers, their administrators
|
||||||
have taken countermeasures to limit this.
|
have taken countermeasures to limit this.
|
||||||
|
|
||||||
If no config file is explictly given the follwing places are searched for a config file:
|
If no config file is explictly given the follwing places are searched for a config file:
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.config/csaf/downloader.toml
|
~/.config/csaf/downloader.toml
|
||||||
~/.csaf_downloader.toml
|
~/.csaf_downloader.toml
|
||||||
|
|
@ -57,6 +62,7 @@ csaf_downloader.toml
|
||||||
with `~` expanding to `$HOME` on unixoid systems and `%HOMEPATH` on Windows systems.
|
with `~` expanding to `$HOME` on unixoid systems and `%HOMEPATH` on Windows systems.
|
||||||
|
|
||||||
Supported options in config files:
|
Supported options in config files:
|
||||||
|
|
||||||
```
|
```
|
||||||
# directory # not set by default
|
# directory # not set by default
|
||||||
insecure = false
|
insecure = false
|
||||||
|
|
@ -91,6 +97,7 @@ option.
|
||||||
E.g. `-i='.*white.*' -i='*.red.*'` will ignore files which URLs contain
|
E.g. `-i='.*white.*' -i='*.red.*'` will ignore files which URLs contain
|
||||||
the sub strings **white** or **red**.
|
the sub strings **white** or **red**.
|
||||||
In the config file this has to be noted as:
|
In the config file this has to be noted as:
|
||||||
|
|
||||||
```
|
```
|
||||||
ignorepattern = [".*white.*", ".*red.*"]
|
ignorepattern = [".*white.*", ".*red.*"]
|
||||||
```
|
```
|
||||||
|
|
@ -107,6 +114,7 @@ into a given intervall. There are three possible notations:
|
||||||
and 'y' for years are recognized. In these cases only integer
|
and 'y' for years are recognized. In these cases only integer
|
||||||
values are accepted without any fractions.
|
values are accepted without any fractions.
|
||||||
Some examples:
|
Some examples:
|
||||||
|
|
||||||
- `"3h"` means downloading the advisories that have changed in the last three hours.
|
- `"3h"` means downloading the advisories that have changed in the last three hours.
|
||||||
- `"30m"` .. changed within the last thirty minutes.
|
- `"30m"` .. changed within the last thirty minutes.
|
||||||
- `"3M2m"` .. changed within the last three months and two minutes.
|
- `"3M2m"` .. changed within the last three months and two minutes.
|
||||||
|
|
@ -117,6 +125,7 @@ into a given intervall. There are three possible notations:
|
||||||
E.g. `"2006-01-02"` means that all files between 2006 January 2nd and now going to being
|
E.g. `"2006-01-02"` means that all files between 2006 January 2nd and now going to being
|
||||||
downloaded.
|
downloaded.
|
||||||
Accepted patterns are:
|
Accepted patterns are:
|
||||||
|
|
||||||
- `"2006-01-02T15:04:05Z"`
|
- `"2006-01-02T15:04:05Z"`
|
||||||
- `"2006-01-02T15:04:05+07:00"`
|
- `"2006-01-02T15:04:05+07:00"`
|
||||||
- `"2006-01-02T15:04:05-07:00"`
|
- `"2006-01-02T15:04:05-07:00"`
|
||||||
|
|
@ -135,6 +144,7 @@ into a given intervall. There are three possible notations:
|
||||||
All interval boundaries are inclusive.
|
All interval boundaries are inclusive.
|
||||||
|
|
||||||
#### Forwarding
|
#### Forwarding
|
||||||
|
|
||||||
The downloader is able to forward downloaded advisories and their checksums,
|
The downloader is able to forward downloaded advisories and their checksums,
|
||||||
OpenPGP signatures and validation results to an HTTP endpoint.
|
OpenPGP signatures and validation results to an HTTP endpoint.
|
||||||
The details of the implemented API are described [here](https://github.com/mfd2007/csaf_upload_interface).
|
The details of the implemented API are described [here](https://github.com/mfd2007/csaf_upload_interface).
|
||||||
|
|
@ -150,7 +160,7 @@ key protection mechanism based on RFC 1423, see
|
||||||
Thus it considered experimental and most likely to be removed
|
Thus it considered experimental and most likely to be removed
|
||||||
in a future release. Please only use this option, if you fully understand
|
in a future release. Please only use this option, if you fully understand
|
||||||
the security implications!
|
the security implications!
|
||||||
Note that for fully automated processes, it usually not make sense
|
Note that for fully automated processes, it usually does not make sense
|
||||||
to protect the client certificate's private key with a passphrase.
|
to protect the client certificate's private key with a passphrase.
|
||||||
Because the passphrase has to be accessible to the process anyway to run
|
Because the passphrase has to be accessible to the process anyway to run
|
||||||
unattented. In this situation the processing environment should be secured
|
unattented. In this situation the processing environment should be secured
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ The [setup docs](../README.md#setup-trusted-provider)
|
||||||
explain how to wire this up with nginx and where the config file lives.
|
explain how to wire this up with nginx and where the config file lives.
|
||||||
|
|
||||||
When installed, two endpoints are offered,
|
When installed, two endpoints are offered,
|
||||||
and you should use the [csaf_uploader](../docs/csaf_uploader)
|
and you should use the [csaf_uploader](../docs/csaf_uploader.md)
|
||||||
to access them:
|
to access them:
|
||||||
|
|
||||||
### /api/create
|
### /api/create
|
||||||
|
|
@ -141,5 +141,5 @@ contact_details = "Example Company can be reached at contact_us@example.com, or
|
||||||
|
|
||||||
There is an experimental upload interface which works with a web browser.
|
There is an experimental upload interface which works with a web browser.
|
||||||
It is disabled by default, as there are known issues, notably:
|
It is disabled by default, as there are known issues, notably:
|
||||||
* https://github.com/csaf-poc/csaf_distribution/issues/43
|
* https://github.com/gocsaf/csaf/issues/43
|
||||||
* https://github.com/csaf-poc/csaf_distribution/issues/256
|
* https://github.com/gocsaf/csaf/issues/256
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ signing_key
|
||||||
encryption_key
|
encryption_key
|
||||||
non_repudiation
|
non_repudiation
|
||||||
|
|
||||||
dns_name = "*.local"
|
dns_name = "*.test"
|
||||||
dns_name = "localhost"
|
dns_name = "localhost"
|
||||||
|
|
||||||
serial = 010
|
serial = 010
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ sudo chmod g+r,o-rwx /etc/csaf/config.toml
|
||||||
|
|
||||||
Here is a minimal example configuration,
|
Here is a minimal example configuration,
|
||||||
which you need to customize for a production setup,
|
which you need to customize for a production setup,
|
||||||
see the [options of `csaf_provider`](https://github.com/csaf-poc/csaf_distribution/blob/main/docs/csaf_provider.md).
|
see the [options of `csaf_provider`](https://github.com/gocsaf/csaf/blob/main/docs/csaf_provider.md).
|
||||||
|
|
||||||
<!-- MARKDOWN-AUTO-DOCS:START (CODE:src=../docs/scripts/setupProviderForITest.sh&lines=94-101) -->
|
<!-- MARKDOWN-AUTO-DOCS:START (CODE:src=../docs/scripts/setupProviderForITest.sh&lines=94-101) -->
|
||||||
<!-- The below code snippet is automatically added from ../docs/scripts/setupProviderForITest.sh -->
|
<!-- The below code snippet is automatically added from ../docs/scripts/setupProviderForITest.sh -->
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
Scripts for assisting the Integration tests.
|
Scripts for assisting the Integration tests.
|
||||||
They were written on Ubuntu 20.04 TLS amd64 and also tested with 24.04 TLS.
|
They were written on Ubuntu 20.04 TLS amd64 and also tested with 24.04 TLS.
|
||||||
|
|
||||||
- `prepareUbuntuInstanceForITests.sh` installs the required packages for the csaf_distribution integration tests on a naked ubuntu LTS amd64.
|
- `prepareUbuntuInstanceForITests.sh` installs the required packages for the csaf integration tests on a naked Ubuntu LTS amd64.
|
||||||
|
|
||||||
- `TLSConfigsForITest.sh` generates a root CA and webserver cert by running `createRootCAForITest.sh` and `createWebserverCertForITest.sh`
|
- `TLSConfigsForITest.sh` generates a root CA and webserver cert by running `createRootCAForITest.sh` and `createWebserverCertForITest.sh`
|
||||||
and configures nginx for serving TLS connections.
|
and configures nginx for serving TLS connections.
|
||||||
|
|
@ -12,13 +12,13 @@ and configures nginx for serving TLS connections.
|
||||||
|
|
||||||
As creating the folders needs to authenticate with the csaf_provider, the configurations of TLS server and Client certificate authentication should be set. So it is recommended to call the scripts in this order: `TLSConfigsForITest.sh`, `TLSClientConfigsForITest.sh`, `setupProviderForITest.sh`
|
As creating the folders needs to authenticate with the csaf_provider, the configurations of TLS server and Client certificate authentication should be set. So it is recommended to call the scripts in this order: `TLSConfigsForITest.sh`, `TLSClientConfigsForITest.sh`, `setupProviderForITest.sh`
|
||||||
|
|
||||||
Calling example (as root):
|
Calling example (as user with sudo privileges):
|
||||||
``` bash
|
``` bash
|
||||||
curl --fail -O https://raw.githubusercontent.com/csaf-poc/csaf_distribution/main/docs/scripts/prepareUbuntuInstanceForITests.sh
|
curl --fail -O https://raw.githubusercontent.com/gocsaf/csaf/main/docs/scripts/prepareUbuntuInstanceForITests.sh
|
||||||
bash prepareUbuntuInstanceForITests.sh
|
sudo bash prepareUbuntuInstanceForITests.sh
|
||||||
|
|
||||||
git clone https://github.com/csaf-poc/csaf_distribution.git # --branch <name>
|
git clone https://github.com/gocsaf/csaf.git # --branch <name>
|
||||||
pushd csaf_distribution/docs/scripts/
|
pushd csaf/docs/scripts/
|
||||||
|
|
||||||
export FOLDERNAME=devca1 ORGANAME="CSAF Tools Development (internal)"
|
export FOLDERNAME=devca1 ORGANAME="CSAF Tools Development (internal)"
|
||||||
source ./TLSConfigsForITest.sh
|
source ./TLSConfigsForITest.sh
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ set -e
|
||||||
|
|
||||||
NGINX_CONFIG_PATH=/etc/nginx/sites-available/default
|
NGINX_CONFIG_PATH=/etc/nginx/sites-available/default
|
||||||
|
|
||||||
cd ~/csaf_distribution/docs/scripts/
|
cd ~/csaf/docs/scripts/
|
||||||
source ./createCCForITest.sh
|
source ./createCCForITest.sh
|
||||||
|
|
||||||
echo '
|
echo '
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ set -e
|
||||||
|
|
||||||
NGINX_CONFIG_PATH=/etc/nginx/sites-available/default
|
NGINX_CONFIG_PATH=/etc/nginx/sites-available/default
|
||||||
|
|
||||||
cd ~/csaf_distribution/docs/scripts/
|
cd ~/csaf/docs/scripts/
|
||||||
## Create Root CA
|
## Create Root CA
|
||||||
./createRootCAForITest.sh
|
./createRootCAForITest.sh
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# This script prepares a naked Ubuntu LTS amd64
|
# This script prepares a naked Ubuntu LTS amd64
|
||||||
# for the csaf_distribution integration tests
|
# for the csaf integration tests
|
||||||
# by installing the required packages.
|
# by installing the required packages.
|
||||||
|
|
||||||
apt update
|
apt update
|
||||||
apt install -y make bash curl gnupg sed tar git nginx fcgiwrap gnutls-bin
|
apt install -y make bash curl gnupg sed tar git nginx fcgiwrap gnutls-bin zip
|
||||||
|
|
||||||
# Install Go from binary distribution
|
# Install Go from binary distribution
|
||||||
latest_go="$(curl https://go.dev/VERSION\?m=text| head -1).linux-amd64.tar.gz"
|
latest_go="$(curl https://go.dev/VERSION\?m=text| head -1).linux-amd64.tar.gz"
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ sudo chgrp -R www-data /var/www
|
||||||
sudo chmod -R g+ws /var/www
|
sudo chmod -R g+ws /var/www
|
||||||
|
|
||||||
export NGINX_CONFIG_PATH=/etc/nginx/sites-available/default
|
export NGINX_CONFIG_PATH=/etc/nginx/sites-available/default
|
||||||
export DNS_NAME=csaf.data.security.localhost
|
export DNS_NAME=csaf.data.security.test
|
||||||
|
|
||||||
sudo cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf
|
sudo cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ echo '
|
||||||
remote_validator= { "url" = "http://localhost:8082", "presets" = ["mandatory"], "cache" = "/var/lib/csaf/validations.db" }
|
remote_validator= { "url" = "http://localhost:8082", "presets" = ["mandatory"], "cache" = "/var/lib/csaf/validations.db" }
|
||||||
' | sudo tee --append /etc/csaf/config.toml
|
' | sudo tee --append /etc/csaf/config.toml
|
||||||
|
|
||||||
npm install pm2 -g
|
sudo npm install pm2 -g
|
||||||
|
|
||||||
pushd ~
|
pushd ~
|
||||||
git clone https://github.com/secvisogram/csaf-validator-service.git
|
git clone https://github.com/secvisogram/csaf-validator-service.git
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,6 @@ popd
|
||||||
echo
|
echo
|
||||||
echo '=== run aggregator'
|
echo '=== run aggregator'
|
||||||
|
|
||||||
cd ~/csaf_distribution/
|
cd ~/csaf/
|
||||||
sudo cp docs/examples/aggregator.toml /etc/csaf
|
sudo cp docs/examples/aggregator.toml /etc/csaf
|
||||||
sudo ./bin-linux-amd64/csaf_aggregator -c /etc/csaf/aggregator.toml
|
sudo ./bin-linux-amd64/csaf_aggregator -c /etc/csaf/aggregator.toml
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
set -e # to exit if a command in the script fails
|
set -e # to exit if a command in the script fails
|
||||||
|
|
||||||
echo '==== run checker (twice)'
|
echo '==== run checker (twice)'
|
||||||
cd ~/csaf_distribution
|
cd ~/csaf
|
||||||
|
|
||||||
./bin-linux-amd64/csaf_checker -f html -o ../checker-results.html --insecure \
|
./bin-linux-amd64/csaf_checker -f html -o ../checker-results.html --insecure \
|
||||||
--client_cert ~/devca1/testclient1.crt \
|
--client_cert ~/devca1/testclient1.crt \
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
set -e # to exit if a command in the script fails
|
set -e # to exit if a command in the script fails
|
||||||
|
|
||||||
cd ~/csaf_distribution
|
cd ~/csaf
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo '==== run downloader (1)'
|
echo '==== run downloader (1)'
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# API examples
|
# API examples
|
||||||
|
|
||||||
An experimental example of how to use `github.com/csaf-poc/csaf_distribution`
|
An experimental example of how to use `github.com/gocsaf/csaf`
|
||||||
as a library.
|
as a library.
|
||||||
As usage of the repository as an API is currently a _work in progress_,
|
As usage of the repository as an API is currently a _work in progress_,
|
||||||
these examples are likely to be changed.
|
these examples are likely to be changed.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// Package main implements a simple demo program to
|
// Package main implements a simple demo program to
|
||||||
// work with the csaf_distribution library.
|
// work with the csaf library.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
@ -9,8 +9,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/csaf"
|
"github.com/gocsaf/csaf/v3/csaf"
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
|
||||||
32
go.mod
32
go.mod
|
|
@ -1,31 +1,31 @@
|
||||||
module github.com/csaf-poc/csaf_distribution/v3
|
module github.com/gocsaf/csaf/v3
|
||||||
|
|
||||||
go 1.21
|
go 1.22.9
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/BurntSushi/toml v1.3.2
|
github.com/BurntSushi/toml v1.4.0
|
||||||
github.com/Intevation/gval v1.3.0
|
github.com/Intevation/gval v1.3.0
|
||||||
github.com/Intevation/jsonpath v0.2.1
|
github.com/Intevation/jsonpath v0.2.1
|
||||||
github.com/ProtonMail/gopenpgp/v2 v2.7.4
|
github.com/ProtonMail/gopenpgp/v2 v2.8.0
|
||||||
github.com/PuerkitoBio/goquery v1.8.1
|
github.com/PuerkitoBio/goquery v1.8.1
|
||||||
github.com/gofrs/flock v0.8.1
|
github.com/gofrs/flock v0.12.1
|
||||||
github.com/jessevdk/go-flags v1.5.0
|
github.com/jessevdk/go-flags v1.6.1
|
||||||
github.com/mitchellh/go-homedir v1.1.0
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1
|
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1
|
||||||
go.etcd.io/bbolt v1.3.8
|
go.etcd.io/bbolt v1.3.11
|
||||||
golang.org/x/crypto v0.14.0
|
golang.org/x/crypto v0.29.0
|
||||||
golang.org/x/term v0.13.0
|
golang.org/x/term v0.26.0
|
||||||
golang.org/x/time v0.3.0
|
golang.org/x/time v0.8.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect
|
github.com/ProtonMail/go-crypto v1.1.2 // indirect
|
||||||
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect
|
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect
|
||||||
github.com/andybalholm/cascadia v1.3.2 // indirect
|
github.com/andybalholm/cascadia v1.3.2 // indirect
|
||||||
github.com/cloudflare/circl v1.3.6 // indirect
|
github.com/cloudflare/circl v1.5.0 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/shopspring/decimal v1.3.1 // indirect
|
github.com/shopspring/decimal v1.4.0 // indirect
|
||||||
golang.org/x/net v0.17.0 // indirect
|
golang.org/x/net v0.31.0 // indirect
|
||||||
golang.org/x/sys v0.14.0 // indirect
|
golang.org/x/sys v0.27.0 // indirect
|
||||||
golang.org/x/text v0.13.0 // indirect
|
golang.org/x/text v0.20.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
80
go.sum
80
go.sum
|
|
@ -1,34 +1,30 @@
|
||||||
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
|
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
|
||||||
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||||
github.com/Intevation/gval v1.3.0 h1:+Ze5sft5MmGbZrHj06NVUbcxCb67l9RaPTLMNr37mjw=
|
github.com/Intevation/gval v1.3.0 h1:+Ze5sft5MmGbZrHj06NVUbcxCb67l9RaPTLMNr37mjw=
|
||||||
github.com/Intevation/gval v1.3.0/go.mod h1:xmGyGpP5be12EL0P12h+dqiYG8qn2j3PJxIgkoOHO5o=
|
github.com/Intevation/gval v1.3.0/go.mod h1:xmGyGpP5be12EL0P12h+dqiYG8qn2j3PJxIgkoOHO5o=
|
||||||
github.com/Intevation/jsonpath v0.2.1 h1:rINNQJ0Pts5XTFEG+zamtdL7l9uuE1z0FBA+r55Sw+A=
|
github.com/Intevation/jsonpath v0.2.1 h1:rINNQJ0Pts5XTFEG+zamtdL7l9uuE1z0FBA+r55Sw+A=
|
||||||
github.com/Intevation/jsonpath v0.2.1/go.mod h1:WnZ8weMmwAx/fAO3SutjYFU+v7DFreNYnibV7CiaYIw=
|
github.com/Intevation/jsonpath v0.2.1/go.mod h1:WnZ8weMmwAx/fAO3SutjYFU+v7DFreNYnibV7CiaYIw=
|
||||||
github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
|
github.com/ProtonMail/go-crypto v1.1.2 h1:A7JbD57ThNqh7XjmHE+PXpQ3Dqt3BrSAC0AL0Go3KS0=
|
||||||
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE=
|
github.com/ProtonMail/go-crypto v1.1.2/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
|
||||||
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
|
|
||||||
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k=
|
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k=
|
||||||
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw=
|
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw=
|
||||||
github.com/ProtonMail/gopenpgp/v2 v2.7.4 h1:Vz/8+HViFFnf2A6XX8JOvZMrA6F5puwNvvF21O1mRlo=
|
github.com/ProtonMail/gopenpgp/v2 v2.8.0 h1:WvMv3CMcFsqKSM4/Qf8sf3tgyQkzDqQmoSE49bnBuP4=
|
||||||
github.com/ProtonMail/gopenpgp/v2 v2.7.4/go.mod h1:IhkNEDaxec6NyzSI0PlxapinnwPVIESk8/76da3Ct3g=
|
github.com/ProtonMail/gopenpgp/v2 v2.8.0/go.mod h1:qb2GUSnmA9ipBW5GVtCtEhkummSlqs2A8Ar3S0HBgSY=
|
||||||
github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
|
github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
|
||||||
github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
|
github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
|
||||||
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
|
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
|
||||||
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
|
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
|
||||||
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
|
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
|
||||||
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys=
|
||||||
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
|
github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||||
github.com/cloudflare/circl v1.3.6 h1:/xbKIqSHbZXHwkhbrhrt2YOHIwYJlXH94E3tI/gDlUg=
|
|
||||||
github.com/cloudflare/circl v1.3.6/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
|
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
||||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
|
github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4=
|
||||||
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc=
|
||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
|
@ -37,78 +33,66 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
|
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
|
||||||
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
|
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
|
||||||
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
|
|
||||||
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
|
||||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=
|
go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0=
|
||||||
go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
|
go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
|
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
|
||||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
|
||||||
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
|
|
||||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
||||||
|
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
|
||||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||||
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
|
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
|
||||||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
||||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
|
||||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v3/util"
|
"github.com/gocsaf/csaf/v3/util"
|
||||||
|
|
||||||
"github.com/BurntSushi/toml"
|
"github.com/BurntSushi/toml"
|
||||||
"github.com/jessevdk/go-flags"
|
"github.com/jessevdk/go-flags"
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,11 @@ func (hc *HeaderClient) Do(req *http.Request) (*http.Response, error) {
|
||||||
req.Header.Add(key, v)
|
req.Header.Add(key, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use default user agent if none is set
|
||||||
|
if userAgent := hc.Header.Get("User-Agent"); userAgent == "" {
|
||||||
|
req.Header.Add("User-Agent", "csaf_distribution/"+SemVersion)
|
||||||
|
}
|
||||||
return hc.Client.Do(req)
|
return hc.Client.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue