From 4940280737e715b7e355726f5f3c00331824ce93 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 17 Nov 2023 12:21:34 +0100 Subject: [PATCH] Improve Interpreter matching --- process/tags/interpreter_unix.go | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/process/tags/interpreter_unix.go b/process/tags/interpreter_unix.go index c254f4a7..a5ba2c18 100644 --- a/process/tags/interpreter_unix.go +++ b/process/tags/interpreter_unix.go @@ -7,10 +7,12 @@ import ( "os" "path/filepath" "regexp" + "strings" "unicode/utf8" "github.com/google/shlex" + "github.com/safing/portbase/utils/osdetail" "github.com/safing/portmaster/process" "github.com/safing/portmaster/profile" ) @@ -24,7 +26,8 @@ func init() { type interpType struct { process.TagDescription - Regex *regexp.Regexp + Extensions []string + Regex *regexp.Regexp } var knownInterperters = []interpType{ @@ -33,35 +36,40 @@ var knownInterperters = []interpType{ ID: "python-script", Name: "Python Script", }, - Regex: regexp.MustCompile(`^(/usr)?/bin/python[23]\.[0-9]+$`), + Extensions: []string{".py", ".py2", ".py3"}, + Regex: regexp.MustCompile(`^(/usr)?/bin/python[23](\.[0-9]+)?$`), }, { TagDescription: process.TagDescription{ ID: "shell-script", Name: "Shell Script", }, - Regex: regexp.MustCompile(`^(/usr)?/bin/(ba|k|z|a)?sh$`), + Extensions: []string{".sh", ".bash", ".ksh", ".zsh", ".ash"}, + Regex: regexp.MustCompile(`^(/usr)?/bin/(ba|k|z|a)?sh$`), }, { TagDescription: process.TagDescription{ ID: "perl-script", Name: "Perl Script", }, - Regex: regexp.MustCompile(`^(/usr)?/bin/perl$`), + Extensions: []string{".pl"}, + Regex: regexp.MustCompile(`^(/usr)?/bin/perl$`), }, { TagDescription: process.TagDescription{ ID: "ruby-script", Name: "Ruby Script", }, - Regex: regexp.MustCompile(`^(/usr)?/bin/ruby$`), + Extensions: []string{".rb"}, + Regex: regexp.MustCompile(`^(/usr)?/bin/ruby$`), }, { TagDescription: process.TagDescription{ ID: "nodejs-script", Name: "NodeJS Script", }, - Regex: regexp.MustCompile(`^(/usr)?/bin/node(js)?$`), + Extensions: []string{".js"}, + Regex: regexp.MustCompile(`^(/usr)?/bin/node(js)?$`), }, /* While similar to nodejs, electron is a bit harder as it uses a multiple processes @@ -148,16 +156,23 @@ func (h *InterpHandler) CreateProfile(p *process.Process) *profile.Profile { args = args[1:] } + // Create a nice script name from filename. + scriptName := filepath.Base(args[0]) + for _, ext := range it.Extensions { + scriptName, _ = strings.CutSuffix(scriptName, ext) + } + scriptName = osdetail.GenerateBinaryNameFromPath(scriptName) + return profile.New(&profile.Profile{ Source: profile.SourceLocal, - Name: fmt.Sprintf("%s: %s", it.Name, args[0]), + Name: fmt.Sprintf("%s: %s", it.Name, scriptName), PresentationPath: tag.Value, UsePresentationPath: true, Fingerprints: []profile.Fingerprint{ { Type: profile.FingerprintTypeTagID, - Operation: profile.FingerprintOperationEqualsID, Key: it.ID, + Operation: profile.FingerprintOperationEqualsID, Value: tag.Value, }, },