diff options
author | Yarden Shoham <git@yardenshoham.com> | 2023-04-29 01:06:41 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-28 18:06:41 -0400 |
commit | c0ddec8a2a4cd348462257e0ceb253daf5692c32 (patch) | |
tree | 6fd2e68d8d3b874576fdd6a2c7a4a4681bef6c98 /modules | |
parent | bf77e2163b670797d5bf7199da88789968e47c61 (diff) | |
download | gitea-c0ddec8a2a4cd348462257e0ceb253daf5692c32.tar.gz gitea-c0ddec8a2a4cd348462257e0ceb253daf5692c32.zip |
Revert "Add Debian package registry" (#24412)
Reverts go-gitea/gitea#22854
Diffstat (limited to 'modules')
-rw-r--r-- | modules/packages/debian/metadata.go | 216 | ||||
-rw-r--r-- | modules/packages/debian/metadata_test.go | 171 | ||||
-rw-r--r-- | modules/packages/hashed_buffer.go | 22 | ||||
-rw-r--r-- | modules/packages/hashed_buffer_test.go | 2 | ||||
-rw-r--r-- | modules/packages/nuget/symbol_extractor.go | 2 | ||||
-rw-r--r-- | modules/setting/packages.go | 2 | ||||
-rw-r--r-- | modules/util/filebuffer/file_backed_buffer.go | 5 |
7 files changed, 10 insertions, 410 deletions
diff --git a/modules/packages/debian/metadata.go b/modules/packages/debian/metadata.go deleted file mode 100644 index 08daaf082e..0000000000 --- a/modules/packages/debian/metadata.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2023 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package debian - -import ( - "archive/tar" - "bufio" - "compress/gzip" - "io" - "net/mail" - "regexp" - "strings" - - "code.gitea.io/gitea/modules/util" - "code.gitea.io/gitea/modules/validation" - - "github.com/blakesmith/ar" - "github.com/klauspost/compress/zstd" - "github.com/ulikunitz/xz" -) - -const ( - PropertyDistribution = "debian.distribution" - PropertyComponent = "debian.component" - PropertyArchitecture = "debian.architecture" - PropertyControl = "debian.control" - PropertyRepositoryIncludeInRelease = "debian.repository.include_in_release" - - SettingKeyPrivate = "debian.key.private" - SettingKeyPublic = "debian.key.public" - - RepositoryPackage = "_debian" - RepositoryVersion = "_repository" -) - -var ( - ErrMissingControlFile = util.NewInvalidArgumentErrorf("control file is missing") - ErrUnsupportedCompression = util.NewInvalidArgumentErrorf("unsupported compression algorithmn") - ErrInvalidName = util.NewInvalidArgumentErrorf("package name is invalid") - ErrInvalidVersion = util.NewInvalidArgumentErrorf("package version is invalid") - ErrInvalidArchitecture = util.NewInvalidArgumentErrorf("package architecture is invalid") - - // https://www.debian.org/doc/debian-policy/ch-controlfields.html#source - namePattern = regexp.MustCompile(`\A[a-z0-9][a-z0-9+-.]+\z`) - // https://www.debian.org/doc/debian-policy/ch-controlfields.html#version - versionPattern = regexp.MustCompile(`\A(?:[0-9]:)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?\z`) -) - -type Package struct { - Name string - Version string - Architecture string - Control string - Metadata *Metadata -} - -type Metadata struct { - Maintainer string `json:"maintainer,omitempty"` - ProjectURL string `json:"project_url,omitempty"` - Description string `json:"description,omitempty"` - Dependencies []string `json:"dependencies,omitempty"` -} - -// ParsePackage parses the Debian package file -// https://manpages.debian.org/bullseye/dpkg-dev/deb.5.en.html -func ParsePackage(r io.Reader) (*Package, error) { - arr := ar.NewReader(r) - - for { - hd, err := arr.Next() - if err == io.EOF { - break - } - if err != nil { - return nil, err - } - - if strings.HasPrefix(hd.Name, "control.tar") { - var inner io.Reader - switch hd.Name[11:] { - case "": - inner = arr - case ".gz": - gzr, err := gzip.NewReader(arr) - if err != nil { - return nil, err - } - defer gzr.Close() - - inner = gzr - case ".xz": - xzr, err := xz.NewReader(arr) - if err != nil { - return nil, err - } - - inner = xzr - case ".zst": - zr, err := zstd.NewReader(arr) - if err != nil { - return nil, err - } - defer zr.Close() - - inner = zr - default: - return nil, ErrUnsupportedCompression - } - - tr := tar.NewReader(inner) - for { - hd, err := tr.Next() - if err == io.EOF { - break - } - if err != nil { - return nil, err - } - - if hd.Typeflag != tar.TypeReg { - continue - } - - if hd.FileInfo().Name() == "control" { - return ParseControlFile(tr) - } - } - } - } - - return nil, ErrMissingControlFile -} - -// ParseControlFile parses a Debian control file to retrieve the metadata -func ParseControlFile(r io.Reader) (*Package, error) { - p := &Package{ - Metadata: &Metadata{}, - } - - key := "" - var depends strings.Builder - var control strings.Builder - - s := bufio.NewScanner(io.TeeReader(r, &control)) - for s.Scan() { - line := s.Text() - - trimmed := strings.TrimSpace(line) - if trimmed == "" { - continue - } - - if line[0] == ' ' || line[0] == '\t' { - switch key { - case "Description": - p.Metadata.Description += line - case "Depends": - depends.WriteString(trimmed) - } - } else { - parts := strings.SplitN(trimmed, ":", 2) - if len(parts) < 2 { - continue - } - - key = parts[0] - value := strings.TrimSpace(parts[1]) - switch key { - case "Package": - if !namePattern.MatchString(value) { - return nil, ErrInvalidName - } - p.Name = value - case "Version": - if !versionPattern.MatchString(value) { - return nil, ErrInvalidVersion - } - p.Version = value - case "Architecture": - if value == "" { - return nil, ErrInvalidArchitecture - } - p.Architecture = value - case "Maintainer": - a, err := mail.ParseAddress(value) - if err != nil || a.Name == "" { - p.Metadata.Maintainer = value - } else { - p.Metadata.Maintainer = a.Name - } - case "Description": - p.Metadata.Description = value - case "Depends": - depends.WriteString(value) - case "Homepage": - if validation.IsValidURL(value) { - p.Metadata.ProjectURL = value - } - } - } - } - if err := s.Err(); err != nil { - return nil, err - } - - dependencies := strings.Split(depends.String(), ",") - for i := range dependencies { - dependencies[i] = strings.TrimSpace(dependencies[i]) - } - p.Metadata.Dependencies = dependencies - - p.Control = control.String() - - return p, nil -} diff --git a/modules/packages/debian/metadata_test.go b/modules/packages/debian/metadata_test.go deleted file mode 100644 index 69fd51ea79..0000000000 --- a/modules/packages/debian/metadata_test.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2023 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package debian - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "io" - "testing" - - "github.com/blakesmith/ar" - "github.com/klauspost/compress/zstd" - "github.com/stretchr/testify/assert" - "github.com/ulikunitz/xz" -) - -const ( - packageName = "gitea" - packageVersion = "0:1.0.1-te~st" - packageArchitecture = "amd64" - packageAuthor = "KN4CK3R" - description = "Description with multiple lines." - projectURL = "https://gitea.io" -) - -func TestParsePackage(t *testing.T) { - createArchive := func(files map[string][]byte) io.Reader { - var buf bytes.Buffer - aw := ar.NewWriter(&buf) - aw.WriteGlobalHeader() - for filename, content := range files { - hdr := &ar.Header{ - Name: filename, - Mode: 0o600, - Size: int64(len(content)), - } - aw.WriteHeader(hdr) - aw.Write(content) - } - return &buf - } - - t.Run("MissingControlFile", func(t *testing.T) { - data := createArchive(map[string][]byte{"dummy.txt": {}}) - - p, err := ParsePackage(data) - assert.Nil(t, p) - assert.ErrorIs(t, err, ErrMissingControlFile) - }) - - t.Run("Compression", func(t *testing.T) { - t.Run("Unsupported", func(t *testing.T) { - data := createArchive(map[string][]byte{"control.tar.foo": {}}) - - p, err := ParsePackage(data) - assert.Nil(t, p) - assert.ErrorIs(t, err, ErrUnsupportedCompression) - }) - - var buf bytes.Buffer - tw := tar.NewWriter(&buf) - tw.WriteHeader(&tar.Header{ - Name: "control", - Mode: 0o600, - Size: 50, - }) - tw.Write([]byte("Package: gitea\nVersion: 1.0.0\nArchitecture: amd64\n")) - tw.Close() - - t.Run("None", func(t *testing.T) { - data := createArchive(map[string][]byte{"control.tar": buf.Bytes()}) - - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) - - t.Run("gz", func(t *testing.T) { - var zbuf bytes.Buffer - zw := gzip.NewWriter(&zbuf) - zw.Write(buf.Bytes()) - zw.Close() - - data := createArchive(map[string][]byte{"control.tar.gz": zbuf.Bytes()}) - - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) - - t.Run("xz", func(t *testing.T) { - var xbuf bytes.Buffer - xw, _ := xz.NewWriter(&xbuf) - xw.Write(buf.Bytes()) - xw.Close() - - data := createArchive(map[string][]byte{"control.tar.xz": xbuf.Bytes()}) - - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) - - t.Run("zst", func(t *testing.T) { - var zbuf bytes.Buffer - zw, _ := zstd.NewWriter(&zbuf) - zw.Write(buf.Bytes()) - zw.Close() - - data := createArchive(map[string][]byte{"control.tar.zst": zbuf.Bytes()}) - - p, err := ParsePackage(data) - assert.NotNil(t, p) - assert.NoError(t, err) - assert.Equal(t, "gitea", p.Name) - }) - }) -} - -func TestParseControlFile(t *testing.T) { - buildContent := func(name, version, architecture string) *bytes.Buffer { - var buf bytes.Buffer - buf.WriteString("Package: " + name + "\nVersion: " + version + "\nArchitecture: " + architecture + "\nMaintainer: " + packageAuthor + " <kn4ck3r@gitea.io>\nHomepage: " + projectURL + "\nDepends: a,\n b\nDescription: Description\n with multiple\n lines.") - return &buf - } - - t.Run("InvalidName", func(t *testing.T) { - for _, name := range []string{"", "-cd"} { - p, err := ParseControlFile(buildContent(name, packageVersion, packageArchitecture)) - assert.Nil(t, p) - assert.ErrorIs(t, err, ErrInvalidName) - } - }) - - t.Run("InvalidVersion", func(t *testing.T) { - for _, version := range []string{"", "1-", ":1.0", "1_0"} { - p, err := ParseControlFile(buildContent(packageName, version, packageArchitecture)) - assert.Nil(t, p) - assert.ErrorIs(t, err, ErrInvalidVersion) - } - }) - - t.Run("InvalidArchitecture", func(t *testing.T) { - p, err := ParseControlFile(buildContent(packageName, packageVersion, "")) - assert.Nil(t, p) - assert.ErrorIs(t, err, ErrInvalidArchitecture) - }) - - t.Run("Valid", func(t *testing.T) { - content := buildContent(packageName, packageVersion, packageArchitecture) - full := content.String() - - p, err := ParseControlFile(content) - assert.NoError(t, err) - assert.NotNil(t, p) - - assert.Equal(t, packageName, p.Name) - assert.Equal(t, packageVersion, p.Version) - assert.Equal(t, packageArchitecture, p.Architecture) - assert.Equal(t, description, p.Metadata.Description) - assert.Equal(t, projectURL, p.Metadata.ProjectURL) - assert.Equal(t, packageAuthor, p.Metadata.Maintainer) - assert.Equal(t, []string{"a", "b"}, p.Metadata.Dependencies) - assert.Equal(t, full, p.Control) - }) -} diff --git a/modules/packages/hashed_buffer.go b/modules/packages/hashed_buffer.go index 017ddf1c8f..ef00a45057 100644 --- a/modules/packages/hashed_buffer.go +++ b/modules/packages/hashed_buffer.go @@ -25,15 +25,8 @@ type HashedBuffer struct { combinedWriter io.Writer } -const DefaultMemorySize = 32 * 1024 * 1024 - -// NewHashedBuffer creates a hashed buffer with the default memory size -func NewHashedBuffer() (*HashedBuffer, error) { - return NewHashedBufferWithSize(DefaultMemorySize) -} - -// NewHashedBuffer creates a hashed buffer with a specific memory size -func NewHashedBufferWithSize(maxMemorySize int) (*HashedBuffer, error) { +// NewHashedBuffer creates a hashed buffer with a specific maximum memory size +func NewHashedBuffer(maxMemorySize int) (*HashedBuffer, error) { b, err := filebuffer.New(maxMemorySize) if err != nil { return nil, err @@ -50,14 +43,9 @@ func NewHashedBufferWithSize(maxMemorySize int) (*HashedBuffer, error) { }, nil } -// CreateHashedBufferFromReader creates a hashed buffer with the default memory size and copies the provided reader data into it. -func CreateHashedBufferFromReader(r io.Reader) (*HashedBuffer, error) { - return CreateHashedBufferFromReaderWithSize(r, DefaultMemorySize) -} - -// CreateHashedBufferFromReaderWithSize creates a hashed buffer and copies the provided reader data into it. -func CreateHashedBufferFromReaderWithSize(r io.Reader, maxMemorySize int) (*HashedBuffer, error) { - b, err := NewHashedBufferWithSize(maxMemorySize) +// CreateHashedBufferFromReader creates a hashed buffer and copies the provided reader data into it. +func CreateHashedBufferFromReader(r io.Reader, maxMemorySize int) (*HashedBuffer, error) { + b, err := NewHashedBuffer(maxMemorySize) if err != nil { return nil, err } diff --git a/modules/packages/hashed_buffer_test.go b/modules/packages/hashed_buffer_test.go index 564e782f18..e907aa0605 100644 --- a/modules/packages/hashed_buffer_test.go +++ b/modules/packages/hashed_buffer_test.go @@ -26,7 +26,7 @@ func TestHashedBuffer(t *testing.T) { } for _, c := range cases { - buf, err := CreateHashedBufferFromReaderWithSize(strings.NewReader(c.Data), c.MaxMemorySize) + buf, err := CreateHashedBufferFromReader(strings.NewReader(c.Data), c.MaxMemorySize) assert.NoError(t, err) assert.EqualValues(t, len(c.Data), buf.Size()) diff --git a/modules/packages/nuget/symbol_extractor.go b/modules/packages/nuget/symbol_extractor.go index 81bf0371a0..b709eac4c1 100644 --- a/modules/packages/nuget/symbol_extractor.go +++ b/modules/packages/nuget/symbol_extractor.go @@ -63,7 +63,7 @@ func ExtractPortablePdb(r io.ReaderAt, size int64) (PortablePdbList, error) { return err } - buf, err := packages.CreateHashedBufferFromReader(f) + buf, err := packages.CreateHashedBufferFromReader(f, 32*1024*1024) f.Close() diff --git a/modules/setting/packages.go b/modules/setting/packages.go index b52bbf40c7..89601c3b99 100644 --- a/modules/setting/packages.go +++ b/modules/setting/packages.go @@ -30,7 +30,6 @@ var ( LimitSizeConan int64 LimitSizeConda int64 LimitSizeContainer int64 - LimitSizeDebian int64 LimitSizeGeneric int64 LimitSizeHelm int64 LimitSizeMaven int64 @@ -74,7 +73,6 @@ func loadPackagesFrom(rootCfg ConfigProvider) { Packages.LimitSizeConan = mustBytes(sec, "LIMIT_SIZE_CONAN") Packages.LimitSizeConda = mustBytes(sec, "LIMIT_SIZE_CONDA") Packages.LimitSizeContainer = mustBytes(sec, "LIMIT_SIZE_CONTAINER") - Packages.LimitSizeDebian = mustBytes(sec, "LIMIT_SIZE_DEBIAN") Packages.LimitSizeGeneric = mustBytes(sec, "LIMIT_SIZE_GENERIC") Packages.LimitSizeHelm = mustBytes(sec, "LIMIT_SIZE_HELM") Packages.LimitSizeMaven = mustBytes(sec, "LIMIT_SIZE_MAVEN") diff --git a/modules/util/filebuffer/file_backed_buffer.go b/modules/util/filebuffer/file_backed_buffer.go index 6b07bd0413..bfddf90e92 100644 --- a/modules/util/filebuffer/file_backed_buffer.go +++ b/modules/util/filebuffer/file_backed_buffer.go @@ -7,10 +7,11 @@ import ( "bytes" "errors" "io" - "math" "os" ) +const maxInt = int(^uint(0) >> 1) // taken from bytes.Buffer + var ( // ErrInvalidMemorySize occurs if the memory size is not in a valid range ErrInvalidMemorySize = errors.New("Memory size must be greater 0 and lower math.MaxInt32") @@ -36,7 +37,7 @@ type FileBackedBuffer struct { // New creates a file backed buffer with a specific maximum memory size func New(maxMemorySize int) (*FileBackedBuffer, error) { - if maxMemorySize < 0 || maxMemorySize > math.MaxInt32 { + if maxMemorySize < 0 || maxMemorySize > maxInt { return nil, ErrInvalidMemorySize } |