mirror of
https://github.com/safedep/vet.git
synced 2025-12-10 00:22:08 -06:00
chore: Add anonymous telemetry collector (#468)
* chore: Add anonymous telemetry collector * fix: Posthog property handling
This commit is contained in:
parent
5b766bb27b
commit
3490812ed1
11
README.md
11
README.md
@ -75,6 +75,7 @@ policies. Security guardrails can be built by expressing policies as [CEL](https
|
||||
- [🔍 Malicious Package Query](#-malicious-package-query)
|
||||
- [🛠️ Advanced Usage](#️-advanced-usage)
|
||||
- [📖 Documentation](#-documentation)
|
||||
- [Telemetry](#telemetry)
|
||||
- [🎊 Community](#-community)
|
||||
- [💻 Development](#-development)
|
||||
- [Support](#support)
|
||||
@ -376,6 +377,16 @@ malicious packages data from community instance of [Malysis service](https://doc
|
||||
|
||||
[](https://safedep.io/docs)
|
||||
|
||||
## Telemetry
|
||||
|
||||
`vet` collects anonymous telemetry to help us understand how it is used and
|
||||
improve the product. To disable telemetry, set `VET_DISABLE_TELEMETRY` environment
|
||||
variable to `true`.
|
||||
|
||||
```bash
|
||||
export VET_DISABLE_TELEMETRY=true
|
||||
```
|
||||
|
||||
## 🎊 Community
|
||||
|
||||
First of all, thank you so much for showing interest in `vet`, we appreciate it ❤️
|
||||
|
||||
@ -16,6 +16,7 @@ import (
|
||||
"github.com/safedep/dry/adapters"
|
||||
"github.com/safedep/dry/api/pb"
|
||||
"github.com/safedep/dry/utils"
|
||||
"github.com/safedep/vet/internal/analytics"
|
||||
"github.com/safedep/vet/internal/auth"
|
||||
"github.com/safedep/vet/internal/ui"
|
||||
"github.com/safedep/vet/pkg/common/registry"
|
||||
@ -61,6 +62,8 @@ func newPackageMalwareInspectCommand() *cobra.Command {
|
||||
}
|
||||
|
||||
func executeMalwareAnalysis() error {
|
||||
analytics.TrackCommandInspectMalwareAnalysis()
|
||||
|
||||
err := auth.Verify()
|
||||
if err != nil {
|
||||
return fmt.Errorf("access to Malicious Package Analysis requires an API key. " +
|
||||
|
||||
1
go.mod
1
go.mod
@ -32,6 +32,7 @@ require (
|
||||
github.com/owenrumney/go-sarif/v2 v2.3.3
|
||||
github.com/package-url/packageurl-go v0.1.3
|
||||
github.com/pandatix/go-cvss v0.6.2
|
||||
github.com/posthog/posthog-go v1.4.10
|
||||
github.com/safedep/code v0.0.0-20250414045718-1cdbf4a3b4ce
|
||||
github.com/safedep/dry v0.0.0-20250410092643-c7079e2f9442
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
|
||||
61
go.sum
61
go.sum
@ -6,16 +6,10 @@ ariga.io/atlas v0.32.0 h1:y+77nueMrExLiKlz1CcPKh/nU7VSlWfBbwCShsJyvCw=
|
||||
ariga.io/atlas v0.32.0/go.mod h1:Oe1xWPuu5q9LzyrWfbZmEZxFYeu4BHTyzfjeW2aZp/w=
|
||||
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250307204501-0409229c3780.1 h1:zgJPqo17m28+Lf5BW4xv3PvU20BnrmTcGYrog22lLIU=
|
||||
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250307204501-0409229c3780.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U=
|
||||
buf.build/gen/go/safedep/api/grpc/go v1.5.1-20250329145212-73a714065737.2 h1:lVQsBAWDfLOIReE2o7p5rYO4aFQszzN0HkmECM0v/v8=
|
||||
buf.build/gen/go/safedep/api/grpc/go v1.5.1-20250329145212-73a714065737.2/go.mod h1:3uM6zosFI8cGgWWgSfEbuuCCkJoaWcvqeeMtiOei55k=
|
||||
buf.build/gen/go/safedep/api/grpc/go v1.5.1-20250418165058-162f6b0cc319.2 h1:txDywYkqsXvtA/sDSMcwMjC8XTHnqlyc+3aIFMzRVeQ=
|
||||
buf.build/gen/go/safedep/api/grpc/go v1.5.1-20250418165058-162f6b0cc319.2/go.mod h1:fdc8Y27iNGRno4W5CMBFBOQlG75NJ3M9q0GZRvY/TVA=
|
||||
buf.build/gen/go/safedep/api/protocolbuffers/go v1.36.6-20250403164919-b2d27805fd31.1 h1:BdggwWHqbLEcxzbDFK76wrNNweLlmTwElEItgTYs1JE=
|
||||
buf.build/gen/go/safedep/api/protocolbuffers/go v1.36.6-20250403164919-b2d27805fd31.1/go.mod h1:uR95GqsnNCRn6cTyRBte6uMJMm0rEBRxTGpakKCNL9I=
|
||||
buf.build/gen/go/safedep/api/protocolbuffers/go v1.36.6-20250418165058-162f6b0cc319.1 h1:vJeI1IQuxGZd9r5RHNiLTJ+aPQfy0g7h3Gqa9/Ql7kA=
|
||||
buf.build/gen/go/safedep/api/protocolbuffers/go v1.36.6-20250418165058-162f6b0cc319.1/go.mod h1:uR95GqsnNCRn6cTyRBte6uMJMm0rEBRxTGpakKCNL9I=
|
||||
cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss=
|
||||
cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
|
||||
cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=
|
||||
cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
@ -113,7 +107,6 @@ github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc=
|
||||
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
|
||||
github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk=
|
||||
github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM=
|
||||
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
|
||||
github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
|
||||
github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
|
||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
||||
@ -158,8 +151,6 @@ github.com/alingse/nilnesserr v0.1.2 h1:Yf8Iwm3z2hUUrP4muWfW83DF4nE3r1xZ26fGWUKC
|
||||
github.com/alingse/nilnesserr v0.1.2/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg=
|
||||
github.com/anchore/archiver/v3 v3.5.3-0.20241210171143-5b1d8d1c7c51 h1:yhk+P8lF3ZiROjmaVRao9WGTRo4b/wYjoKEiAHWrKwc=
|
||||
github.com/anchore/archiver/v3 v3.5.3-0.20241210171143-5b1d8d1c7c51/go.mod h1:nwuGSd7aZp0rtYt79YggCGafz1RYsclE7pi3fhLwvuw=
|
||||
github.com/anchore/clio v0.0.0-20250401141128-4c1d6bd1e872 h1:iEF0xhHUuh3J8FrlPsZAQVaMpTa2j4lvLRI5XrXzge4=
|
||||
github.com/anchore/clio v0.0.0-20250401141128-4c1d6bd1e872/go.mod h1:Utb9i4kwiCWvqAIxZaJeMIXFO9uOgQXlvH2BfbfO/zI=
|
||||
github.com/anchore/clio v0.0.0-20250408180537-ec8fa27f0d9f h1:jTeN+fKTXz1VFo3Zj7Msnx//s5kD6Htd+SS0z9/o7Ss=
|
||||
github.com/anchore/clio v0.0.0-20250408180537-ec8fa27f0d9f/go.mod h1:jQ+jv7v9RQnc5oA+Z0rAyXsQfaCAZHwY/CJZiLVggQ4=
|
||||
github.com/anchore/fangs v0.0.0-20250402135612-96e29e45f3fe h1:qv/xxpjF5RdKPqZjx8RM0aBi3HUCAO0DhRBMs2xhY1I=
|
||||
@ -175,16 +166,12 @@ github.com/anchore/go-macholibre v0.0.0-20250320151634-807da7ad2331/go.mod h1:DY
|
||||
github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA=
|
||||
github.com/anchore/go-struct-converter v0.0.0-20250211213226-cce56d595160 h1:r8/1fxpbDMlQO6GgQiud1uL5eAu3p/NVUmfNx95/KY8=
|
||||
github.com/anchore/go-struct-converter v0.0.0-20250211213226-cce56d595160/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA=
|
||||
github.com/anchore/go-sync v0.0.0-20250328224149-ee39fe426690 h1:Fco28+0jLyCoxN3GvKMQRt48MxxL4ywX0B1+6QKhTDw=
|
||||
github.com/anchore/go-sync v0.0.0-20250328224149-ee39fe426690/go.mod h1:+9oM3XUy8iea/vWj9FhZ9bQGUBN8JpPxxJm5Wbcx9XM=
|
||||
github.com/anchore/go-sync v0.0.0-20250408180515-6585ecec709b h1:NhEFhtXwEzhz0NV2PnsAnsCHzKBCvgEZoy+ZcDQTHJg=
|
||||
github.com/anchore/go-sync v0.0.0-20250408180515-6585ecec709b/go.mod h1:QDIyYQxkFJQGj0r8VAOXBTi/HhBs/aRC+s1+e2oTdhQ=
|
||||
github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04 h1:VzprUTpc0vW0nnNKJfJieyH/TZ9UYAnTZs5/gHTdAe8=
|
||||
github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04/go.mod h1:6dK64g27Qi1qGQZ67gFmBFvEHScy0/C8qhQhNe5B5pQ=
|
||||
github.com/anchore/packageurl-go v0.1.1-0.20250220190351-d62adb6e1115 h1:ZyRCmiEjnoGJZ1+Ah0ZZ/mKKqNhGcUZBl0s7PTTDzvY=
|
||||
github.com/anchore/packageurl-go v0.1.1-0.20250220190351-d62adb6e1115/go.mod h1:KoYIv7tdP5+CC9VGkeZV4/vGCKsY55VvoG+5dadg4YI=
|
||||
github.com/anchore/stereoscope v0.1.2 h1:0+Jcf7hoImYKfrH2XzN6vvbmbpm68A/woabC43gZ4eU=
|
||||
github.com/anchore/stereoscope v0.1.2/go.mod h1:kU4LkiocOimxuSnlmJgilHCfDMCR5t/UroKIpzI8jNw=
|
||||
github.com/anchore/stereoscope v0.1.3 h1:qCbu9h7NCTIjWYyuAWwwEOuZia2UP5rvkCSA4reDzSg=
|
||||
github.com/anchore/stereoscope v0.1.3/go.mod h1:kU4LkiocOimxuSnlmJgilHCfDMCR5t/UroKIpzI8jNw=
|
||||
github.com/anchore/syft v1.22.0 h1:lmNuy1uQ9GZeO6HPms3ik3W0hTE9MxP46vtC3vssBe4=
|
||||
@ -352,8 +339,6 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr
|
||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
|
||||
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||
github.com/docker/cli v28.0.4+incompatible h1:pBJSJeNd9QeIWPjRcV91RVJihd/TXB77q1ef64XEu4A=
|
||||
github.com/docker/cli v28.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/cli v28.1.1+incompatible h1:eyUemzeI45DY7eDPuwUcmDyDj1pM98oD5MdSpiItp8k=
|
||||
github.com/docker/cli v28.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
||||
@ -417,21 +402,15 @@ github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
|
||||
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
|
||||
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
|
||||
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
|
||||
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
|
||||
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
|
||||
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
|
||||
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/ghostiam/protogetter v0.3.9 h1:j+zlLLWzqLay22Cz/aYwTHKQ88GE2DQ6GkWSYFOI4lQ=
|
||||
github.com/ghostiam/protogetter v0.3.9/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA=
|
||||
github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E=
|
||||
github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0=
|
||||
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
|
||||
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
|
||||
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
||||
@ -641,8 +620,6 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
|
||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
|
||||
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||
github.com/google/pprof v0.0.0-20250418163039-24c5476c6587 h1:b/8HpQhvKLSNzH5oTXN2WkNcMl6YB5K3FRbb+i+Ml34=
|
||||
github.com/google/pprof v0.0.0-20250418163039-24c5476c6587/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
@ -716,7 +693,6 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
|
||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/hashicorp/hcl/v2 v2.23.0 h1:Fphj1/gCylPxHutVSEOf2fBOh1VE4AuLV7+kbJf3qos=
|
||||
github.com/hashicorp/hcl/v2 v2.23.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA=
|
||||
@ -884,8 +860,6 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/mattn/go-sqlite3 v1.14.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU=
|
||||
github.com/mattn/go-sqlite3 v1.14.27/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
|
||||
github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
@ -972,7 +946,6 @@ github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJ
|
||||
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
|
||||
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
||||
github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
|
||||
github.com/owenrumney/go-sarif v1.1.1 h1:QNObu6YX1igyFKhdzd7vgzmw7XsWN3/6NMGuDzBgXmE=
|
||||
github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U=
|
||||
github.com/owenrumney/go-sarif/v2 v2.3.3 h1:ubWDJcF5i3L/EIOER+ZyQ03IfplbSU1BLOE26uKQIIU=
|
||||
github.com/owenrumney/go-sarif/v2 v2.3.3/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w=
|
||||
@ -988,8 +961,6 @@ github.com/pborman/indent v1.2.1/go.mod h1:FitS+t35kIYtB5xWTZAPhnmrxcciEEOdbyrrp
|
||||
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
||||
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
|
||||
@ -1012,6 +983,8 @@ github.com/polyfloyd/go-errorlint v1.7.1 h1:RyLVXIbosq1gBdk/pChWA8zWYLsq9UEw7a1L
|
||||
github.com/polyfloyd/go-errorlint v1.7.1/go.mod h1:aXjNb1x2TNhoLsk26iv1yl7a+zTnXPhwEMtEXukiLR8=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||
github.com/posthog/posthog-go v1.4.10 h1:rpCRxxe2a4UPq9VM7rANRNRFZk0w/5To4mhYvNK9ipU=
|
||||
github.com/posthog/posthog-go v1.4.10/go.mod h1:uYC2l1Yktc8E+9FAHJ9QZG4vQf/NHJPD800Hsm7DzoM=
|
||||
github.com/pquerna/cachecontrol v0.2.0 h1:vBXSNuE5MYP9IJ5kjsdo8uq+w41jSPgvba2DEnkRx9k=
|
||||
github.com/pquerna/cachecontrol v0.2.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
|
||||
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
||||
@ -1067,8 +1040,6 @@ github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkq
|
||||
github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU=
|
||||
github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ=
|
||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/safedep/code v0.0.0-20250321055437-1ad5eaa427d8 h1:fg9AZir+pM7tONRWXi7mr15UviPeHsxlA9IEl49Thu0=
|
||||
github.com/safedep/code v0.0.0-20250321055437-1ad5eaa427d8/go.mod h1:WcI0XB6AKkejX0LTHF3tOul9SBONwLNFIAvDk2tD4go=
|
||||
github.com/safedep/code v0.0.0-20250414045718-1cdbf4a3b4ce h1:CrOoQTEBa8+lbwLxRZcjSqZcXtK8hNozbbNx6B0Xqrg=
|
||||
github.com/safedep/code v0.0.0-20250414045718-1cdbf4a3b4ce/go.mod h1:iSQqHutF05TXpcoOL2BOCpdXtPkZKWhLbAKq3/IwSoE=
|
||||
github.com/safedep/dry v0.0.0-20250410092643-c7079e2f9442 h1:+wee7FBBGm/SD46Y+cHh6GOihYI2PZ4ql2la62in7Pk=
|
||||
@ -1179,12 +1150,8 @@ github.com/sylabs/squashfs v1.0.6 h1:PvJcDzxr+vIm2kH56mEMbaOzvGu79gK7P7IX+R7BDZI
|
||||
github.com/sylabs/squashfs v1.0.6/go.mod h1:DlDeUawVXLWAsSRa085Eo0ZenGzAB32JdAUFaB0LZfE=
|
||||
github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8=
|
||||
github.com/tdakkota/asciicheck v0.4.1/go.mod h1:0k7M3rCfRXb0Z6bwgvkEIMleKH3kXNz9UqJ9Xuqopr8=
|
||||
github.com/tdewolff/minify/v2 v2.22.4 h1:0/8K2fheOuYr5B4e5oCE1hGBVX6DQHLP0EGzdsDlYeg=
|
||||
github.com/tdewolff/minify/v2 v2.22.4/go.mod h1:K/R8TT7aivpcU8QCNUU1UdR6etfnFPr7L11TO/X7shk=
|
||||
github.com/tdewolff/minify/v2 v2.23.1 h1:r6sKQrumHzskWZRdhiRa+pZhn7CdBMojACNP9fuKpXQ=
|
||||
github.com/tdewolff/minify/v2 v2.23.1/go.mod h1:RkUGjklq6uIsBoOdzY3ll35HKKQ2aFqLQhnanBHhDyU=
|
||||
github.com/tdewolff/parse/v2 v2.7.21 h1:OCuPFtGr4mXdnfKikQlUb0n654ROJANhBqCk+wioJ/A=
|
||||
github.com/tdewolff/parse/v2 v2.7.21/go.mod h1:I7TXO37t3aSG9SlPUBefAhgIF8nt7yYUwVGgETIoBcA=
|
||||
github.com/tdewolff/parse/v2 v2.7.23 h1:sCW2PNTCM1yVldh5YK/8wrpRI9rSbloUZWjAydlN2IA=
|
||||
github.com/tdewolff/parse/v2 v2.7.23/go.mod h1:I7TXO37t3aSG9SlPUBefAhgIF8nt7yYUwVGgETIoBcA=
|
||||
github.com/tdewolff/test v1.0.11 h1:FdLbwQVHxqG16SlkGveC0JVyrJN62COWTRyUFzfbtBE=
|
||||
@ -1343,8 +1310,6 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
||||
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
||||
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
||||
golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw=
|
||||
golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE=
|
||||
golang.org/x/arch v0.16.0 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U=
|
||||
golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
@ -1360,8 +1325,6 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
|
||||
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
@ -1374,8 +1337,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
|
||||
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
|
||||
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
||||
@ -1468,8 +1429,6 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
||||
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
|
||||
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
@ -1489,8 +1448,6 @@ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ
|
||||
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
|
||||
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
|
||||
golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
|
||||
golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@ -1508,8 +1465,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
|
||||
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
|
||||
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@ -1591,8 +1546,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
|
||||
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
@ -1603,8 +1556,6 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
||||
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
|
||||
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
|
||||
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
|
||||
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@ -1621,8 +1572,6 @@ 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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
|
||||
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@ -1701,8 +1650,6 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
|
||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
|
||||
golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
|
||||
golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
|
||||
golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
|
||||
golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
@ -1814,12 +1761,8 @@ google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ6
|
||||
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20241202173237-19429a94021a h1:4voejwOVTsjw6IMfnGt8IzTQBIw45hP8S0e77UMounA=
|
||||
google.golang.org/genproto v0.0.0-20241202173237-19429a94021a/go.mod h1:dW27OyXi0Ph+N43jeCWMFC86aTT5VgdeQtOSf0Hehdw=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e h1:UdXH7Kzbj+Vzastr5nVfccbmFsmYNygVLSPk1pEfDoY=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
|
||||
94
internal/analytics/analytics.go
Normal file
94
internal/analytics/analytics.go
Normal file
@ -0,0 +1,94 @@
|
||||
package analytics
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/posthog/posthog-go"
|
||||
)
|
||||
|
||||
const (
|
||||
postHogApiKey = "phc_ckrojb22DtoIMBhIC3k3hh7tmRw0ng11gSaLUXSqwSt" // gitleaks:allow
|
||||
postHogEventEndpoint = "https://us.i.posthog.com"
|
||||
|
||||
telemetryDisableEnvKey = "VET_DISABLE_TELEMETRY"
|
||||
)
|
||||
|
||||
var (
|
||||
globalPosthogClient posthog.Client
|
||||
|
||||
// This is the distinct ID to anonymously identify an invocation of the CLI.
|
||||
globalDistinctId string
|
||||
)
|
||||
|
||||
func init() {
|
||||
if isTelemetryDisabled() {
|
||||
return
|
||||
}
|
||||
|
||||
client, err := posthog.NewWithConfig(postHogApiKey, posthog.Config{
|
||||
Endpoint: postHogEventEndpoint,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to initialize posthog client: %v", err)
|
||||
}
|
||||
|
||||
globalPosthogClient = client
|
||||
|
||||
randomUUID, err := uuid.NewRandom()
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to generate random UUID: %v", err)
|
||||
}
|
||||
|
||||
globalDistinctId = randomUUID.String()
|
||||
}
|
||||
|
||||
func isTelemetryDisabled() bool {
|
||||
val := os.Getenv(telemetryDisableEnvKey)
|
||||
if booleanVal, err := strconv.ParseBool(val); err == nil {
|
||||
return booleanVal
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func IsDisabled() bool {
|
||||
return isTelemetryDisabled()
|
||||
}
|
||||
|
||||
// We want to ensure that we do not collect any telemetry if the user has disabled them.
|
||||
// This is a helper function to ensure that we do not collect any telemetry if the user has disabled them.
|
||||
func Track(distinctId string, event string, properties posthog.Properties) {
|
||||
if isTelemetryDisabled() {
|
||||
return
|
||||
}
|
||||
|
||||
if globalPosthogClient == nil {
|
||||
return
|
||||
}
|
||||
|
||||
_ = globalPosthogClient.Enqueue(&posthog.Capture{
|
||||
DistinctId: distinctId,
|
||||
Event: event,
|
||||
Properties: properties,
|
||||
Timestamp: time.Now(),
|
||||
})
|
||||
}
|
||||
|
||||
func TrackEvent(event string) {
|
||||
Track(globalDistinctId, event,
|
||||
posthog.NewProperties().
|
||||
Set("$process_person_profile", false))
|
||||
}
|
||||
|
||||
func Close() {
|
||||
if globalPosthogClient == nil {
|
||||
return
|
||||
}
|
||||
|
||||
_ = globalPosthogClient.Close()
|
||||
globalPosthogClient = nil
|
||||
}
|
||||
29
internal/analytics/analytics_test.go
Normal file
29
internal/analytics/analytics_test.go
Normal file
@ -0,0 +1,29 @@
|
||||
package analytics
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestIsDisabled(t *testing.T) {
|
||||
t.Run("returns true if VET_DISABLE_TELEMETRY is set to true", func(t *testing.T) {
|
||||
os.Setenv(telemetryDisableEnvKey, "true")
|
||||
defer os.Unsetenv(telemetryDisableEnvKey)
|
||||
|
||||
assert.True(t, IsDisabled())
|
||||
})
|
||||
|
||||
t.Run("returns false if VET_DISABLE_TELEMETRY is not set", func(t *testing.T) {
|
||||
assert.False(t, IsDisabled())
|
||||
})
|
||||
}
|
||||
|
||||
func TestCloseIsImmutable(t *testing.T) {
|
||||
Close()
|
||||
assert.Nil(t, globalPosthogClient)
|
||||
|
||||
Close()
|
||||
assert.Nil(t, globalPosthogClient)
|
||||
}
|
||||
43
internal/analytics/ci.go
Normal file
43
internal/analytics/ci.go
Normal file
@ -0,0 +1,43 @@
|
||||
package analytics
|
||||
|
||||
import "os"
|
||||
|
||||
type environmentType string
|
||||
|
||||
const (
|
||||
environmentTypeGitHubActions environmentType = "github_actions"
|
||||
environmentTypeGitLabCI environmentType = "gitlab_ci"
|
||||
environmentTypeDocker environmentType = "docker"
|
||||
)
|
||||
|
||||
// Map of environment variables which if set will determine environments
|
||||
var ciEnvVars = map[string]environmentType{
|
||||
"GITHUB_ACTION": environmentTypeGitHubActions,
|
||||
"GITHUB_WORKFLOW": environmentTypeGitHubActions,
|
||||
"GITLAB_CI": environmentTypeGitLabCI,
|
||||
"CI_COMMIT_BRANCH": environmentTypeGitLabCI,
|
||||
}
|
||||
|
||||
func TrackCI() {
|
||||
uniqueTypes := make(map[environmentType]bool)
|
||||
for envVar, envVarType := range ciEnvVars {
|
||||
if os.Getenv(envVar) != "" {
|
||||
uniqueTypes[envVarType] = true
|
||||
}
|
||||
}
|
||||
|
||||
for envVarType := range uniqueTypes {
|
||||
trackCiEvent(envVarType)
|
||||
}
|
||||
}
|
||||
|
||||
func trackCiEvent(envVarType environmentType) {
|
||||
switch envVarType {
|
||||
case environmentTypeGitHubActions:
|
||||
TrackEvent(eventScanEnvGitHubActions)
|
||||
case environmentTypeGitLabCI:
|
||||
TrackEvent(eventScanEnvGitLabCI)
|
||||
case environmentTypeDocker:
|
||||
TrackEvent(eventScanEnvDocker)
|
||||
}
|
||||
}
|
||||
3
internal/analytics/doc.go
Normal file
3
internal/analytics/doc.go
Normal file
@ -0,0 +1,3 @@
|
||||
// analytics package is for internal utility functions for tracking
|
||||
// anonymous usage analytics.
|
||||
package analytics
|
||||
136
internal/analytics/event.go
Normal file
136
internal/analytics/event.go
Normal file
@ -0,0 +1,136 @@
|
||||
package analytics
|
||||
|
||||
const (
|
||||
eventRun = "command_run"
|
||||
eventCommandQuery = "command_query"
|
||||
eventCommandScan = "command_scan"
|
||||
eventScanFilterSuite = "command_scan_has_filter_suite"
|
||||
eventScanFilterArgs = "command_scan_has_filter_args"
|
||||
eventScanInsightsV2 = "command_scan_insights_v2"
|
||||
eventScanMalwareAnalysis = "command_scan_malware_analysis"
|
||||
eventScanPackageManifestScan = "command_scan_manifest_scan"
|
||||
eventScanDirectoryScan = "command_scan_directory_scan"
|
||||
eventScanPurlScan = "command_scan_purl_scan"
|
||||
eventScanGitHubScan = "command_scan_github_scan"
|
||||
eventScanGitHubOrgScan = "command_scan_github_org_scan"
|
||||
eventScanVSCodeExtScan = "command_scan_vscode_ext_scan"
|
||||
eventScanUsingCodeAnalysis = "command_scan_using_code_analysis"
|
||||
eventScanEnvCI = "command_scan_env_ci"
|
||||
eventScanEnvDocker = "command_scan_env_docker"
|
||||
eventScanEnvGitHubActions = "command_scan_env_github_actions"
|
||||
eventScanEnvGitLabCI = "command_scan_env_gitlab_ci"
|
||||
|
||||
eventInspectMalwareAnalysis = "command_inspect_malware_analysis"
|
||||
|
||||
eventReporterMarkdownSummary = "reporter_markdown_summary"
|
||||
eventReporterJSON = "reporter_json"
|
||||
eventReporterCloudSync = "reporter_cloud_sync"
|
||||
eventReporterDefectDojo = "reporter_defect_dojo"
|
||||
eventReporterSarif = "reporter_sarif"
|
||||
eventReporterCycloneDX = "reporter_cyclonedx"
|
||||
eventReporterCSV = "reporter_csv"
|
||||
)
|
||||
|
||||
func TrackCommandRun() {
|
||||
TrackEvent(eventRun)
|
||||
}
|
||||
|
||||
func TrackCommandQuery() {
|
||||
TrackEvent(eventCommandQuery)
|
||||
}
|
||||
|
||||
func TrackCommandScan() {
|
||||
TrackEvent(eventCommandScan)
|
||||
}
|
||||
|
||||
func TrackCommandScanFilterSuite() {
|
||||
TrackEvent(eventScanFilterSuite)
|
||||
}
|
||||
|
||||
func TrackCommandScanFilterArgs() {
|
||||
TrackEvent(eventScanFilterArgs)
|
||||
}
|
||||
|
||||
func TrackCommandScanInsightsV2() {
|
||||
TrackEvent(eventScanInsightsV2)
|
||||
}
|
||||
|
||||
func TrackCommandScanMalwareAnalysis() {
|
||||
TrackEvent(eventScanMalwareAnalysis)
|
||||
}
|
||||
|
||||
func TrackCommandScanPackageManifestScan() {
|
||||
TrackEvent(eventScanPackageManifestScan)
|
||||
}
|
||||
|
||||
func TrackCommandScanDirectoryScan() {
|
||||
TrackEvent(eventScanDirectoryScan)
|
||||
}
|
||||
|
||||
func TrackCommandScanPurlScan() {
|
||||
TrackEvent(eventScanPurlScan)
|
||||
}
|
||||
|
||||
func TrackCommandScanVSCodeExtScan() {
|
||||
TrackEvent(eventScanVSCodeExtScan)
|
||||
}
|
||||
|
||||
func TrackCommandScanGitHubScan() {
|
||||
TrackEvent(eventScanGitHubScan)
|
||||
}
|
||||
|
||||
func TrackCommandScanGitHubOrgScan() {
|
||||
TrackEvent(eventScanGitHubOrgScan)
|
||||
}
|
||||
|
||||
func TrackCommandScanUsingCodeAnalysis() {
|
||||
TrackEvent(eventScanUsingCodeAnalysis)
|
||||
}
|
||||
|
||||
func TrackCommandScanEnvCI() {
|
||||
TrackEvent(eventScanEnvCI)
|
||||
}
|
||||
|
||||
func TrackCommandScanEnvDocker() {
|
||||
TrackEvent(eventScanEnvDocker)
|
||||
}
|
||||
|
||||
func TrackCommandScanEnvGitHubActions() {
|
||||
TrackEvent(eventScanEnvGitHubActions)
|
||||
}
|
||||
|
||||
func TrackCommandScanEnvGitLabCI() {
|
||||
TrackEvent(eventScanEnvGitLabCI)
|
||||
}
|
||||
|
||||
func TrackCommandInspectMalwareAnalysis() {
|
||||
TrackEvent(eventInspectMalwareAnalysis)
|
||||
}
|
||||
|
||||
func TrackReporterMarkdownSummary() {
|
||||
TrackEvent(eventReporterMarkdownSummary)
|
||||
}
|
||||
|
||||
func TrackReporterJSON() {
|
||||
TrackEvent(eventReporterJSON)
|
||||
}
|
||||
|
||||
func TrackReporterCloudSync() {
|
||||
TrackEvent(eventReporterCloudSync)
|
||||
}
|
||||
|
||||
func TrackReporterDefectDojo() {
|
||||
TrackEvent(eventReporterDefectDojo)
|
||||
}
|
||||
|
||||
func TrackReporterSarif() {
|
||||
TrackEvent(eventReporterSarif)
|
||||
}
|
||||
|
||||
func TrackReporterCycloneDX() {
|
||||
TrackEvent(eventReporterCycloneDX)
|
||||
}
|
||||
|
||||
func TrackReporterCSV() {
|
||||
TrackEvent(eventReporterCSV)
|
||||
}
|
||||
6
main.go
6
main.go
@ -10,6 +10,7 @@ import (
|
||||
"github.com/safedep/vet/cmd/cloud"
|
||||
"github.com/safedep/vet/cmd/code"
|
||||
"github.com/safedep/vet/cmd/inspect"
|
||||
"github.com/safedep/vet/internal/analytics"
|
||||
"github.com/safedep/vet/internal/ui"
|
||||
"github.com/safedep/vet/pkg/common/logger"
|
||||
"github.com/safedep/vet/pkg/exceptions"
|
||||
@ -81,6 +82,11 @@ func main() {
|
||||
logger.SetLogLevel(verbose, debug)
|
||||
})
|
||||
|
||||
defer analytics.Close()
|
||||
|
||||
analytics.TrackCommandRun()
|
||||
analytics.TrackCI()
|
||||
|
||||
if err := cmd.Execute(); err != nil {
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
43
scan.go
43
scan.go
@ -8,6 +8,7 @@ import (
|
||||
"github.com/google/go-github/v70/github"
|
||||
"github.com/safedep/dry/adapters"
|
||||
"github.com/safedep/dry/utils"
|
||||
"github.com/safedep/vet/internal/analytics"
|
||||
"github.com/safedep/vet/internal/auth"
|
||||
"github.com/safedep/vet/internal/command"
|
||||
"github.com/safedep/vet/internal/connect"
|
||||
@ -260,6 +261,8 @@ func listParsersCommand() *cobra.Command {
|
||||
}
|
||||
|
||||
func startScan() {
|
||||
analytics.TrackCommandScan()
|
||||
|
||||
if !disableAuthVerifyBeforeScan {
|
||||
err := auth.Verify()
|
||||
// We will fallback to community mode by default to provide
|
||||
@ -326,9 +329,13 @@ func internalStartScan() error {
|
||||
// contract is to support one of them at a time. Lets not break the contract
|
||||
// for now and figure out UX improvement later
|
||||
if len(lockfiles) > 0 {
|
||||
analytics.TrackCommandScanPackageManifestScan()
|
||||
|
||||
// nolint:ineffassign,staticcheck
|
||||
reader, err = readers.NewLockfileReader(lockfiles, manifestType)
|
||||
} else if len(manifests) > 0 {
|
||||
analytics.TrackCommandScanPackageManifestScan()
|
||||
|
||||
// We will make manifestType backward compatible with lockfileAs
|
||||
if manifestType == "" {
|
||||
manifestType = lockfileAs
|
||||
@ -337,6 +344,8 @@ func internalStartScan() error {
|
||||
// nolint:ineffassign,staticcheck
|
||||
reader, err = readers.NewLockfileReader(manifests, manifestType)
|
||||
} else if len(githubRepoUrls) > 0 {
|
||||
analytics.TrackCommandScanGitHubScan()
|
||||
|
||||
githubClient := githubClientBuilder()
|
||||
|
||||
// nolint:ineffassign,staticcheck
|
||||
@ -346,6 +355,8 @@ func internalStartScan() error {
|
||||
SkipGitHubDependencyGraphAPI: githubSkipDependencyGraphAPI,
|
||||
})
|
||||
} else if !utils.IsEmptyString(githubOrgUrl) {
|
||||
analytics.TrackCommandScanGitHubOrgScan()
|
||||
|
||||
githubClient := githubClientBuilder()
|
||||
|
||||
// nolint:ineffassign,staticcheck
|
||||
@ -356,17 +367,25 @@ func internalStartScan() error {
|
||||
SkipDependencyGraphAPI: githubSkipDependencyGraphAPI,
|
||||
})
|
||||
} else if len(purlSpec) > 0 {
|
||||
analytics.TrackCommandScanPurlScan()
|
||||
|
||||
// nolint:ineffassign,staticcheck
|
||||
reader, err = readers.NewPurlReader(purlSpec, readers.PurlReaderConfig{AutoResolveMissingVersions: true}, versionResolver)
|
||||
} else if vsxReader {
|
||||
if len(vsxDirectories) == 0 {
|
||||
analytics.TrackCommandScanVSCodeExtScan()
|
||||
|
||||
// nolint:ineffassign,staticcheck
|
||||
reader, err = readers.NewVSCodeExtReaderFromDefaultDistributions()
|
||||
} else {
|
||||
analytics.TrackCommandScanVSCodeExtScan()
|
||||
|
||||
// nolint:ineffassign,staticcheck
|
||||
reader, err = readers.NewVSCodeExtReader(vsxDirectories)
|
||||
}
|
||||
} else {
|
||||
analytics.TrackCommandScanDirectoryScan()
|
||||
|
||||
// nolint:ineffassign,staticcheck
|
||||
reader, err = readers.NewDirectoryReader(readers.DirectoryReaderConfig{
|
||||
Path: baseDirectory,
|
||||
@ -401,6 +420,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if !utils.IsEmptyString(celFilterExpression) {
|
||||
analytics.TrackCommandScanFilterArgs()
|
||||
|
||||
task, err := analyzer.NewCelFilterAnalyzer(celFilterExpression,
|
||||
failFast || celFilterFailOnMatch)
|
||||
if err != nil {
|
||||
@ -411,6 +432,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if !utils.IsEmptyString(celFilterSuiteFile) {
|
||||
analytics.TrackCommandScanFilterSuite()
|
||||
|
||||
task, err := analyzer.NewCelFilterSuiteAnalyzer(celFilterSuiteFile,
|
||||
failFast || celFilterFailOnMatch)
|
||||
if err != nil {
|
||||
@ -469,6 +492,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if !utils.IsEmptyString(markdownSummaryReportPath) {
|
||||
analytics.TrackReporterMarkdownSummary()
|
||||
|
||||
rp, err := reporter.NewMarkdownSummaryReporter(reporter.MarkdownSummaryReporterConfig{
|
||||
Tool: toolMetadata,
|
||||
Path: markdownSummaryReportPath,
|
||||
@ -483,6 +508,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if !utils.IsEmptyString(jsonReportPath) {
|
||||
analytics.TrackReporterJSON()
|
||||
|
||||
rp, err := reporter.NewJsonReportGenerator(reporter.JsonReportingConfig{
|
||||
Path: jsonReportPath,
|
||||
Tool: toolMetadata,
|
||||
@ -495,6 +522,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if !utils.IsEmptyString(sarifReportPath) {
|
||||
analytics.TrackReporterSarif()
|
||||
|
||||
rp, err := reporter.NewSarifReporter(reporter.SarifReporterConfig{
|
||||
Tool: toolMetadata,
|
||||
IncludeVulns: sarifIncludeVulns,
|
||||
@ -509,6 +538,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if !utils.IsEmptyString(cyclonedxReportPath) {
|
||||
analytics.TrackReporterCycloneDX()
|
||||
|
||||
if utils.IsEmptyString(cyclonedxReportApplicationName) {
|
||||
cyclonedxReportApplicationName, err = reader.ApplicationName()
|
||||
if err != nil {
|
||||
@ -529,6 +560,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if reportDefectDojo {
|
||||
analytics.TrackReporterDefectDojo()
|
||||
|
||||
defectDojoApiV2Key := os.Getenv("DEFECT_DOJO_APIV2_KEY")
|
||||
if utils.IsEmptyString(defectDojoApiV2Key) {
|
||||
return fmt.Errorf("please set DEFECT_DOJO_APIV2_KEY environment variable to enable defect-dojo reporting")
|
||||
@ -561,6 +594,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if !utils.IsEmptyString(csvReportPath) {
|
||||
analytics.TrackReporterCSV()
|
||||
|
||||
rp, err := reporter.NewCsvReporter(reporter.CsvReportingConfig{
|
||||
Path: csvReportPath,
|
||||
})
|
||||
@ -587,6 +622,8 @@ func internalStartScan() error {
|
||||
var syncReportTracker any
|
||||
|
||||
if syncReport {
|
||||
analytics.TrackReporterCloudSync()
|
||||
|
||||
clientConn, err := auth.SyncClientConnection("vet-sync")
|
||||
if err != nil {
|
||||
return err
|
||||
@ -629,6 +666,8 @@ func internalStartScan() error {
|
||||
if enrich {
|
||||
var enricher scanner.PackageMetaEnricher
|
||||
if enrichUsingInsightsV2 {
|
||||
analytics.TrackCommandScanInsightsV2()
|
||||
|
||||
// We will enforce auth for Insights v2 during the experimental period.
|
||||
// Once we have an understanding on the usage and capacity, we will open
|
||||
// up for community usage.
|
||||
@ -664,6 +703,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if codeAnalysisDBPath != "" {
|
||||
analytics.TrackCommandScanUsingCodeAnalysis()
|
||||
|
||||
entSqliteStorage, err := storage.NewEntSqliteStorage(storage.EntSqliteClientConfig{
|
||||
Path: codeAnalysisDBPath,
|
||||
ReadOnly: true,
|
||||
@ -693,6 +734,8 @@ func internalStartScan() error {
|
||||
}
|
||||
|
||||
if enrichMalware {
|
||||
analytics.TrackCommandScanMalwareAnalysis()
|
||||
|
||||
if auth.CommunityMode() {
|
||||
return fmt.Errorf("access to Malicious Package Analysis requires an API key. " +
|
||||
"For more details: https://docs.safedep.io/cloud/quickstart/")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user