New feature: FETCH() permits http gets in dnsconfig.js (#1007)

add PANIC() and error-handled FETCH()
This commit is contained in:
Yuhui Xu 2021-01-06 23:45:32 +08:00 committed by GitHub
parent 120694bfad
commit 6efedd689d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 253 additions and 130 deletions

View file

@ -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

View file

@ -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 %}

View file

@ -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 %}

2
go.mod
View file

@ -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

13
go.sum
View file

@ -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=

View file

@ -962,3 +962,7 @@ function CLI_DEFAULTS(defaults) {
}
}
}
function FETCH() {
return fetch.apply(null, arguments).catch(PANIC);
}

View file

@ -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))
}

View file

@ -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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
`,
},
}