diff --git a/session/command_handler.go b/session/command_handler.go index e7efad17..7fad33fa 100644 --- a/session/command_handler.go +++ b/session/command_handler.go @@ -3,14 +3,16 @@ package session import ( "github.com/bettercap/readline" "regexp" + "sync" ) type CommandHandler struct { + sync.Mutex Name string Description string Completer *readline.PrefixCompleter Parser *regexp.Regexp - Exec func(args []string, s *Session) error + exec func(args []string, s *Session) error } func NewCommandHandler(name string, expr string, desc string, exec func(args []string, s *Session) error) CommandHandler { @@ -19,7 +21,7 @@ func NewCommandHandler(name string, expr string, desc string, exec func(args []s Description: desc, Completer: nil, Parser: regexp.MustCompile(expr), - Exec: exec, + exec: exec, } } @@ -31,3 +33,9 @@ func (h *CommandHandler) Parse(line string) (bool, []string) { return false, nil } } + +func (h *CommandHandler) Exec(args []string, s *Session) error { + h.Lock() + defer h.Unlock() + return h.exec(args, s) +} diff --git a/session/module_handler.go b/session/module_handler.go index 063f98dc..d23eb1f6 100644 --- a/session/module_handler.go +++ b/session/module_handler.go @@ -5,6 +5,7 @@ import ( "fmt" "regexp" "strconv" + "sync" "github.com/evilsocket/islazy/str" "github.com/evilsocket/islazy/tui" @@ -15,11 +16,13 @@ import ( const IPv4Validator = `^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$` type ModuleHandler struct { + sync.Mutex + Name string Description string Parser *regexp.Regexp - Exec func(args []string) error Completer *readline.PrefixCompleter + exec func(args []string) error } func NewModuleHandler(name string, expr string, desc string, exec func(args []string) error) ModuleHandler { @@ -27,7 +30,7 @@ func NewModuleHandler(name string, expr string, desc string, exec func(args []st Name: name, Description: desc, Parser: nil, - Exec: exec, + exec: exec, } if expr != "" { @@ -62,6 +65,12 @@ func (h *ModuleHandler) Parse(line string) (bool, []string) { return false, nil } +func (h *ModuleHandler) Exec(args []string) error { + h.Lock() + defer h.Unlock() + return h.exec(args) +} + type JSONModuleHandler struct { Name string `json:"name"` Description string `json:"description"` diff --git a/session/session.go b/session/session.go index d3dfa51b..65da22be 100644 --- a/session/session.go +++ b/session/session.go @@ -11,7 +11,6 @@ import ( "runtime/pprof" "sort" "strings" - "sync" "time" "github.com/bettercap/readline" @@ -95,8 +94,6 @@ type Session struct { Events *EventPool `json:"-"` UnkCmdCallback UnknownCommandCallback `json:"-"` Firewall firewall.FirewallManager `json:"-"` - - cmdLock sync.Mutex } func New() (*Session, error) { @@ -121,8 +118,6 @@ func New() (*Session, error) { Modules: make([]Module, 0), Events: nil, UnkCmdCallback: nil, - - cmdLock: sync.Mutex{}, } if *s.Options.CpuProfile != "" { @@ -391,9 +386,6 @@ func parseCapletCommand(line string) (is bool, caplet *caplets.Caplet, argv []st } func (s *Session) Run(line string) error { - s.cmdLock.Lock() - defer s.cmdLock.Unlock() - line = str.TrimRight(line) // remove extra spaces after the first command // so that 'arp.spoof on' is normalized