diff --git a/session/script_builtin_runtime.go b/session/script_builtin_runtime.go index 48eb50c3..33aec042 100644 --- a/session/script_builtin_runtime.go +++ b/session/script_builtin_runtime.go @@ -2,12 +2,16 @@ package session import ( "encoding/json" + "io/ioutil" "github.com/bettercap/bettercap/js" "github.com/evilsocket/islazy/log" "github.com/robertkrimen/otto" ) +// see https://github.com/robertkrimen/otto/issues/213 +var jsRuntime = otto.New() + func jsRunFunc(call otto.FunctionCall) otto.Value { argv := call.ArgumentList argc := len(argv) @@ -79,3 +83,25 @@ func jsOnEventFunc(call otto.FunctionCall) otto.Value { return js.NullValue } + +func jsLoadJSONFunc(call otto.FunctionCall) otto.Value { + argv := call.ArgumentList + argc := len(argv) + if argc != 1 { + return js.ReportError("LoadJSON accepts one string argument") + } else if argv[0].IsString() == false { + return js.ReportError("LoadJSON accepts one string argument") + } + + fileName := argv[0].String() + var obj interface{} + if rawData, err := ioutil.ReadFile(fileName); err != nil { + return js.ReportError("can't read '%s': %v", fileName, err) + } else if err = json.Unmarshal(rawData, &obj); err != nil { + return js.ReportError("can't parse '%s': %v", fileName, err) + } else if v, err := jsRuntime.ToValue(obj); err != nil { + return js.ReportError("could not convert '%s' to javascript object: %s", fileName, err) + } else { + return v + } +} diff --git a/session/session.go b/session/session.go index f2363212..88cd5028 100644 --- a/session/session.go +++ b/session/session.go @@ -312,6 +312,7 @@ func (s *Session) Start() error { // js and session plugin.Defines["env"] = jsEnvFunc plugin.Defines["run"] = jsRunFunc + plugin.Defines["loadJSON"] = jsLoadJSONFunc plugin.Defines["onEvent"] = jsOnEventFunc plugin.Defines["session"] = s