- Deleted old deb822_encode.go and deb822_types.go files. - Introduced new deb822_encode.go with improved Marshall function and Writer struct for encoding. - Added deb822_decode.go for decoding functionality with enhanced error handling. - Created deb822_rawdata.go to define RawData type for handling raw deb822 values. - Implemented Description type in deb822/datatype/description.go for structured description handling. - Updated Package struct in dpkg/header.go to use new Description type. - Refactored UnmarshalBinary method in dpkg/header.go to utilize new deb822 decoding logic. - Added comprehensive tests for encoding and decoding in deb822_encode_test.go and deb822_decode_test.go. - Removed internal scanner package as it was no longer needed. Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
152 lines
4.4 KiB
Go
152 lines
4.4 KiB
Go
package apt
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"path"
|
|
"strings"
|
|
"time"
|
|
|
|
"sirherobrine23.com.br/sirherobrine23/go-dpkg/deb822"
|
|
|
|
opengpg_crypto "github.com/ProtonMail/gopenpgp/v3/crypto"
|
|
)
|
|
|
|
var (
|
|
ErrDownServer error = errors.New("server is shutdown or not avaible")
|
|
ErrPackagesNotFound error = errors.New("packages not found")
|
|
)
|
|
|
|
// Release file from dists/<Suite>/Release, dists/<Suite>/InRelease or dists/<Suite>/Release.gpg
|
|
type AptRelease struct {
|
|
Origin string `json:"origin"`
|
|
Label string `json:"label"`
|
|
Suite string `json:"suite"`
|
|
Codename string `json:"codename,omitempty"`
|
|
Date time.Time `json:"date,omitzero"`
|
|
AcquireByHash bool `json:"acquire-by-hash"`
|
|
Archs []string `json:"architectures,omitempty"`
|
|
Components []string `json:"components,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
Extra map[string]string `json:"extra,omitempty"`
|
|
MD5 ReleaseSum `json:"md5,omitempty"`
|
|
SHA1 ReleaseSum `json:"sha1,omitempty"`
|
|
SHA256 ReleaseSum `json:"sha256,omitempty"`
|
|
SHA512 ReleaseSum `json:"sha512,omitempty"`
|
|
}
|
|
|
|
type SuiteAptRelease map[string]*AptRelease
|
|
|
|
// Get [*AptRelease] from AptSource.Suites
|
|
func (apt AptSource) Release() (SuiteAptRelease, error) {
|
|
suites := SuiteAptRelease{}
|
|
for _, uriMain := range apt.URIs {
|
|
for _, suite := range apt.Suites {
|
|
var debRelease map[string]string
|
|
// Attemp get packages with InRelease
|
|
{
|
|
res, err := http.Get(uriMain.ResolveReference(&url.URL{Path: path.Join(uriMain.Path, "dists", suite, "InRelease")}).String())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
if res.StatusCode == http.StatusOK {
|
|
body, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if message, err := opengpg_crypto.NewPGPMessageFromArmored(string(body)); err == nil {
|
|
if debRelease, err = deb822.NewReader(message.NewReader()).Deb822(); err != nil && !(err == io.EOF || err == deb822.ErrNextDeb822) {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// Get packages with Release file
|
|
if debRelease == nil {
|
|
res, err := http.Get(uriMain.ResolveReference(&url.URL{Path: path.Join(uriMain.Path, "dists", suite, "Release")}).String())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
if res.StatusCode == http.StatusOK {
|
|
if debRelease, err = deb822.NewReader(res.Body).Deb822(); err != nil && !(err == io.EOF || err == deb822.ErrNextDeb822) {
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
// Without Release info
|
|
if debRelease == nil {
|
|
return nil, fmt.Errorf("cannot get Release file")
|
|
}
|
|
|
|
release := &AptRelease{
|
|
Label: debRelease["Label"],
|
|
Archs: strings.Fields(debRelease["Architectures"]),
|
|
Description: debRelease["Description"],
|
|
Components: strings.Fields(debRelease["Components"]),
|
|
Codename: debRelease["Codename"],
|
|
Origin: debRelease["Origin"],
|
|
Suite: debRelease["Suite"],
|
|
AcquireByHash: debRelease["Acquire-By-Hash"] == "yes",
|
|
Extra: debRelease,
|
|
}
|
|
|
|
var err error
|
|
if date, ok := debRelease["Date"]; ok {
|
|
if release.Date, err = time.Parse(time.RFC1123, date); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
if value, ok := debRelease["MD5Sum"]; ok {
|
|
if release.MD5, err = SumLines(value); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
if value, ok := debRelease["SHA1"]; ok {
|
|
if release.SHA1, err = SumLines(value); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
if value, ok := debRelease["SHA256"]; ok {
|
|
if release.SHA256, err = SumLines(value); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
if value, ok := debRelease["SHA512"]; ok {
|
|
if release.SHA512, err = SumLines(value); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
delete(debRelease, "Label")
|
|
delete(debRelease, "Architectures")
|
|
delete(debRelease, "Description")
|
|
delete(debRelease, "Components")
|
|
delete(debRelease, "Codename")
|
|
delete(debRelease, "Origin")
|
|
delete(debRelease, "Suite")
|
|
delete(debRelease, "Acquire-By-Hash")
|
|
delete(debRelease, "Date")
|
|
delete(debRelease, "MD5Sum")
|
|
delete(debRelease, "SHA1")
|
|
delete(debRelease, "SHA256")
|
|
delete(debRelease, "SHA512")
|
|
|
|
suites[suite] = release
|
|
}
|
|
}
|
|
|
|
if len(suites) > 0 {
|
|
return suites, nil
|
|
}
|
|
return nil, ErrDownServer
|
|
}
|