Files
2026-07-13 12:35:43 +08:00

57 lines
1.6 KiB
Go

package pluginstore
import (
"context"
"crypto/sha256"
"encoding/hex"
"fmt"
"strings"
)
func SelectArtifact(plan InstallPlan, goos string, goarch string) (Artifact, error) {
plan = NormalizeInstallPlan(plan)
goos = normalizeGOOS(goos)
goarch = normalizeGOARCH(goarch)
if plan.Type != InstallTypeDirect {
return Artifact{}, fmt.Errorf("install type %q is not direct", plan.Type)
}
for _, artifact := range plan.Artifacts {
if artifact.GOOS == goos && artifact.GOARCH == goarch {
return artifact, nil
}
}
return Artifact{}, fmt.Errorf("artifact not found for %s/%s", goos, goarch)
}
func (c Client) DownloadArtifact(ctx context.Context, artifact Artifact) ([]byte, error) {
artifact = NormalizeInstallPlan(InstallPlan{Type: InstallTypeDirect, Artifacts: []Artifact{artifact}}).Artifacts[0]
if errValidate := ValidateArtifact(artifact); errValidate != nil {
return nil, errValidate
}
maxSize := int64(0)
if artifact.Size > 0 {
maxSize = artifact.Size
}
data, errDownload := c.get(ctx, artifact.URL, "application/octet-stream", RequestKindArtifact, maxSize)
if errDownload != nil {
return nil, errDownload
}
if maxSize > 0 && int64(len(data)) > maxSize {
return nil, fmt.Errorf("artifact exceeds declared size")
}
return data, nil
}
func VerifyArtifactChecksum(artifact Artifact, data []byte) error {
expected := strings.ToLower(strings.TrimSpace(artifact.SHA256))
if expected == "" {
return fmt.Errorf("artifact checksum missing")
}
actualBytes := sha256.Sum256(data)
actual := hex.EncodeToString(actualBytes[:])
if actual != expected {
return fmt.Errorf("artifact checksum mismatch")
}
return nil
}