From 97a46d1e57630539388c95eaf04565db60ef1d60 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 30 Oct 2018 19:13:44 +0100 Subject: [PATCH] Start process adaption --- process/fileinfo.go | 47 +------- process/find.go | 2 +- process/getpid_linux.go | 2 +- process/proc/processfinder.go | 2 +- process/proc/sockets.go | 2 +- process/process.go | 201 ++++++++++++++-------------------- 6 files changed, 89 insertions(+), 167 deletions(-) diff --git a/process/fileinfo.go b/process/fileinfo.go index beb67bec..0bfa2018 100644 --- a/process/fileinfo.go +++ b/process/fileinfo.go @@ -3,11 +3,11 @@ package process import ( - "github.com/Safing/safing-core/database" "strings" + "sync" "time" - datastore "github.com/ipfs/go-datastore" + "github.com/Safing/portbase/database/record" ) // ExecutableSignature stores a signature of an executable. @@ -15,52 +15,15 @@ type ExecutableSignature []byte // FileInfo stores (security) information about a file. type FileInfo struct { - database.Base + record.Base + sync.Mutex + HumanName string Owners []string ApproxLastSeen int64 Signature *ExecutableSignature } -var fileInfoModel *FileInfo // only use this as parameter for database.EnsureModel-like functions - -func init() { - database.RegisterModel(fileInfoModel, func() database.Model { return new(FileInfo) }) -} - -// Create saves FileInfo with the provided name in the default namespace. -func (m *FileInfo) Create(name string) error { - return m.CreateObject(&database.FileInfoCache, name, m) -} - -// CreateInNamespace saves FileInfo with the provided name in the provided namespace. -func (m *FileInfo) CreateInNamespace(namespace *datastore.Key, name string) error { - return m.CreateObject(namespace, name, m) -} - -// Save saves FileInfo. -func (m *FileInfo) Save() error { - return m.SaveObject(m) -} - -// getFileInfo fetches FileInfo with the provided name from the default namespace. -func getFileInfo(name string) (*FileInfo, error) { - return getFileInfoFromNamespace(&database.FileInfoCache, name) -} - -// getFileInfoFromNamespace fetches FileInfo with the provided name from the provided namespace. -func getFileInfoFromNamespace(namespace *datastore.Key, name string) (*FileInfo, error) { - object, err := database.GetAndEnsureModel(namespace, name, fileInfoModel) - if err != nil { - return nil, err - } - model, ok := object.(*FileInfo) - if !ok { - return nil, database.NewMismatchError(object, fileInfoModel) - } - return model, nil -} - // GetFileInfo gathers information about a file and returns *FileInfo func GetFileInfo(path string) *FileInfo { // TODO: actually get file information diff --git a/process/find.go b/process/find.go index 9df4840f..7c3d5cb7 100644 --- a/process/find.go +++ b/process/find.go @@ -4,7 +4,7 @@ import ( "errors" "net" - "github.com/Safing/safing-core/network/packet" + "github.com/Safing/portmaster/network/packet" ) var ( diff --git a/process/getpid_linux.go b/process/getpid_linux.go index 098b443e..79c2a9db 100644 --- a/process/getpid_linux.go +++ b/process/getpid_linux.go @@ -1,6 +1,6 @@ package process -import "github.com/Safing/safing-core/process/proc" +import "github.com/Safing/portmaster/process/proc" var ( getTCP4PacketInfo = proc.GetTCP4PacketInfo diff --git a/process/proc/processfinder.go b/process/proc/processfinder.go index 00edf3cb..b2c25ef2 100644 --- a/process/proc/processfinder.go +++ b/process/proc/processfinder.go @@ -10,7 +10,7 @@ import ( "sync" "syscall" - "github.com/Safing/safing-core/log" + "github.com/Safing/portbase/log" ) var ( diff --git a/process/proc/sockets.go b/process/proc/sockets.go index e453ca12..9dea4c00 100644 --- a/process/proc/sockets.go +++ b/process/proc/sockets.go @@ -13,7 +13,7 @@ import ( "sync" "unicode" - "github.com/Safing/safing-core/log" + "github.com/Safing/portbase/log" ) /* diff --git a/process/process.go b/process/process.go index 2043f84a..33b2f636 100644 --- a/process/process.go +++ b/process/process.go @@ -3,22 +3,23 @@ package process import ( + "errors" "fmt" "runtime" "strconv" - "strings" + "sync" - datastore "github.com/ipfs/go-datastore" processInfo "github.com/shirou/gopsutil/process" - "github.com/Safing/safing-core/database" - "github.com/Safing/safing-core/log" - "github.com/Safing/safing-core/profiles" + "github.com/Safing/portbase/database/record" + "github.com/Safing/portbase/log" ) // A Process represents a process running on the operating system type Process struct { - database.Base + record.Base + sync.Mutex + UserID int UserName string UserHome string @@ -30,58 +31,20 @@ type Process struct { CmdLine string FirstArg string ProfileKey string - Profile *profiles.Profile Name string Icon string // Icon is a path to the icon and is either prefixed "f:" for filepath, "d:" for database cache path or "c:"/"a:" for a the icon key to fetch it from a company / authoritative node and cache it in its own cache. } -var processModel *Process // only use this as parameter for database.EnsureModel-like functions - -func init() { - database.RegisterModel(processModel, func() database.Model { return new(Process) }) -} - -// Create saves Process with the provided name in the default namespace. -func (m *Process) Create(name string) error { - return m.CreateObject(&database.Processes, name, m) -} - -// CreateInNamespace saves Process with the provided name in the provided namespace. -func (m *Process) CreateInNamespace(namespace *datastore.Key, name string) error { - return m.CreateObject(namespace, name, m) -} - -// Save saves Process. -func (m *Process) Save() error { - return m.SaveObject(m) -} - // GetProcess fetches Process with the provided name from the default namespace. func GetProcess(name string) (*Process, error) { - return GetProcessFromNamespace(&database.Processes, name) -} - -// GetProcessFromNamespace fetches Process with the provided name from the provided namespace. -func GetProcessFromNamespace(namespace *datastore.Key, name string) (*Process, error) { - object, err := database.GetAndEnsureModel(namespace, name, processModel) - if err != nil { - return nil, err - } - model, ok := object.(*Process) - if !ok { - return nil, database.NewMismatchError(object, processModel) - } - return model, nil + return nil, errors.New("NIY") } func (m *Process) String() string { if m == nil { return "?" } - if m.Profile != nil && !m.Profile.Default { - return fmt.Sprintf("%s:%s:%d", m.UserName, m.Profile, m.Pid) - } return fmt.Sprintf("%s:%s:%d", m.UserName, m.Path, m.Pid) } @@ -99,10 +62,6 @@ func GetOrFindProcess(pid int) (*Process, error) { case (pid == 0 && runtime.GOOS == "linux") || (pid == 4 && runtime.GOOS == "windows"): new.UserName = "Kernel" new.Name = "Operating System" - new.Profile = &profiles.Profile{ - Name: "OS", - Flags: []int8{profiles.Internet, profiles.LocalNet, profiles.Directconnect, profiles.Service}, - } default: pInfo, err := processInfo.NewProcess(int32(pid)) @@ -167,77 +126,77 @@ func GetOrFindProcess(pid int) (*Process, error) { // new.Icon, err = // get Profile - processPath := new.Path - var applyProfile *profiles.Profile - iterations := 0 - for applyProfile == nil { - - iterations++ - if iterations > 10 { - log.Warningf("process: got into loop while getting profile for %s", new) - break - } - - applyProfile, err = profiles.GetActiveProfileByPath(processPath) - if err == database.ErrNotFound { - applyProfile, err = profiles.FindProfileByPath(processPath, new.UserHome) - } - if err != nil { - log.Warningf("process: could not get profile for %s: %s", new, err) - } else if applyProfile == nil { - log.Warningf("process: no default profile found for %s", new) - } else { - - // TODO: there is a lot of undefined behaviour if chaining framework profiles - - // process framework - if applyProfile.Framework != nil { - if applyProfile.Framework.FindParent > 0 { - var ppid int32 - for i := uint8(1); i < applyProfile.Framework.FindParent; i++ { - parent, err := pInfo.Parent() - if err != nil { - return nil, err - } - ppid = parent.Pid - } - if applyProfile.Framework.MergeWithParent { - return GetOrFindProcess(int(ppid)) - } - // processPath, err = os.Readlink(fmt.Sprintf("/proc/%d/exe", pid)) - // if err != nil { - // return nil, fmt.Errorf("could not read /proc/%d/exe: %s", pid, err) - // } - continue - } - - newCommand, err := applyProfile.Framework.GetNewPath(new.CmdLine, new.Cwd) - if err != nil { - return nil, err - } - - // assign - new.CmdLine = newCommand - new.Path = strings.SplitN(newCommand, " ", 2)[0] - processPath = new.Path - - // make sure we loop - applyProfile = nil - continue - } - - // apply profile to process - log.Debugf("process: applied profile to %s: %s", new, applyProfile) - new.Profile = applyProfile - new.ProfileKey = applyProfile.GetKey().String() - - // update Profile with Process icon if Profile does not have one - if !new.Profile.Default && new.Icon != "" && new.Profile.Icon == "" { - new.Profile.Icon = new.Icon - new.Profile.Save() - } - } - } + // processPath := new.Path + // var applyProfile *profiles.Profile + // iterations := 0 + // for applyProfile == nil { + // + // iterations++ + // if iterations > 10 { + // log.Warningf("process: got into loop while getting profile for %s", new) + // break + // } + // + // applyProfile, err = profiles.GetActiveProfileByPath(processPath) + // if err == database.ErrNotFound { + // applyProfile, err = profiles.FindProfileByPath(processPath, new.UserHome) + // } + // if err != nil { + // log.Warningf("process: could not get profile for %s: %s", new, err) + // } else if applyProfile == nil { + // log.Warningf("process: no default profile found for %s", new) + // } else { + // + // // TODO: there is a lot of undefined behaviour if chaining framework profiles + // + // // process framework + // if applyProfile.Framework != nil { + // if applyProfile.Framework.FindParent > 0 { + // var ppid int32 + // for i := uint8(1); i < applyProfile.Framework.FindParent; i++ { + // parent, err := pInfo.Parent() + // if err != nil { + // return nil, err + // } + // ppid = parent.Pid + // } + // if applyProfile.Framework.MergeWithParent { + // return GetOrFindProcess(int(ppid)) + // } + // // processPath, err = os.Readlink(fmt.Sprintf("/proc/%d/exe", pid)) + // // if err != nil { + // // return nil, fmt.Errorf("could not read /proc/%d/exe: %s", pid, err) + // // } + // continue + // } + // + // newCommand, err := applyProfile.Framework.GetNewPath(new.CmdLine, new.Cwd) + // if err != nil { + // return nil, err + // } + // + // // assign + // new.CmdLine = newCommand + // new.Path = strings.SplitN(newCommand, " ", 2)[0] + // processPath = new.Path + // + // // make sure we loop + // applyProfile = nil + // continue + // } + // + // // apply profile to process + // log.Debugf("process: applied profile to %s: %s", new, applyProfile) + // new.Profile = applyProfile + // new.ProfileKey = applyProfile.GetKey().String() + // + // // update Profile with Process icon if Profile does not have one + // if !new.Profile.Default && new.Icon != "" && new.Profile.Icon == "" { + // new.Profile.Icon = new.Icon + // new.Profile.Save() + // } + // } + // } // get FileInfo new.FileInfo = GetFileInfo(new.Path) @@ -245,7 +204,7 @@ func GetOrFindProcess(pid int) (*Process, error) { } // save to DB - new.Create(strconv.Itoa(new.Pid)) + // new.Save() return new, nil }