From da68aa472cb15c15337aec9d3df0caf21cceefd8 Mon Sep 17 00:00:00 2001 From: Nicolas JUHEL Date: Fri, 28 Oct 2022 10:26:46 +0200 Subject: [PATCH] Package Archive: - Security : clean destination pathfile before use it (prevent down under current output path) - Fix : do not update link / symlink if the source / destination are same - Fix : do not create link / symlink for windows OS (need a shortcut process by ole call) Issue Fix: - Fix #128 - Fix #129 - Fix #130 - Fix #131 --- .github/workflows/codeql-analysis.yml | 6 +- archive/archive.go | 8 +- archive/tar/reader.go | 117 +++++++++++++++++++------- archive/zip/reader.go | 31 ++++--- go.mod | 94 ++++++++++----------- 5 files changed, 153 insertions(+), 103 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 87942309..4c36444d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -42,7 +42,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -53,7 +53,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -67,4 +67,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/archive/archive.go b/archive/archive.go index aede8b05..dd5b361d 100644 --- a/archive/archive.go +++ b/archive/archive.go @@ -64,28 +64,28 @@ func ExtractFile(src, dst libiot.FileProgress, fileNameContain, fileNameRegex st // #nosec } - if err := libbz2.GetFile(src, tmp); err == nil { + if err = libbz2.GetFile(src, tmp); err == nil { //logger.DebugLevel.Log("try another archive...") return ExtractFile(tmp, dst, fileNameContain, fileNameRegex) } else if err.IsCodeError(libbz2.ErrorIOCopy) { return err } - if err := libgzp.GetFile(src, tmp); err == nil { + if err = libgzp.GetFile(src, tmp); err == nil { //logger.DebugLevel.Log("try another archive...") return ExtractFile(tmp, dst, fileNameContain, fileNameRegex) } else if !err.IsCodeError(libgzp.ErrorGZReader) { return err } - if err := libtar.GetFile(src, tmp, fileNameContain, fileNameRegex); err == nil { + if err = libtar.GetFile(src, tmp, fileNameContain, fileNameRegex); err == nil { //logger.DebugLevel.Log("try another archive...") return ExtractFile(tmp, dst, fileNameContain, fileNameRegex) } else if !err.IsCodeError(libtar.ErrorTarNext) { return err } - if err := libzip.GetFile(src, tmp, fileNameContain, fileNameRegex); err == nil { + if err = libzip.GetFile(src, tmp, fileNameContain, fileNameRegex); err == nil { //logger.DebugLevel.Log("try another archive...") return ExtractFile(tmp, dst, fileNameContain, fileNameRegex) } else if !err.IsCodeError(libzip.ErrorZipOpen) { diff --git a/archive/tar/reader.go b/archive/tar/reader.go index 84179a28..5fad16c9 100644 --- a/archive/tar/reader.go +++ b/archive/tar/reader.go @@ -30,14 +30,16 @@ import ( "io" "os" "path" - "syscall" + "path/filepath" + "runtime" + "strings" - "github.com/nabbar/golib/archive/archive" - "github.com/nabbar/golib/errors" - "github.com/nabbar/golib/ioutils" + libarc "github.com/nabbar/golib/archive/archive" + liberr "github.com/nabbar/golib/errors" + libiut "github.com/nabbar/golib/ioutils" ) -func GetFile(src, dst ioutils.FileProgress, filenameContain, filenameRegex string) errors.Error { +func GetFile(src, dst libiut.FileProgress, filenameContain, filenameRegex string) liberr.Error { if _, e := src.Seek(0, io.SeekStart); e != nil { return ErrorFileSeek.ErrorParent(e) @@ -59,14 +61,14 @@ func GetFile(src, dst ioutils.FileProgress, filenameContain, filenameRegex strin continue } - f := archive.NewFileFullPath(h.Name) + f := libarc.NewFileFullPath(h.Name) //nolint #nosec /* #nosec */ if f.MatchingFullPath(filenameContain) || f.RegexFullPath(filenameRegex) { - if _, e := dst.ReadFrom(r); e != nil { + if _, e = dst.ReadFrom(r); e != nil { return ErrorIOCopy.ErrorParent(e) - } else if _, e := dst.Seek(0, io.SeekStart); e != nil { + } else if _, e = dst.Seek(0, io.SeekStart); e != nil { return ErrorFileSeek.ErrorParent(e) } else { return nil @@ -75,7 +77,7 @@ func GetFile(src, dst ioutils.FileProgress, filenameContain, filenameRegex strin } } -func GetAll(src io.ReadSeeker, outputFolder string, defaultDirPerm os.FileMode) errors.Error { +func GetAll(src io.ReadSeeker, outputFolder string, defaultDirPerm os.FileMode) liberr.Error { if _, e := src.Seek(0, io.SeekStart); e != nil { return ErrorFileSeek.ErrorParent(e) @@ -93,16 +95,16 @@ func GetAll(src io.ReadSeeker, outputFolder string, defaultDirPerm os.FileMode) //nolint #nosec /* #nosec */ - if err := writeContent(r, h, path.Join(outputFolder, h.Name), defaultDirPerm); err != nil { + if err := writeContent(r, h, path.Join(outputFolder, path.Clean(h.Name)), defaultDirPerm); err != nil { return err } } } -func writeContent(r io.Reader, h *tar.Header, out string, defaultDirPerm os.FileMode) (err errors.Error) { +func writeContent(r io.Reader, h *tar.Header, out string, defaultDirPerm os.FileMode) (err liberr.Error) { var ( inf = h.FileInfo() - dst ioutils.FileProgress + dst libiut.FileProgress ) if e := dirIsExistOrCreate(path.Dir(out), defaultDirPerm); e != nil { @@ -121,34 +123,26 @@ func writeContent(r io.Reader, h *tar.Header, out string, defaultDirPerm os.File if h.Typeflag&tar.TypeDir == tar.TypeDir { err = dirIsExistOrCreate(out, h.FileInfo().Mode()) return - } else if err = notDirExistCannotClean(out); err != nil { + } else if err = notDirExistCannotClean(out, h.Typeflag, h.Linkname); err != nil { return } else if h.Typeflag&tar.TypeLink == tar.TypeLink { - e := os.Link(h.Linkname, out) - if e != nil { - err = ErrorLinkCreate.ErrorParent(e) - } - return + return createLink(out, path.Clean(h.Linkname), false) } else if h.Typeflag&tar.TypeSymlink == tar.TypeSymlink { - e := os.Symlink(h.Linkname, out) - if e != nil { - err = ErrorSymLinkCreate.ErrorParent(e) - } - return + return createLink(out, path.Clean(h.Linkname), true) } - if dst, err = ioutils.NewFileProgressPathWrite(out, true, true, inf.Mode()); err != nil { + if dst, err = libiut.NewFileProgressPathWrite(out, true, true, inf.Mode()); err != nil { return ErrorFileOpen.Error(err) } else if _, e := io.Copy(dst, r); e != nil { return ErrorIOCopy.ErrorParent(e) - } else if e := dst.Close(); e != nil { + } else if e = dst.Close(); e != nil { return ErrorFileClose.ErrorParent(e) } return nil } -func dirIsExistOrCreate(dirname string, dirPerm os.FileMode) errors.Error { +func dirIsExistOrCreate(dirname string, dirPerm os.FileMode) liberr.Error { if i, e := os.Stat(dirname); e != nil && os.IsNotExist(e) { if e = os.MkdirAll(dirname, dirPerm); e != nil { return ErrorDirCreate.ErrorParent(e) @@ -162,20 +156,79 @@ func dirIsExistOrCreate(dirname string, dirPerm os.FileMode) errors.Error { return nil } -func notDirExistCannotClean(filename string) errors.Error { +func notDirExistCannotClean(filename string, flag byte, targetLink string) liberr.Error { + if strings.EqualFold(runtime.GOOS, "windows") { + if flag&tar.TypeLink == tar.TypeLink { + return nil + } else if flag&tar.TypeSymlink == tar.TypeSymlink { + return nil + } + } + if _, e := os.Stat(filename); e != nil && os.IsNotExist(e) { return nil } else if e != nil { return ErrorDestinationStat.ErrorParent(e) - } else if e = os.Remove(filename); e != nil { - err := ErrorDestinationRemove.ErrorParent(e) - - if e = syscall.Rmdir(filename); e != nil { - err.AddParentError(ErrorDestinationIsDir.ErrorParent(e)) + } else if flag&tar.TypeLink == tar.TypeLink || flag&tar.TypeSymlink == tar.TypeSymlink { + if hasFSLink(filename) && compareLinkTarget(filename, targetLink) { + return nil } + } + if e := os.Remove(filename); e != nil { + err := ErrorDestinationRemove.ErrorParent(e) return err } return nil } + +func hasFSLink(path string) bool { + link, _ := filepath.EvalSymlinks(path) + + if link != "" { + return true + } + + return false +} + +func createLink(link, target string, sym bool) liberr.Error { + if strings.EqualFold(runtime.GOOS, "windows") { + return nil + } + + if _, e := os.Stat(link); e != nil && !os.IsNotExist(e) { + return ErrorDestinationStat.ErrorParent(e) + } else if e == nil { + return nil + } else if compareLinkTarget(link, target) { + return nil + } + + if sym { + err := os.Symlink(path.Clean(target), path.Clean(link)) + if err != nil { + return ErrorLinkCreate.ErrorParent(err) + } + } else { + err := os.Link(path.Clean(target), path.Clean(link)) + if err != nil { + return ErrorLinkCreate.ErrorParent(err) + } + } + + return nil +} + +func compareLinkTarget(link, target string) bool { + var l string + + l, _ = filepath.EvalSymlinks(link) + + if l == "" { + return false + } + + return strings.EqualFold(path.Clean(l), path.Clean(target)) +} diff --git a/archive/zip/reader.go b/archive/zip/reader.go index 4404cdc9..ed3f3a35 100644 --- a/archive/zip/reader.go +++ b/archive/zip/reader.go @@ -38,27 +38,28 @@ import ( func GetFile(src, dst ioutils.FileProgress, filenameContain, filenameRegex string) errors.Error { var ( - r *zip.Reader - i os.FileInfo - e error + arc *zip.Reader + inf os.FileInfo + err error ) - if _, e = src.Seek(0, io.SeekStart); e != nil { - return ErrorFileSeek.ErrorParent(e) - } else if _, e = dst.Seek(0, io.SeekStart); e != nil { - return ErrorFileSeek.ErrorParent(e) - } else if i, e = src.FileStat(); e != nil { - return ErrorFileStat.ErrorParent(e) - } else if r, e = zip.NewReader(src, i.Size()); e != nil { - return ErrorZipOpen.ErrorParent(e) + if _, err = src.Seek(0, io.SeekStart); err != nil { + return ErrorFileSeek.ErrorParent(err) + } else if _, err = dst.Seek(0, io.SeekStart); err != nil { + return ErrorFileSeek.ErrorParent(err) + } else if inf, err = src.FileStat(); err != nil { + return ErrorFileStat.ErrorParent(err) + } else if arc, err = zip.NewReader(src, inf.Size()); err != nil { + return ErrorZipOpen.ErrorParent(err) } - for _, f := range r.File { + for _, f := range arc.File { if f.Mode()&os.ModeType == os.ModeType { continue } z := archive.NewFileFullPath(f.Name) + if z.MatchingFullPath(filenameContain) || z.RegexFullPath(filenameRegex) { if f == nil { continue @@ -119,7 +120,7 @@ func GetAll(src ioutils.FileProgress, outputFolder string, defaultDirPerm os.Fil //nolint #nosec /* #nosec */ - if err := writeContent(f, path.Join(outputFolder, f.Name), defaultDirPerm); err != nil { + if err := writeContent(f, path.Join(outputFolder, path.Clean(f.Name)), defaultDirPerm); err != nil { return err } } @@ -157,6 +158,8 @@ func writeContent(f *zip.File, out string, defaultDirPerm os.FileMode) (err erro if inf.IsDir() { err = dirIsExistOrCreate(out, inf.Mode()) return + } else if inf.Mode()&os.ModeSymlink == os.ModeSymlink { + return nil } else if err = notDirExistCannotClean(out); err != nil { return } @@ -169,7 +172,7 @@ func writeContent(f *zip.File, out string, defaultDirPerm os.FileMode) (err erro //nolint #nosec /* #nosec */ - if _, e := io.Copy(dst, r); e != nil { + if _, e = io.Copy(dst, r); e != nil { return ErrorIOCopy.ErrorParent(e) } else if e = dst.Close(); e != nil { return ErrorFileClose.ErrorParent(e) diff --git a/go.mod b/go.mod index 13fad47b..e44d8d99 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.17.1 github.com/aws/aws-sdk-go-v2/config v1.17.10 github.com/aws/aws-sdk-go-v2/credentials v1.12.23 - github.com/aws/aws-sdk-go-v2/service/iam v1.18.22 + github.com/aws/aws-sdk-go-v2/service/iam v1.18.23 github.com/aws/aws-sdk-go-v2/service/s3 v1.29.1 github.com/bits-and-blooms/bitset v1.3.3 github.com/c-bata/go-prompt v0.2.6 @@ -15,7 +15,7 @@ require ( github.com/fxamacker/cbor/v2 v2.4.0 github.com/gin-gonic/gin v1.8.1 github.com/go-ldap/ldap/v3 v3.4.4 - github.com/go-playground/validator/v10 v10.11.1 + github.com/go-playground/validator/v10 v10.10.0 github.com/google/go-github/v33 v33.0.0 github.com/hashicorp/go-hclog v1.3.1 github.com/hashicorp/go-retryablehttp v0.7.1 @@ -27,10 +27,10 @@ require ( github.com/mattn/go-colorable v0.1.13 github.com/mitchellh/go-homedir v1.1.0 github.com/nats-io/jwt/v2 v2.3.0 - github.com/nats-io/nats-server/v2 v2.9.3 - github.com/nats-io/nats.go v1.18.0 + github.com/nats-io/nats-server/v2 v2.9.4 + github.com/nats-io/nats.go v1.19.0 github.com/onsi/ginkgo/v2 v2.4.0 - github.com/onsi/gomega v1.22.1 + github.com/onsi/gomega v1.23.0 github.com/pelletier/go-toml v1.9.5 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.13.0 @@ -44,7 +44,7 @@ require ( github.com/xhit/go-simple-mail v2.2.2+incompatible github.com/xujiajun/nutsdb v0.10.0 github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235 - golang.org/x/exp v0.0.0-20221026004748-78e5e7837ae6 + golang.org/x/exp v0.0.0-20221026153819-32f3d567a233 golang.org/x/net v0.1.0 golang.org/x/oauth2 v0.1.0 golang.org/x/sync v0.1.0 @@ -53,26 +53,26 @@ require ( gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/clickhouse v0.5.0 gorm.io/driver/mysql v1.4.3 - gorm.io/driver/postgres v1.4.4 + gorm.io/driver/postgres v1.4.5 gorm.io/driver/sqlite v1.4.3 gorm.io/driver/sqlserver v1.4.1 - gorm.io/gorm v1.24.0 + gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755 ) require ( github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e // indirect github.com/ClickHouse/ch-go v0.48.0 // indirect github.com/ClickHouse/clickhouse-go/v2 v2.3.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.22.0+incompatible // indirect - github.com/PuerkitoBio/goquery v1.8.0 // indirect - github.com/VictoriaMetrics/metrics v1.23.0 // indirect - github.com/VividCortex/ewma v1.2.0 // indirect + github.com/Masterminds/semver v1.4.2 // indirect + github.com/Masterminds/sprig v2.16.0+incompatible // indirect + github.com/PuerkitoBio/goquery v1.5.0 // indirect + github.com/VictoriaMetrics/metrics v1.6.2 // indirect + github.com/VividCortex/ewma v1.1.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/andybalholm/brotli v1.0.4 // indirect - github.com/andybalholm/cascadia v1.3.1 // indirect - github.com/armon/go-metrics v0.4.1 // indirect + github.com/andybalholm/cascadia v1.0.0 // indirect + github.com/aokoli/goutils v1.0.1 // indirect + github.com/armon/go-metrics v0.3.10 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 // indirect @@ -97,7 +97,6 @@ require ( github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect - github.com/go-errors/errors v1.4.2 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.6.1 // indirect github.com/go-logr/logr v1.2.3 // indirect @@ -105,28 +104,28 @@ require ( github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect - github.com/goccy/go-json v0.9.11 // indirect + github.com/goccy/go-json v0.9.7 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.1.2 // indirect + github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 // indirect + github.com/google/btree v1.0.0 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/css v1.0.0 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-msgpack v1.1.5 // indirect + github.com/hashicorp/go-msgpack v0.5.3 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/memberlist v0.5.0 // indirect - github.com/huandu/xstrings v1.3.2 // indirect - github.com/imdario/mergo v0.3.13 // indirect + github.com/hashicorp/memberlist v0.2.2 // indirect + github.com/huandu/xstrings v1.2.0 // indirect + github.com/imdario/mergo v0.3.6 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.13.0 // indirect @@ -136,66 +135,61 @@ require ( github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.12.0 // indirect github.com/jackc/pgx/v4 v4.17.2 // indirect - github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba // indirect + github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/juju/ratelimit v1.0.2 // indirect + github.com/juju/ratelimit v1.0.2-0.20191002062651-f60b32039441 // indirect github.com/klauspost/compress v1.15.11 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/kr/pretty v0.3.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/lni/goutils v1.3.0 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mattn/go-sqlite3 v1.14.15 // indirect - github.com/mattn/go-tty v0.0.4 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-tty v0.0.3 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/microsoft/go-mssqldb v0.17.0 // indirect - github.com/miekg/dns v1.1.50 // indirect + github.com/miekg/dns v1.1.26 // indirect github.com/minio/highwayhash v1.0.2 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nats-io/nkeys v0.3.0 // indirect github.com/nats-io/nuid v1.0.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/olekukonko/tablewriter v0.0.1 // indirect github.com/paulmach/orb v0.7.1 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/term v1.2.0-beta.2 // indirect - github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.4.2 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/rogpeppe/go-internal v1.8.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/afero v1.8.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/subosito/gotenv v1.4.1 // indirect github.com/ugorji/go/codec v1.2.7 // indirect - github.com/valyala/fastrand v1.1.0 // indirect - github.com/valyala/histogram v1.2.0 // indirect - github.com/vanng822/css v1.0.1 // indirect - github.com/vanng822/go-premailer v1.20.1 // indirect + github.com/valyala/fastrand v1.0.0 // indirect + github.com/valyala/histogram v1.0.1 // indirect + github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 // indirect + github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xujiajun/mmap-go v1.0.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.opentelemetry.io/otel v1.11.1 // indirect - go.opentelemetry.io/otel/trace v1.11.1 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/mod v0.6.0 // indirect + go.opentelemetry.io/otel v1.10.0 // indirect + go.opentelemetry.io/otel/trace v1.10.0 // indirect + golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b // indirect golang.org/x/text v0.4.0 // indirect - golang.org/x/time v0.1.0 // indirect - golang.org/x/tools v0.2.0 // indirect + golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect