diff --git a/process/tags/svchost_windows.go b/process/tags/svchost_windows.go index 417604f2..ca3f2067 100644 --- a/process/tags/svchost_windows.go +++ b/process/tags/svchost_windows.go @@ -1,6 +1,7 @@ package tags import ( + "context" "fmt" "strings" @@ -8,6 +9,7 @@ import ( "github.com/safing/portbase/utils/osdetail" "github.com/safing/portmaster/process" "github.com/safing/portmaster/profile" + "github.com/safing/portmaster/profile/icons" ) func init() { @@ -81,11 +83,10 @@ func (h *SVCHostTagHandler) AddTags(p *process.Process) { // Returns nil to skip. func (h *SVCHostTagHandler) CreateProfile(p *process.Process) *profile.Profile { if tag, ok := p.GetTag(svchostTagKey); ok { - return profile.New(&profile.Profile{ + // Create new profile based on tag. + newProfile := profile.New(&profile.Profile{ Source: profile.SourceLocal, Name: "Windows Service: " + osdetail.GenerateBinaryNameFromPath(tag.Value), - Icon: `C:\Windows\System32\@WLOGO_48x48.png`, - IconType: profile.IconTypeFile, UsePresentationPath: false, Fingerprints: []profile.Fingerprint{ profile.Fingerprint{ @@ -96,6 +97,14 @@ func (h *SVCHostTagHandler) CreateProfile(p *process.Process) *profile.Profile { }, }, }) + + // Load default icon for windows service. + icon, err := icons.LoadAndSaveIcon(context.TODO(), `C:\Windows\System32\@WLOGO_48x48.png`) + if err == nil { + newProfile.Icons = []icons.Icon{*icon} + } + + return newProfile } return nil diff --git a/profile/icons/find_linux.go b/profile/icons/find_linux.go index 86a79534..5162eaad 100644 --- a/profile/icons/find_linux.go +++ b/profile/icons/find_linux.go @@ -21,19 +21,7 @@ func FindIcon(ctx context.Context, binName string, homeDir string) (*Icon, error return nil, nil } - // Load icon and save it. - data, err := os.ReadFile(iconPath) - if err != nil { - return nil, fmt.Errorf("failed to read icon %s: %w", iconPath, err) - } - filename, err := UpdateProfileIcon(data, filepath.Ext(iconPath)) - if err != nil { - return nil, fmt.Errorf("failed to import icon %s: %w", iconPath, err) - } - return &Icon{ - Type: IconTypeAPI, - Value: filename, - }, nil + return LoadAndSaveIcon(ctx, iconPath) } func search(binName string, homeDir string) (iconPath string, err error) { diff --git a/profile/icons/icons.go b/profile/icons/icons.go index 9e701f5f..e5833504 100644 --- a/profile/icons/icons.go +++ b/profile/icons/icons.go @@ -1,6 +1,7 @@ package icons import ( + "context" "crypto" "encoding/hex" "errors" @@ -78,4 +79,22 @@ func UpdateProfileIcon(data []byte, ext string) (filename string, err error) { return filename, os.WriteFile(filepath.Join(ProfileIconStoragePath, filename), data, 0o0644) //nolint:gosec } +// LoadAndSaveIcon loads an icon from disk, updates it in the icon database +// and returns the icon object. +func LoadAndSaveIcon(ctx context.Context, iconPath string) (*Icon, error) { + // Load icon and save it. + data, err := os.ReadFile(iconPath) + if err != nil { + return nil, fmt.Errorf("failed to read icon %s: %w", iconPath, err) + } + filename, err := UpdateProfileIcon(data, filepath.Ext(iconPath)) + if err != nil { + return nil, fmt.Errorf("failed to import icon %s: %w", iconPath, err) + } + return &Icon{ + Type: IconTypeAPI, + Value: filename, + }, nil +} + // TODO: Clean up icons regularly.