diff --git a/commands/commands.go b/commands/commands.go index 7ef7ee01a..5edff829b 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -10,6 +10,7 @@ import ( "github.com/urfave/cli/v2" "github.com/StackExchange/dnscontrol/v3/models" + "github.com/StackExchange/dnscontrol/v3/pkg/js" "github.com/StackExchange/dnscontrol/v3/pkg/printer" ) @@ -52,6 +53,11 @@ func Run(v string) int { Usage: "Enable detailed logging", Destination: &printer.DefaultPrinter.Verbose, }, + &cli.BoolFlag{ + Name: "allow-fetch", + Usage: "Enable JS fetch(), dangerous on untrusted code!", + Destination: &js.EnableFetch, + }, } sort.Sort(cli.CommandsByName(commands)) app.Commands = commands diff --git a/docs/_functions/global/FETCH.md b/docs/_functions/global/FETCH.md new file mode 100644 index 000000000..47522a223 --- /dev/null +++ b/docs/_functions/global/FETCH.md @@ -0,0 +1,44 @@ +--- +name: FETCH +parameters: + - url + - args +--- + +`FETCH` is a wrapper for the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API). This allows dynamically setting DNS records based on an external data source, e.g. the API of your cloud provider. + +Compared to `fetch` from Fetch API, `FETCH` will call [PANIC](#PANIC) to terminate the execution of the script, and therefore DnsControl, if a network error occurs. + +Otherwise the syntax of `FETCH` is the same as `fetch`. + +`FETCH` is not enabled by default. Please read the warnings below. + +> WARNING: +> +> 1. Relying on external sources adds a point of failure. If the external source doesn't work, your script won't either. Please make sure you are aware of the consequences. +> 2. Make sure DnsControl only uses verified configuration if you want to use `FETCH`. For example, an attacker can send Pull Requests to your config repo, and have your CI test malicious configurations and make arbitrary HTTP requests. Therefore, `FETCH` must be explicitly enabled with flag `--allow-fetch` on DnsControl invocation. + +{% include startExample.html %} +{% highlight js %} +var REG_NONE = NewRegistrar('none', 'NONE'); +var DNS_BIND = NewDnsProvider('bind', 'BIND'); + +D('example.com', REG_NONE, DnsProvider(DNS_BIND), [ + A('@', '1.2.3.4'), +]); + +FETCH('https://example.com', { + // All three options below are optional + headers: {"X-Authentication": "barfoo"}, + method: "POST", + body: "Hello World", +}).then(function(r) { + return r.text(); +}).then(function(t) { + // Example of generating record based on response + D_EXTEND('example.com', [ + TXT('@', t.slice(0, 100)), + ]); +}); +{%endhighlight%} +{% include endExample.html %} diff --git a/docs/_functions/global/PANIC.md b/docs/_functions/global/PANIC.md new file mode 100644 index 000000000..4cf841252 --- /dev/null +++ b/docs/_functions/global/PANIC.md @@ -0,0 +1,13 @@ +--- +name: PANIC +parameters: + - message +--- + +`PANIC` terminates the script and therefore DnsControl with an exit code of 1. This should be used if your script cannot gather enough information to generate records, for example when a HTTP request failed. + +{% include startExample.html %} +{% highlight js %} +PANIC("Something really bad has happened"); +{%endhighlight%} +{% include endExample.html %} diff --git a/go.mod b/go.mod index ddb390a42..080404a15 100644 --- a/go.mod +++ b/go.mod @@ -64,6 +64,7 @@ require ( github.com/tdewolff/test v1.0.6 // indirect github.com/urfave/cli/v2 v2.3.0 github.com/vultr/govultr v1.0.0 + github.com/xddxdd/ottoext v0.0.0-20210101073831-439879ee6281 golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 // indirect golang.org/x/mod v0.4.0 // indirect golang.org/x/net v0.0.0-20201224014010-6772e930b67b @@ -77,7 +78,6 @@ require ( google.golang.org/grpc v1.34.0 // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/ns1/ns1-go.v2 v2.0.0-20170502175150-c563826f4cbe - gopkg.in/sourcemap.v1 v1.0.5 // indirect gopkg.in/square/go-jose.v2 v2.5.1 // indirect gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect diff --git a/go.sum b/go.sum index f9fa3718a..7b5f2c0dd 100644 --- a/go.sum +++ b/go.sum @@ -67,10 +67,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DisposaBoy/JsonConfigReader v0.0.0-20201129172854-99cf318d67e7 h1:AJKJCKcb/psppPl/9CUiQQnTG+Bce0/cIweD5w5Q7aQ= github.com/DisposaBoy/JsonConfigReader v0.0.0-20201129172854-99cf318d67e7/go.mod h1:GCzqZQHydohgVLSIqRKZeTt8IGb1Y4NaFfim3H40uUI= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= +github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/PuerkitoBio/goquery v1.6.0 h1:j7taAbelrdcsOlGeMenZxc2AWXD5fieT1/znArdnx94= github.com/PuerkitoBio/goquery v1.6.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/TomOnTime/utfutil v0.0.0-20200626160131-0b0178852c8f h1:MXp+2PP1RxWWoE3qmOecVblerzKCryXkFXq9er+EDr8= github.com/TomOnTime/utfutil v0.0.0-20200626160131-0b0178852c8f/go.mod h1:FiuynIwe98RFhWI8nZ0dnsldPVsBy9rHH1hn2WYwme4= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/kong v0.2.2/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= @@ -105,6 +109,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -273,6 +279,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA= github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -357,6 +364,7 @@ github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nrdcg/goinwx v0.8.1 h1:20EQ/JaGFnSKwiDH2JzjIpicffl3cPk6imJBDqVBVtU= github.com/nrdcg/goinwx v0.8.1/go.mod h1:tILVc10gieBp/5PMvbcYeXM6pVQ+c9jxDZnpaR1UW7c= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= @@ -419,8 +427,12 @@ github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4= github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/vultr/govultr v1.0.0 h1:yeJrYp9wyA4xXaQZ7eOL2u1wKn2JU79HjRevwvpxbJ4= github.com/vultr/govultr v1.0.0/go.mod h1:wZZXZbYbqyY1n3AldoeYNZK4Wnmmoq6dNFkvd5TV3ss= +github.com/xddxdd/ottoext v0.0.0-20210101073831-439879ee6281 h1:QruJ/b9zaFRxtNYvekIXlqWh/BoJJrSJg+FdmMNp8cw= +github.com/xddxdd/ottoext v0.0.0-20210101073831-439879ee6281/go.mod h1:8Hr+gV9GtucFQOptKfzuYxqg++CyIjg4E7QCR7F3Dxw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -789,6 +801,7 @@ gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/ns1/ns1-go.v2 v2.0.0-20170502175150-c563826f4cbe h1:fuu3vZ8C6O8mk8Ich8YfkDv/Zpnx1HUotQk8JocBcSw= gopkg.in/ns1/ns1-go.v2 v2.0.0-20170502175150-c563826f4cbe/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw= +gopkg.in/readline.v1 v1.0.0-20160726135117-62c6fe619375/go.mod h1:lNEQeAhU009zbRxng+XOj5ITVgY24WcbNnQopyfKoYQ= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4= diff --git a/pkg/js/helpers.js b/pkg/js/helpers.js index e532cc8fd..4297b40fa 100644 --- a/pkg/js/helpers.js +++ b/pkg/js/helpers.js @@ -962,3 +962,7 @@ function CLI_DEFAULTS(defaults) { } } } + +function FETCH() { + return fetch.apply(null, arguments).catch(PANIC); +} diff --git a/pkg/js/js.go b/pkg/js/js.go index 1787dcaeb..a76f8135d 100644 --- a/pkg/js/js.go +++ b/pkg/js/js.go @@ -11,6 +11,11 @@ import ( "github.com/robertkrimen/otto" // load underscore js into vm by default _ "github.com/robertkrimen/otto/underscore" // required by otto + "github.com/xddxdd/ottoext/fetch" + "github.com/xddxdd/ottoext/loop" + "github.com/xddxdd/ottoext/promise" + "github.com/xddxdd/ottoext/timers" + "github.com/StackExchange/dnscontrol/v3/models" "github.com/StackExchange/dnscontrol/v3/pkg/printer" "github.com/StackExchange/dnscontrol/v3/pkg/transform" @@ -24,6 +29,9 @@ import ( // far as require() is concerned, not the actual os.Getwd(). var currentDirectory string +// EnableFetch sets whether to enable fetch() in JS execution environment +var EnableFetch bool = false + // ExecuteJavascript accepts a javascript string and runs it, returning the resulting dnsConfig. func ExecuteJavascript(file string, devMode bool, variables map[string]string) (*models.DNSConfig, error) { script, err := ioutil.ReadFile(file) @@ -35,10 +43,26 @@ func ExecuteJavascript(file string, devMode bool, variables map[string]string) ( currentDirectory = filepath.Dir(file) vm := otto.New() + l := loop.New(vm) + + if err := timers.Define(vm, l); err != nil { + return nil, err + } + if err := promise.Define(vm, l); err != nil { + return nil, err + } + + // only define fetch() when explicitly enabled + if EnableFetch { + if err := fetch.Define(vm, l); err != nil { + return nil, err + } + } vm.Set("require", require) vm.Set("REV", reverse) vm.Set("glob", listFiles) // used for require_glob() + vm.Set("PANIC", jsPanic) // add cli variables to otto for key, value := range variables { @@ -47,12 +71,17 @@ func ExecuteJavascript(file string, devMode bool, variables map[string]string) ( helperJs := GetHelpers(devMode) // run helper script to prime vm and initialize variables - if _, err := vm.Run(helperJs); err != nil { + if err := l.Eval(helperJs); err != nil { return nil, err } // run user script - if _, err := vm.Run(script); err != nil { + if err := l.Eval(script); err != nil { + return nil, err + } + + // wait for event loop to finish + if err := l.Run(); err != nil { return nil, err } @@ -212,6 +241,20 @@ func listFiles(call otto.FunctionCall) otto.Value { return value } +func jsPanic(call otto.FunctionCall) otto.Value { + if len(call.ArgumentList) != 1 { + throw(call.Otto, "PANIC takes exactly one argument") + } + + message := call.Argument(0).String() // The filename as given by the user + fmt.Fprintln(os.Stderr, message) + os.Exit(1) + + // Won't be actually executed + v, _ := otto.ToValue(0) + return v +} + func throw(vm *otto.Otto, str string) { panic(vm.MakeCustomError("Error", str)) } diff --git a/pkg/js/static.go b/pkg/js/static.go index 787617c06..857d7c355 100644 --- a/pkg/js/static.go +++ b/pkg/js/static.go @@ -212,135 +212,135 @@ var _escData = map[string]*_escFile{ "/helpers.js": { name: "helpers.js", local: "pkg/js/helpers.js", - size: 28640, + size: 28716, modtime: 0, compressed: ` -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 -bW+i4G8AAA== +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 `, }, }