From bf8a7659b5446ad68e9e9e2fa371efddc8d17906 Mon Sep 17 00:00:00 2001 From: evilsocket Date: Sat, 23 Mar 2019 20:52:49 +0100 Subject: [PATCH] new: caplets will now include the list of sub scripts and files in api.rest --- caplets/caplet.go | 22 +++++++++++++++++----- caplets/manager.go | 28 ++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/caplets/caplet.go b/caplets/caplet.go index 8a876a4d..e838a370 100644 --- a/caplets/caplet.go +++ b/caplets/caplet.go @@ -8,22 +8,34 @@ import ( "github.com/evilsocket/islazy/fs" ) -type Caplet struct { - Name string `json:"name"` +type Script struct { Path string `json:"path"` Size int64 `json:"size"` Code []string `json:"code"` } -func NewCaplet(name string, path string, size int64) Caplet { - return Caplet{ - Name: name, +func newScript(path string, size int64) Script { + return Script{ Path: path, Size: size, Code: make([]string, 0), } } +type Caplet struct { + Script + Name string `json:"name"` + Scripts []Script `json:"scripts"` +} + +func NewCaplet(name string, path string, size int64) Caplet { + return Caplet{ + Script: newScript(path, size), + Name: name, + Scripts: make([]Script, 0), + } +} + func (cap *Caplet) Eval(argv []string, lineCb func(line string) error) error { if argv == nil { argv = []string{} diff --git a/caplets/manager.go b/caplets/manager.go index a3f3ebe7..acc84950 100644 --- a/caplets/manager.go +++ b/caplets/manager.go @@ -2,6 +2,7 @@ package caplets import ( "fmt" + "io/ioutil" "os" "path/filepath" "sort" @@ -68,10 +69,9 @@ func Load(name string) (error, *Caplet) { for _, fileName := range names { if stats, err := os.Stat(fileName); err == nil { cap := &Caplet{ - Name: baseName, - Path: fileName, - Code: make([]string, 0), - Size: stats.Size(), + Script: newScript(fileName, stats.Size()), + Name: baseName, + Scripts: make([]Script, 0), } cache[name] = cap @@ -84,6 +84,26 @@ func Load(name string) (error, *Caplet) { } cap.Code = append(cap.Code, line) } + + // the caplet has a dedicated folder + if strings.Contains(baseName, "/") || strings.Contains(baseName, "\\") { + dir := filepath.Dir(fileName) + // get all secondary .cap and .js files + if files, err := ioutil.ReadDir(dir); err == nil && len(files) > 0 { + for _, f := range files { + subFileName := filepath.Join(dir, f.Name()) + if subFileName != fileName && (strings.HasSuffix(subFileName, ".cap") || strings.HasSuffix(subFileName, ".js")) { + if reader, err := fs.LineReader(subFileName); err == nil { + script := newScript(subFileName, f.Size()) + for line := range reader { + script.Code = append(script.Code, line) + } + cap.Scripts = append(cap.Scripts, script) + } + } + } + } + } } return nil, cap