mirror of
https://github.com/safing/portmaster
synced 2025-09-02 02:29:12 +00:00
Migrate profile icons from fields to list of icons
This commit is contained in:
parent
e81953d8f3
commit
2a5db42a66
3 changed files with 109 additions and 14 deletions
52
profile/icon.go
Normal file
52
profile/icon.go
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
package profile
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Icon describes an icon.
|
||||||
|
type Icon struct {
|
||||||
|
Type IconType
|
||||||
|
Value string
|
||||||
|
}
|
||||||
|
|
||||||
|
// IconType describes the type of an Icon.
|
||||||
|
type IconType string
|
||||||
|
|
||||||
|
// Supported icon types.
|
||||||
|
const (
|
||||||
|
IconTypeFile IconType = "path"
|
||||||
|
IconTypeDatabase IconType = "database"
|
||||||
|
IconTypeBlob IconType = "blob"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (t IconType) sortOrder() int {
|
||||||
|
switch t {
|
||||||
|
case IconTypeFile:
|
||||||
|
return 1
|
||||||
|
case IconTypeDatabase:
|
||||||
|
return 2
|
||||||
|
case IconTypeBlob:
|
||||||
|
return 3
|
||||||
|
default:
|
||||||
|
return 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortIcons(icons []Icon) {
|
||||||
|
slices.SortFunc[[]Icon, Icon](icons, func(a, b Icon) int {
|
||||||
|
aOrder := a.Type.sortOrder()
|
||||||
|
bOrder := b.Type.sortOrder()
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case aOrder != bOrder:
|
||||||
|
return aOrder - bOrder
|
||||||
|
case a.Value != b.Value:
|
||||||
|
return strings.Compare(a.Value, b.Value)
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
|
@ -25,6 +25,11 @@ func registerMigrations() error {
|
||||||
Version: "v0.9.9",
|
Version: "v0.9.9",
|
||||||
MigrateFunc: migrateLinkedPath,
|
MigrateFunc: migrateLinkedPath,
|
||||||
},
|
},
|
||||||
|
migration.Migration{
|
||||||
|
Description: "Migrate from Icon Fields to Icon List",
|
||||||
|
Version: "v1.5.0", // FIXME
|
||||||
|
MigrateFunc: migrateIcons,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,3 +102,48 @@ func migrateLinkedPath(ctx context.Context, _, to *version.Version, db *database
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func migrateIcons(ctx context.Context, _, to *version.Version, db *database.Interface) error {
|
||||||
|
// Get iterator over all profiles.
|
||||||
|
it, err := db.Query(query.New(profilesDBPath))
|
||||||
|
if err != nil {
|
||||||
|
log.Tracer(ctx).Errorf("profile: failed to migrate from icon fields: failed to start query: %s", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Migrate all profiles.
|
||||||
|
for r := range it.Next {
|
||||||
|
// Parse profile.
|
||||||
|
profile, err := EnsureProfile(r)
|
||||||
|
if err != nil {
|
||||||
|
log.Tracer(ctx).Debugf("profiles: failed to parse profile %s for migration: %s", r.Key(), err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip if there is no (valid) icon defined or the icon list is already populated.
|
||||||
|
if profile.Icon == "" || profile.IconType == "" || len(profile.Icons) > 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Migrate to icon list.
|
||||||
|
profile.Icons = []Icon{{
|
||||||
|
Type: profile.IconType,
|
||||||
|
Value: profile.Icon,
|
||||||
|
}}
|
||||||
|
|
||||||
|
// Save back to DB.
|
||||||
|
err = db.Put(profile)
|
||||||
|
if err != nil {
|
||||||
|
log.Tracer(ctx).Debugf("profiles: failed to save profile %s after migration: %s", r.Key(), err)
|
||||||
|
} else {
|
||||||
|
log.Tracer(ctx).Tracef("profiles: migrated profile %s to %s", r.Key(), to)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if there was an error while iterating.
|
||||||
|
if err := it.Err(); err != nil {
|
||||||
|
log.Tracer(ctx).Errorf("profile: failed to migrate from icon fields: failed to iterate over profiles for migration: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -37,17 +37,6 @@ const (
|
||||||
DefaultActionPermit uint8 = 3
|
DefaultActionPermit uint8 = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
// iconType describes the type of the Icon property
|
|
||||||
// of a profile.
|
|
||||||
type iconType string
|
|
||||||
|
|
||||||
// Supported icon types.
|
|
||||||
const (
|
|
||||||
IconTypeFile iconType = "path"
|
|
||||||
IconTypeDatabase iconType = "database"
|
|
||||||
IconTypeBlob iconType = "blob"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Profile is used to predefine a security profile for applications.
|
// Profile is used to predefine a security profile for applications.
|
||||||
type Profile struct { //nolint:maligned // not worth the effort
|
type Profile struct { //nolint:maligned // not worth the effort
|
||||||
record.Base
|
record.Base
|
||||||
|
@ -73,12 +62,16 @@ type Profile struct { //nolint:maligned // not worth the effort
|
||||||
// Homepage may refer to the website of the application
|
// Homepage may refer to the website of the application
|
||||||
// vendor.
|
// vendor.
|
||||||
Homepage string
|
Homepage string
|
||||||
// Icon holds the icon of the application. The value
|
|
||||||
|
// Deprecated: Icon holds the icon of the application. The value
|
||||||
// may either be a filepath, a database key or a blob URL.
|
// may either be a filepath, a database key or a blob URL.
|
||||||
// See IconType for more information.
|
// See IconType for more information.
|
||||||
Icon string
|
Icon string
|
||||||
// IconType describes the type of the Icon property.
|
// Deprecated: IconType describes the type of the Icon property.
|
||||||
IconType iconType
|
IconType IconType
|
||||||
|
// Icons holds a list of icons to represent the application.
|
||||||
|
Icons []Icon
|
||||||
|
|
||||||
// Deprecated: LinkedPath used to point to the executableis this
|
// Deprecated: LinkedPath used to point to the executableis this
|
||||||
// profile was created for.
|
// profile was created for.
|
||||||
// Until removed, it will be added to the Fingerprints as an exact path match.
|
// Until removed, it will be added to the Fingerprints as an exact path match.
|
||||||
|
|
Loading…
Add table
Reference in a new issue