mirror of
https://github.com/safing/portmaster
synced 2025-09-02 02:29:12 +00:00
123 lines
3 KiB
Go
123 lines
3 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"path"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/safing/portmaster/service/updates"
|
|
)
|
|
|
|
func convertV1(indexData []byte, baseURL string, lastUpdate time.Time) (*updates.Index, error) {
|
|
// Parse old index.
|
|
oldIndex := make(map[string]string)
|
|
err := json.Unmarshal(indexData, &oldIndex)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse old v1 index: %w", err)
|
|
}
|
|
|
|
// Create new index.
|
|
newIndex := &updates.Index{
|
|
Published: lastUpdate,
|
|
Artifacts: make([]*updates.Artifact, 0, len(oldIndex)),
|
|
}
|
|
|
|
// Convert all entries.
|
|
if err := convertEntries(newIndex, baseURL, oldIndex); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return newIndex, nil
|
|
}
|
|
|
|
type IndexV2 struct {
|
|
Channel string
|
|
Published time.Time
|
|
Releases map[string]string
|
|
}
|
|
|
|
func convertV2(indexData []byte, baseURL string) (*updates.Index, error) {
|
|
// Parse old index.
|
|
oldIndex := &IndexV2{}
|
|
err := json.Unmarshal(indexData, oldIndex)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse old v2 index: %w", err)
|
|
}
|
|
|
|
// Create new index.
|
|
newIndex := &updates.Index{
|
|
Published: oldIndex.Published,
|
|
Artifacts: make([]*updates.Artifact, 0, len(oldIndex.Releases)),
|
|
}
|
|
|
|
// Convert all entries.
|
|
if err := convertEntries(newIndex, baseURL, oldIndex.Releases); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return newIndex, nil
|
|
}
|
|
|
|
func convertEntries(index *updates.Index, baseURL string, entries map[string]string) error {
|
|
entries:
|
|
for identifier, version := range entries {
|
|
dir, filename := path.Split(identifier)
|
|
artifactPath := GetVersionedPath(identifier, version)
|
|
|
|
// Check if file is to be ignored.
|
|
if scanConfig.IsIgnored(artifactPath) {
|
|
continue entries
|
|
}
|
|
|
|
// Get the platform.
|
|
var platform string
|
|
splittedPath := strings.Split(dir, "/")
|
|
if len(splittedPath) >= 1 {
|
|
platform = splittedPath[0]
|
|
if platform == "all" {
|
|
platform = ""
|
|
}
|
|
} else {
|
|
continue entries
|
|
}
|
|
|
|
// Create new artifact.
|
|
newArtifact := &updates.Artifact{
|
|
Filename: filename,
|
|
URLs: []string{baseURL + artifactPath},
|
|
Platform: platform,
|
|
Version: version,
|
|
}
|
|
|
|
// Derive unpack setting.
|
|
unpack, err := scanConfig.UnpackSetting(filename)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get unpack setting for %s: %w", filename, err)
|
|
}
|
|
newArtifact.Unpack = unpack
|
|
|
|
// Add to new index.
|
|
index.Artifacts = append(index.Artifacts, newArtifact)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetVersionedPath combines the identifier and version and returns it as a file path.
|
|
func GetVersionedPath(identifier, version string) (versionedPath string) {
|
|
identifierPath, filename := path.Split(identifier)
|
|
|
|
// Split the filename where the version should go.
|
|
splittedFilename := strings.SplitN(filename, ".", 2)
|
|
// Replace `.` with `-` for the filename format.
|
|
transformedVersion := strings.Replace(version, ".", "-", 2)
|
|
|
|
// Put everything back together and return it.
|
|
versionedPath = identifierPath + splittedFilename[0] + "_v" + transformedVersion
|
|
if len(splittedFilename) > 1 {
|
|
versionedPath += "." + splittedFilename[1]
|
|
}
|
|
return versionedPath
|
|
}
|