Improve profile metadata handling
This commit is contained in:
@@ -64,14 +64,14 @@ func GetProcessByConnection(ctx context.Context, pktInfo *packet.Info) (process
|
||||
func GetNetworkHost(ctx context.Context, remoteIP net.IP) (process *Process, err error) { //nolint:interfacer
|
||||
now := time.Now().Unix()
|
||||
networkHost := &Process{
|
||||
Name: fmt.Sprintf("Network Host %s", remoteIP),
|
||||
UserName: "Unknown",
|
||||
Name: fmt.Sprintf("Device at %s", remoteIP),
|
||||
UserName: "N/A",
|
||||
UserID: NetworkHostProcessID,
|
||||
Pid: NetworkHostProcessID,
|
||||
ParentPid: NetworkHostProcessID,
|
||||
Tags: []profile.Tag{
|
||||
{
|
||||
Key: "net",
|
||||
Key: "ip",
|
||||
Value: remoteIP.String(),
|
||||
},
|
||||
},
|
||||
@@ -89,16 +89,6 @@ func GetNetworkHost(ctx context.Context, remoteIP net.IP) (process *Process, err
|
||||
networkHost.PrimaryProfileID = networkHostProfile.ScopedID()
|
||||
networkHost.profile = networkHostProfile.LayeredProfile()
|
||||
|
||||
if networkHostProfile.Name == "" {
|
||||
// Assign name and save.
|
||||
networkHostProfile.Name = networkHost.Name
|
||||
|
||||
err := networkHostProfile.Save()
|
||||
if err != nil {
|
||||
log.Warningf("process: failed to save profile %s: %s", networkHostProfile.ScopedID(), err)
|
||||
}
|
||||
}
|
||||
|
||||
return networkHost, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -15,9 +15,6 @@ var ownPID = os.Getpid()
|
||||
|
||||
// GetProfile finds and assigns a profile set to the process.
|
||||
func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
|
||||
// Update profile metadata outside of *Process lock.
|
||||
defer p.UpdateProfileMetadata()
|
||||
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -114,24 +111,3 @@ func (p *Process) loadSpecialProfile(_ context.Context) (*profile.Profile, error
|
||||
// Return special profile.
|
||||
return profile.GetSpecialProfile(specialProfileID, p.Path)
|
||||
}
|
||||
|
||||
// UpdateProfileMetadata updates the metadata of the local profile
|
||||
// as required.
|
||||
func (p *Process) UpdateProfileMetadata() {
|
||||
// Check if there is a profile to work with.
|
||||
localProfile := p.Profile().LocalProfile()
|
||||
if localProfile == nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Update metadata of profile.
|
||||
metadataUpdated := localProfile.UpdateMetadata(p.Path)
|
||||
|
||||
// Save the profile if we changed something.
|
||||
if metadataUpdated {
|
||||
err := localProfile.Save()
|
||||
if err != nil {
|
||||
log.Warningf("process: failed to save profile %s: %s", localProfile.ScopedID(), err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package tags
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/safing/portbase/utils/osdetail"
|
||||
"github.com/safing/portmaster/process"
|
||||
"github.com/safing/portmaster/profile"
|
||||
)
|
||||
@@ -71,8 +72,10 @@ func (h *AppImageHandler) CreateProfile(p *process.Process) *profile.Profile {
|
||||
for _, tag := range p.Tags {
|
||||
if tag.Key == appImagePathTagKey {
|
||||
return profile.New(&profile.Profile{
|
||||
Source: profile.SourceLocal,
|
||||
PresentationPath: p.Path,
|
||||
Source: profile.SourceLocal,
|
||||
Name: osdetail.GenerateBinaryNameFromPath(tag.Value),
|
||||
PresentationPath: p.Path,
|
||||
UsePresentationPath: true,
|
||||
Fingerprints: []profile.Fingerprint{
|
||||
{
|
||||
Type: profile.FingerprintTypePathID,
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/safing/portbase/log"
|
||||
"github.com/safing/portbase/utils/osdetail"
|
||||
"github.com/safing/portmaster/process"
|
||||
"github.com/safing/portmaster/profile"
|
||||
)
|
||||
@@ -17,7 +18,7 @@ func init() {
|
||||
}
|
||||
|
||||
const (
|
||||
svchostName = "SvcHost"
|
||||
svchostName = "Service Host"
|
||||
svchostTagKey = "svchost"
|
||||
)
|
||||
|
||||
@@ -26,7 +27,7 @@ type SVCHostTagHandler struct{}
|
||||
|
||||
// Name returns the tag handler name.
|
||||
func (h *SVCHostTagHandler) Name() string {
|
||||
return svcHostName
|
||||
return svchostName
|
||||
}
|
||||
|
||||
// TagDescriptions returns a list of all possible tags and their description
|
||||
@@ -34,7 +35,7 @@ func (h *SVCHostTagHandler) Name() string {
|
||||
func (h *SVCHostTagHandler) TagDescriptions() []process.TagDescription {
|
||||
return []process.TagDescription{
|
||||
process.TagDescription{
|
||||
ID: svcHostTagKey,
|
||||
ID: svchostTagKey,
|
||||
Name: "SvcHost Service Name",
|
||||
Description: "Name of a service running in svchost.exe as reported by Windows.",
|
||||
},
|
||||
@@ -43,7 +44,7 @@ func (h *SVCHostTagHandler) TagDescriptions() []process.TagDescription {
|
||||
|
||||
// TagKeys returns a list of all possible tag keys of this handler.
|
||||
func (h *SVCHostTagHandler) TagKeys() []string {
|
||||
return []string{svcHostTagKey}
|
||||
return []string{svchostTagKey}
|
||||
}
|
||||
|
||||
// AddTags adds tags to the given process.
|
||||
@@ -61,7 +62,7 @@ func (h *SVCHostTagHandler) AddTags(p *process.Process) {
|
||||
p.Name += fmt.Sprintf(" (%s)", strings.Join(svcNames, ", "))
|
||||
// Add services as tags.
|
||||
for _, svcName := range svcNames {
|
||||
p.Tag = append(p.Tag, profile.Tag{
|
||||
p.Tags = append(p.Tags, profile.Tag{
|
||||
Key: svchostTagKey,
|
||||
Value: svcName,
|
||||
})
|
||||
@@ -78,19 +79,19 @@ func (h *SVCHostTagHandler) AddTags(p *process.Process) {
|
||||
func (h *SVCHostTagHandler) CreateProfile(p *process.Process) *profile.Profile {
|
||||
for _, tag := range p.Tags {
|
||||
if tag.Key == svchostTagKey {
|
||||
return profile.New(
|
||||
profile.SourceLocal,
|
||||
"",
|
||||
"Windows Service: "+tag.Value,
|
||||
p.Path,
|
||||
[]profile.Fingerprint{profile.Fingerprint{
|
||||
Type: profile.FingerprintTypeTagID,
|
||||
Key: tag.Key,
|
||||
Operation: profile.FingerprintOperationEqualsID,
|
||||
Value: tag.Value,
|
||||
}},
|
||||
nil,
|
||||
)
|
||||
return profile.New(&profile.Profile{
|
||||
Source: profile.SourceLocal,
|
||||
Name: "Windows Service: " + osdetail.GenerateBinaryNameFromPath(tag.Value),
|
||||
UsePresentationPath: false,
|
||||
Fingerprints: []profile.Fingerprint{
|
||||
profile.Fingerprint{
|
||||
Type: profile.FingerprintTypeTagID,
|
||||
Key: tag.Key,
|
||||
Operation: profile.FingerprintOperationEqualsID,
|
||||
Value: tag.Value,
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -4,6 +4,8 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/safing/portbase/utils/osdetail"
|
||||
|
||||
"github.com/safing/portbase/log"
|
||||
|
||||
"github.com/safing/portbase/utils"
|
||||
@@ -20,7 +22,7 @@ func init() {
|
||||
|
||||
// Add custom WindowsApps path.
|
||||
customWinStorePath := os.ExpandEnv(`%ProgramFiles%\WindowsApps\`)
|
||||
if !utils.StringSliceEqual(winStorePaths, customWinStorePath) {
|
||||
if !utils.StringInSlice(winStorePaths, customWinStorePath) {
|
||||
winStorePaths = append(winStorePaths, customWinStorePath)
|
||||
}
|
||||
}
|
||||
@@ -64,7 +66,7 @@ func (h *WinStoreHandler) AddTags(p *process.Process) {
|
||||
var appDir string
|
||||
for _, winStorePath := range winStorePaths {
|
||||
if strings.HasPrefix(p.Path, winStorePath) {
|
||||
appDir := strings.SplitN(strings.TrimPrefix(p.Path, winStorePath), `\`, 2)[0]
|
||||
appDir = strings.SplitN(strings.TrimPrefix(p.Path, winStorePath), `\`, 2)[0]
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -75,7 +77,7 @@ func (h *WinStoreHandler) AddTags(p *process.Process) {
|
||||
// Extract information from path.
|
||||
// Example: Microsoft.Office.OneNote_17.6769.57631.0_x64__8wekyb3d8bbwe
|
||||
splitted := strings.Split(appDir, "_")
|
||||
if splitted != 5 { // Four fields, one "__".
|
||||
if len(splitted) != 5 { // Four fields, one "__".
|
||||
log.Debugf("profile/tags: windows store app has incompatible app dir format: %q", appDir)
|
||||
return
|
||||
}
|
||||
@@ -102,9 +104,10 @@ func (h *WinStoreHandler) CreateProfile(p *process.Process) *profile.Profile {
|
||||
for _, tag := range p.Tags {
|
||||
if tag.Key == winStoreAppNameTagKey {
|
||||
return profile.New(&profile.Profile{
|
||||
Source: profile.SourceLocal,
|
||||
Name: tag.Value,
|
||||
PresentationPath: p.Path,
|
||||
Source: profile.SourceLocal,
|
||||
Name: osdetail.GenerateBinaryNameFromPath(tag.Value),
|
||||
PresentationPath: p.Path,
|
||||
UsePresentationPath: true,
|
||||
Fingerprints: []profile.Fingerprint{
|
||||
{
|
||||
Type: profile.FingerprintTypeTagID,
|
||||
|
||||
Reference in New Issue
Block a user