mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-04-17 19:08:13 +00:00
73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package deb
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/smira/aptly/utils"
|
|
"os"
|
|
)
|
|
|
|
// Changes is a result of .changes file parsing
|
|
type Changes struct {
|
|
Changes string
|
|
Distribution string
|
|
Files PackageFiles
|
|
}
|
|
|
|
// ParseChangesFile does optional signature verification and parses changes files
|
|
func ParseChangesFile(path string, acceptUnsigned, ignoreSignature bool, verifier utils.Verifier) (*Changes, error) {
|
|
input, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer input.Close()
|
|
|
|
isClearSigned, err := verifier.IsClearSigned(input)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
input.Seek(0, 0)
|
|
|
|
if !isClearSigned && !acceptUnsigned {
|
|
return nil, fmt.Errorf(".changes file is not signed and unsigned processing hasn't been enabled")
|
|
}
|
|
|
|
if isClearSigned && !ignoreSignature {
|
|
err = verifier.VerifyClearsigned(input)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
input.Seek(0, 0)
|
|
}
|
|
|
|
var text *os.File
|
|
|
|
if isClearSigned {
|
|
text, err = verifier.ExtractClearsigned(input)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer text.Close()
|
|
} else {
|
|
text = input
|
|
}
|
|
|
|
reader := NewControlFileReader(text)
|
|
stanza, err := reader.ReadStanza()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result := &Changes{
|
|
Distribution: stanza["Distribution"],
|
|
Changes: stanza["Changes"],
|
|
}
|
|
|
|
result.Files, err = result.Files.ParseSumFields(stanza)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return result, nil
|
|
}
|