From af48a331bf1ec8d30cff7d411afcce37741cbede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sun, 16 Apr 2017 20:53:27 +0300 Subject: [PATCH] cmd: integrate invisible recaptcha into puppeth --- cmd/faucet/faucet.html | 3 +-- cmd/faucet/website.go | 2 +- cmd/puppeth/module_faucet.go | 41 +++++++++++++++++++++++------------- cmd/puppeth/wizard_faucet.go | 25 +++++++++++++++++++++- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index fa715560f..9e02134b7 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -77,7 +77,7 @@

How does this work?

-

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to GitHub accounts. Anyone having a GitHub account may request funds within the permitted limit of {{.Amount}} Ether(s) / {{.Period}}.

+

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to GitHub accounts. Anyone having a GitHub account may request funds within the permitted limit of {{.Amount}} Ether(s) / {{.Period}}.{{if .Recaptcha}} The faucet is running invisible reCaptcha protection against bots.{{end}}

To request funds, simply create a GitHub Gist with your Ethereum address pasted into the contents (the file name doesn't matter), copy paste the gists URL into the above input box and fire away! You can track the current pending requests below the input field to see how much you have to wait until your turn comes.

@@ -136,7 +136,6 @@ } } server.onclose = function() { setTimeout(reconnect, 3000); }; - //server.onerror = function() { setTimeout(reconnect, 3000); }; } // Establish a websocket connection to the API server reconnect(); diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index e85de5bc8..1a5e2e4c5 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\xff\x6f\xdb\xb6\xb6\xff\xd9\xfd\x2b\x4e\xf5\xde\x16\x1b\x89\xa4\xa4\x29\xba\xc1\x91\x3c\x14\x5b\x5f\xb7\x87\x8b\x6d\xd8\x3a\xdc\x3b\x6c\xc3\x05\x25\x1d\x49\x4c\x28\x52\x23\x8f\xec\x78\x81\xff\xf7\x0b\x92\x92\x2c\x3b\x4e\xd7\xdd\xee\x97\x54\x24\x0f\x3f\xe7\x2b\xcf\x17\x37\x79\xfe\xd5\x77\x5f\xbe\xfb\xf9\xfb\x37\x50\x53\x23\x56\xcf\x12\xfb\x0f\x08\x26\xab\x34\x40\x19\xac\x9e\xcd\x92\x1a\x59\xb1\x7a\x36\x9b\x25\x0d\x12\x83\xbc\x66\xda\x20\xa5\x41\x47\x65\xf8\x79\xb0\x3f\xa8\x89\xda\x10\x7f\xef\xf8\x3a\x0d\xfe\x15\xfe\xf4\x3a\xfc\x52\x35\x2d\x23\x9e\x09\x0c\x20\x57\x92\x50\x52\x1a\x7c\xf3\x26\xc5\xa2\xc2\xc9\x3d\xc9\x1a\x4c\x83\x35\xc7\x4d\xab\x34\x4d\x48\x37\xbc\xa0\x3a\x2d\x70\xcd\x73\x0c\xdd\xe2\x02\xb8\xe4\xc4\x99\x08\x4d\xce\x04\xa6\x57\xc1\xea\x99\xc5\x21\x4e\x02\x57\x0f\x0f\xd1\xb7\x48\x1b\xa5\xef\x76\xbb\x25\xbc\xe5\xf4\x75\x97\xc1\xff\xb1\x2e\x47\x4a\x62\x4f\xe2\xa8\x05\x97\x77\x50\x6b\x2c\xd3\xc0\xca\x6c\x96\x71\x9c\x17\xf2\xd6\x44\xb9\x50\x5d\x51\x0a\xa6\x31\xca\x55\x13\xb3\x5b\x76\x1f\x0b\x9e\x99\x98\x36\x9c\x08\x75\x98\x29\x45\x86\x34\x6b\xe3\xeb\xe8\x3a\xfa\x2c\xce\x8d\x89\xc7\xbd\xa8\xe1\x32\xca\x8d\x09\x40\xa3\x48\x03\x43\x5b\x81\xa6\x46\xa4\x00\xe2\xd5\x7f\xc7\xb7\x54\x92\x42\xb6\x41\xa3\x1a\x8c\x5f\x46\x9f\x45\x97\x8e\xe5\x74\xfb\xfd\x5c\x2d\x5b\x93\x6b\xde\x12\x18\x9d\x7f\x30\xdf\xdb\xdf\x3b\xd4\xdb\xf8\x3a\xba\x8a\xae\xfa\x85\xe3\x73\x6b\x82\x55\x12\x7b\xc0\xd5\x47\x61\x87\x52\xd1\x36\x7e\x11\xbd\x8c\xae\xe2\x96\xe5\x77\xac\xc2\x62\xe0\x64\x8f\xa2\x61\xf3\x6f\xe3\xfb\x94\x0f\x6f\x8f\x5d\xf8\x77\x30\x6b\x54\x83\x92\xa2\x5b\x13\xbf\x88\xae\x3e\x8f\x2e\x87\x8d\xc7\xf8\x8e\x81\x75\x9a\x65\x35\x8b\xd6\xa8\x89\xe7\x4c\x84\x39\x4a\x42\x0d\x0f\x76\x77\xd6\x70\x19\xd6\xc8\xab\x9a\x96\x70\x75\x79\xf9\xc9\xcd\xa9\xdd\x75\xed\xb7\x0b\x6e\x5a\xc1\xb6\x4b\x28\x05\xde\xfb\x2d\x26\x78\x25\x43\x4e\xd8\x98\x25\x78\x64\x77\xb0\x73\x3c\x5b\xad\x2a\x8d\xc6\xf4\xcc\x5a\x65\x38\x71\x25\x97\x36\xa2\x18\xf1\x35\x9e\xa2\x35\x2d\x93\x8f\x2e\xb0\xcc\x28\xd1\x11\x1e\x09\x92\x09\x95\xdf\xf9\x3d\xf7\x8c\xa7\x4a\xe4\x4a\x28\xbd\x84\x4d\xcd\xfb\x6b\xe0\x18\x41\xab\xb1\x87\x87\x96\x15\x05\x97\xd5\x12\x5e\xb5\xbd\x3e\xd0\x30\x5d\x71\xb9\x84\xcb\xfd\x95\x24\x1e\xcc\x98\xc4\x3e\x63\x3d\x9b\x25\x99\x2a\xb6\xce\x87\x05\x5f\x43\x2e\x98\x31\x69\x70\x64\x62\x97\x89\x0e\x08\x6c\x02\x62\x5c\x0e\x47\x07\x67\x5a\x6d\x02\x70\x8c\xd2\xc0\x0b\x11\x66\x8a\x48\x35\x4b\xb8\xb2\xe2\xf5\x57\x8e\xf0\x44\x28\xaa\xf0\xea\xc5\x70\x38\x4b\xea\xab\x01\x84\xf0\x9e\x42\xe7\x9f\xd1\x33\xc1\x2a\xe1\xc3\xdd\x92\x41\xc9\xc2\x8c\x51\x1d\x00\xd3\x9c\x85\x35\x2f\x0a\x94\x69\x40\xba\x43\x1b\x47\x7c\x05\xd3\xbc\x37\xa4\xbd\xd7\x1d\xd5\x28\xad\x9e\x84\x45\x9f\x04\xe1\x18\xb6\xe2\x54\x77\x59\xc8\x04\x3d\x09\x9e\xc4\xf5\xd5\xa0\x52\x5c\xf0\x75\x6f\x91\xc9\xe7\x91\x71\x9e\xd6\xff\x73\xe8\x3f\x54\x59\x1a\xa4\x70\x62\x8e\x09\x31\x97\x6d\x47\x61\xa5\x55\xd7\x8e\xe7\xb3\xc4\xed\x02\x2f\xd2\xa0\xe2\x86\x02\xa0\x6d\xdb\xdb\x2e\x18\x55\x52\xba\x09\xad\xeb\xb4\x12\x01\xb4\x82\xe5\x58\x2b\x51\xa0\x4e\x83\xde\x26\x6f\xb9\x21\xf8\xe9\x87\x7f\x40\xef\x60\x2e\x2b\xd8\xaa\x4e\xc3\x1b\xaa\x51\x63\xd7\x00\x2b\x0a\x1b\xdc\x51\x14\x4d\x78\xbb\x48\x7f\x2c\x5d\x98\x91\xdc\x53\xcd\x92\xac\x23\x52\x23\x61\x46\x12\x32\x92\x61\x81\x25\xeb\xc4\x28\xb1\x27\x0a\x40\xc9\x5c\xf0\xfc\x2e\x0d\x1e\x1e\x78\x09\xd1\x0f\x98\xb3\x96\xf2\x9a\xed\x76\x95\x1e\xbe\x23\xbc\xc7\xbc\x23\x9c\x2f\x1e\x1e\x50\x18\xdc\xed\x4c\x97\x35\x9c\xdc\x5a\x16\xbb\x5d\xb0\x7a\xcb\xd7\x08\x0d\x7a\x05\x9e\x27\xb1\x87\xdf\x8b\x1e\x5b\xd9\x47\x2b\x3b\xa7\x3d\x62\x78\xc2\x07\x55\x38\x0a\x11\x40\xc1\x88\x85\x86\x13\xde\xe1\xd6\xca\x3b\xbd\xdb\x9f\xe6\x4c\x88\x8c\x59\x75\xbc\x84\xe3\xa5\x3f\xd0\x9a\x6c\xcd\x8d\x6b\x02\x56\x83\x04\x4e\xfa\xbf\x12\x54\x47\x2f\x8e\x54\xbb\x84\xeb\x17\x93\xe7\x76\x2a\xde\x5e\x1d\xc5\xdb\xf5\x49\xe2\x96\x49\x14\xe0\xfe\x86\xa6\x61\x62\xf8\x1e\x1c\xb7\x37\xe6\xf1\xa5\xd0\x26\x97\x51\xb4\x31\x49\x5d\xde\x80\x5a\xa3\x2e\x85\xda\x2c\x81\x75\xa4\x6e\xa0\x61\xf7\x63\xa2\xbe\xbe\xbc\x9c\xca\x6d\x9b\x17\x96\x09\x74\xb1\xad\xf1\xf7\x0e\x0d\x99\x31\xa6\xfd\x91\xfb\x6b\x43\xbb\x40\x69\xb0\x38\xb2\x86\xe5\x68\x4d\xeb\xa8\x26\xae\x1f\x8d\x79\x52\xf6\x52\xa9\x31\xf7\x4d\xc5\xe8\xa1\x27\x69\x3a\x58\x25\xa4\xf7\x74\xb3\x84\x8a\xbf\x94\xbb\xb4\xed\x4d\x9e\x4a\x5d\xfe\x71\x59\xdd\x5b\x44\xed\x0b\xa3\x0d\x59\x70\xcb\x24\xa6\xe2\x23\x38\xdb\x20\xcc\x98\xc1\x0f\x61\xef\x4a\xd4\x9e\xbd\x5b\x7e\x2c\xff\x1a\x99\xa6\x0c\xd9\xd3\xd9\x75\x22\x40\xd9\xc9\x62\xa2\xbf\x7b\xd1\x1f\x2b\x40\x27\xf9\x1a\xb5\xe1\xb4\xfd\x50\x09\xb0\xd8\x8b\xe0\xd7\x87\x22\x24\x31\xe9\xf7\xc7\xda\x74\xf1\x37\x3d\xee\x3f\xab\xa5\xd7\xab\xaf\xd5\x06\x0a\x85\x06\xa8\xe6\x06\x6c\x25\xfc\x22\x89\xeb\xeb\x91\xa4\x5d\xbd\xb3\x07\xce\xa8\x50\xfa\x62\xc8\x0d\xe8\x4e\xba\x22\xa0\x24\x50\x8d\x87\x75\x54\xfa\xaf\x08\xde\x29\xdb\x8b\xac\x51\x12\x34\x4c\xf0\x9c\xab\xce\x00\xcb\x49\x69\x03\xa5\x56\x0d\xe0\x7d\xcd\x3a\x43\x16\xc8\xa6\x0f\xb6\x66\x5c\xb8\xb7\xe4\x5c\x0a\x4a\x03\xcb\xf3\xae\xe9\x6c\x2f\x25\x2b\x40\xa9\xba\xaa\xee\x65\x21\x05\x8d\xea\x24\x81\x50\xb2\x1a\xe5\x31\x2d\x6b\x80\x11\xb1\xfc\xce\x5c\xc0\x90\x15\x80\x69\x04\xe2\x58\xd8\x5b\x7d\x49\x63\x79\x6e\xaf\x9b\x08\x5e\xcb\xad\x92\x08\x35\x5b\x3b\x41\x8e\x08\xa0\x61\xdb\x01\xa8\x97\x6b\xc3\xa9\xe6\x5e\xf1\x16\x75\x63\x9b\xe3\x02\x04\x6f\x38\x81\x2a\x21\x31\xa4\x95\xac\xec\x4c\xf5\xda\x49\xb8\xdb\x79\x91\xe7\x66\x01\xb1\x35\xd5\xf7\xa8\xb9\x2a\x76\x3b\xdb\x77\x39\xd2\x28\x89\xdb\xa9\xc5\xd5\x21\xc3\x0b\x30\xbc\x69\xc5\x16\x72\x8d\x8c\x10\x18\x24\xec\x68\x1a\xb2\xb5\x3d\xf2\x4d\x89\xeb\xa7\x03\x20\xa6\x2b\x3b\x6b\xfe\x9b\x65\xaa\xa3\x65\x26\x98\xbc\xb3\x65\x6f\xac\xe7\x49\xcc\x56\x4e\x95\xd3\x95\x1c\x5a\x66\xac\x5e\x5c\x92\x72\xaa\xf6\xc3\xa5\x81\xb9\x5d\x95\x5c\xa0\x9b\x3f\x5d\xf4\xc8\x33\x6b\x27\x3b\x24\x2c\x2e\x20\x57\xed\xd6\xdf\x76\xf7\xac\x68\xc6\x35\x0f\x23\x14\xcb\xd4\x1a\xc1\x77\x26\x99\xba\x07\x26\x0b\x28\xb9\x46\x60\x1b\xb6\x7d\x0e\x3f\xab\x0e\x72\x26\x81\x34\xcb\xef\x3c\xef\x4e\x6b\x1b\x46\x2d\x4a\x5b\x2a\xf6\x8e\xcd\x50\xa8\x8d\x23\xf1\x68\x25\x47\xe1\xbc\x6c\x10\xa1\x56\x1b\x68\xba\xdc\x29\x68\xdd\x8b\xf6\x60\xc3\x38\x41\x27\x89\x0b\xaf\x37\x75\x5a\x42\xae\x1a\x34\x13\x2f\x9c\x7c\x7e\xe3\x57\xff\xb1\x1f\x70\xdc\x71\x1c\xc3\x5b\xa1\x32\x26\x60\x6d\x33\x46\x26\xec\xa3\x52\x60\x3b\xa9\x03\x1d\x0c\x31\xea\x8c\x8d\x14\x67\x47\xf7\xa4\xec\xfd\x35\xd3\x36\x72\xb1\x69\x09\xd2\xbe\x3d\xb7\x7b\x06\xf5\xda\x0e\x1d\x3d\x8f\xaf\xb0\xe4\xd2\x5b\xb6\xec\x64\x6e\xa7\x07\xa0\x9a\x11\xf8\x06\xc2\x00\x73\x16\x87\x4e\x0b\xe8\xcd\xed\x11\x46\x3c\x47\x07\xe9\x78\x7d\xfe\xa8\xb1\xe9\x3f\xfa\x76\x63\xd1\x4f\x13\x1e\x26\x32\x28\x8b\xf9\xff\xff\xf8\xdd\xb7\x91\x21\xcd\x65\xc5\xcb\xed\xfc\xa1\xd3\x62\x09\xff\x3b\x0f\xfe\xc7\x35\x99\x8b\x5f\x2e\x7f\x8b\xd6\x4c\x74\xf8\x08\xfa\x02\xfa\xcf\x25\x1c\x72\xd9\x2d\x16\x37\xa7\x3b\xac\x49\x5f\xa7\xd1\x20\xcd\x2d\xe1\xd8\x08\xed\x6e\x0e\x0d\xc3\xa0\x41\xaa\x95\x0b\x02\x8d\xb9\x92\x12\x73\x82\xae\x55\xb2\xb7\x03\x08\x65\xcc\x60\x8c\x3d\xc5\xc4\x1e\x83\xc2\xbc\x84\xf9\xe0\x91\x4f\xe0\x05\xa4\x29\x5c\x0e\x67\xbd\x35\x20\x05\x89\x1b\xf8\x27\x66\x3f\xaa\xfc\x0e\x69\x1e\x6c\x8c\x7d\x8f\x01\x9c\x83\x50\x39\xb3\x78\x51\xad\x0c\xc1\x39\x04\x31\x6b\x79\xb0\xf0\x73\xd8\x0e\x6c\x63\xfa\xe7\x60\x1f\x84\xe5\x27\x55\x2f\xe9\xf9\xb9\x0f\x95\xc1\x5d\x4a\x36\x68\x0c\xab\x70\xaa\xa1\x4b\xca\xa3\x2a\xd6\x10\x8d\xa9\x20\x05\xe7\xd6\x96\x69\x83\x9e\x24\xb2\x8d\x40\xcf\xc5\x99\xc3\x91\xa5\x29\xc8\x4e\x88\xf1\xfe\x4c\xa3\x7d\x45\x3d\xd9\xee\xd9\x01\x79\xe4\x73\xe6\xf3\x34\x05\x5b\x15\xad\x8f\x8a\xfd\x4d\x1b\x32\xbe\x7e\x2f\x22\x5b\x98\xf7\x37\x16\x23\xdc\x23\x34\x2c\xfe\x0c\x0e\x8b\x63\x3c\x2c\x9e\x00\x74\xed\xd2\xfb\xf0\x7c\x7b\x35\x81\x73\x1b\x4f\xa0\xc9\xae\xc9\x50\xbf\x0f\xce\xb7\x4b\x3d\x9c\x33\xf5\x37\x92\x26\x77\x2f\xe0\xea\xd5\xe2\x09\x74\xd4\x5a\x3d\x09\x2e\x15\x6d\xe7\x0f\x82\x6d\x6d\xba\x87\x33\x52\xed\x97\xae\xbb\x39\xbb\x00\xcb\x6b\x09\x23\xc2\x85\x1b\xa9\x96\x70\xe6\x56\x67\xbb\x27\xb8\x99\x2e\xcf\x6d\x21\xf8\x18\x7e\x3d\xc6\xc8\xb1\x5f\x3f\xc9\x73\x4c\xec\x07\x4c\xe1\xd3\x4f\xe1\xd1\xe9\x61\x08\xda\x18\xee\x2b\x14\xa4\x10\x04\x3d\xfc\xac\x54\x1a\xe6\xf6\x90\xa7\x97\x37\xc0\x93\x29\x4c\x24\x50\x56\x54\xdf\x00\x3f\x3f\xdf\x23\xcd\x06\x98\xf3\x14\x02\xdb\xc0\x27\x54\xac\x5c\x23\xe5\xbb\xad\x5f\x03\x3b\xb0\xd9\x41\x56\x16\x4b\x9b\x66\xe7\x67\xfb\x2a\x3c\x29\xc0\xe7\x07\x22\xff\xc2\x7f\x8b\x3a\x83\xda\x95\xcc\x73\x08\xa2\x56\x56\x5f\xb8\x31\xef\xd5\xcb\xb3\xc5\x0d\xec\x31\xdd\xf0\xb7\x84\xdc\x8e\x42\x37\xe0\xc7\x09\xd7\xd4\xc1\x38\x08\xb9\x55\xa6\x74\x81\x3a\xd4\xac\xe0\x9d\x59\xc2\xcb\xf6\xfe\xe6\xd7\x61\x50\x74\xad\xa7\x93\xbb\xd5\xb8\x3a\x25\xcb\xd0\xdd\x9c\x43\x90\xc4\x96\x68\xb8\x32\x6a\x39\xfd\xbd\x09\x4e\x34\xcd\x30\xfe\x1a\xd4\xef\x37\xbc\x28\x04\x5a\x21\x1c\x43\xff\xb3\x5d\xd1\x69\x97\xb8\xe6\x7e\x3d\x3f\x96\x83\x78\x83\x8b\xa8\x93\xfc\x7e\xbe\x08\x7b\x9a\x61\x7d\x01\x67\xc6\xe6\xe7\xc2\x9c\x2d\xa2\xba\x6b\x98\xe4\x7f\xe0\xdc\x76\xe0\x0b\x2f\xb7\x95\xd8\xb6\xd5\xa3\xb7\x77\x93\x87\x36\x8e\x84\x8b\xa8\xa6\x46\xcc\x83\x84\xdc\x6f\x5a\x56\xb8\xd1\xc5\x0e\xc5\x6f\x1f\x46\xe4\xee\x30\x87\xe6\x42\x19\x3c\xaa\x11\x60\x90\xde\xf1\x06\x55\x47\xf3\xb1\x8e\x5c\xd8\x31\xf5\x72\x71\x03\xbe\x2e\xcd\xe2\x78\xc4\xf0\xaf\xf7\xaf\x63\xec\xfa\x02\xf7\xc6\xd8\xe1\x81\x9b\x1a\x18\x6c\x30\x33\xae\x46\x40\x7f\xc7\xb5\x01\xbe\xdc\xbf\xfe\xfe\x9b\x49\xc9\x1f\x51\xe7\x4e\xc1\xf1\xe7\xd3\x53\xb5\xf6\xe4\xef\xb5\x9b\xcd\x26\xaa\x94\xaa\x84\xff\xa5\x76\x2c\xc6\xb6\x02\x45\xb7\x76\x42\x35\x5b\x99\x43\x81\x25\xea\xd5\x04\xbe\xaf\xd0\x49\xec\x7f\x49\x4c\x62\xff\xbf\x24\xff\x09\x00\x00\xff\xff\x93\x31\x5b\xa3\x36\x19\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\xef\x72\xdb\x36\x12\xff\xac\x3c\xc5\x86\x77\xad\xa5\xb1\x49\xda\x71\x26\xed\xc8\xa4\x3a\x99\x34\x97\xf6\xe6\xa6\xed\xb4\xe9\xdc\x75\xda\xce\x0d\x48\x2e\x49\xc4\x20\xc0\x02\x4b\xc9\xaa\x47\xef\x7e\x03\x80\xa4\x28\x59\x4e\xd3\x4b\xbf\xc8\x04\xb0\xf8\xed\x62\x77\xb1\x7f\xe0\xe4\xe9\x97\xdf\xbe\x7a\xfb\xd3\x77\xaf\xa1\xa6\x46\xac\x9e\x24\xf6\x0f\x08\x26\xab\x34\x40\x19\xac\x9e\xcc\x92\x1a\x59\xb1\x7a\x32\x9b\x25\x0d\x12\x83\xbc\x66\xda\x20\xa5\x41\x47\x65\xf8\x79\xb0\x5f\xa8\x89\xda\x10\x7f\xeb\xf8\x3a\x0d\xfe\x13\xfe\xf8\x32\x7c\xa5\x9a\x96\x11\xcf\x04\x06\x90\x2b\x49\x28\x29\x0d\xbe\x7e\x9d\x62\x51\xe1\x64\x9f\x64\x0d\xa6\xc1\x9a\xe3\xa6\x55\x9a\x26\xa4\x1b\x5e\x50\x9d\x16\xb8\xe6\x39\x86\x6e\x70\x01\x5c\x72\xe2\x4c\x84\x26\x67\x02\xd3\xab\x60\xf5\xc4\xe2\x10\x27\x81\xab\xfb\xfb\xe8\x1b\xa4\x8d\xd2\xb7\xbb\xdd\x12\xde\x70\xfa\xaa\xcb\xe0\x1f\xac\xcb\x91\x92\xd8\x93\x38\x6a\xc1\xe5\x2d\xd4\x1a\xcb\x34\xb0\x32\x9b\x65\x1c\xe7\x85\x7c\x67\xa2\x5c\xa8\xae\x28\x05\xd3\x18\xe5\xaa\x89\xd9\x3b\x76\x17\x0b\x9e\x99\x98\x36\x9c\x08\x75\x98\x29\x45\x86\x34\x6b\xe3\xeb\xe8\x3a\xfa\x2c\xce\x8d\x89\xc7\xb9\xa8\xe1\x32\xca\x8d\x09\x40\xa3\x48\x03\x43\x5b\x81\xa6\x46\xa4\x00\xe2\xd5\xff\xc7\xb7\x54\x92\x42\xb6\x41\xa3\x1a\x8c\x9f\x47\x9f\x45\x97\x8e\xe5\x74\xfa\xfd\x5c\x2d\x5b\x93\x6b\xde\x12\x18\x9d\x7f\x30\xdf\x77\xbf\x75\xa8\xb7\xf1\x75\x74\x15\x5d\xf5\x03\xc7\xe7\x9d\x09\x56\x49\xec\x01\x57\x1f\x85\x1d\x4a\x45\xdb\xf8\x59\xf4\x3c\xba\x8a\x5b\x96\xdf\xb2\x0a\x8b\x81\x93\x5d\x8a\x86\xc9\xbf\x8c\xef\x63\x36\x7c\x77\x6c\xc2\xbf\x82\x59\xa3\x1a\x94\x14\xbd\x33\xf1\xb3\xe8\xea\xf3\xe8\x72\x98\x78\x88\xef\x18\x58\xa3\x59\x56\xb3\x68\x8d\x9a\x78\xce\x44\x98\xa3\x24\xd4\x70\x6f\x67\x67\x0d\x97\x61\x8d\xbc\xaa\x69\x09\x57\x97\x97\x9f\xdc\x9c\x9a\x5d\xd7\x7e\xba\xe0\xa6\x15\x6c\xbb\x84\x52\xe0\x9d\x9f\x62\x82\x57\x32\xe4\x84\x8d\x59\x82\x47\x76\x0b\x3b\xc7\xb3\xd5\xaa\xd2\x68\x4c\xcf\xac\x55\x86\x13\x57\x72\x69\x3d\x8a\x11\x5f\xe3\x29\x5a\xd3\x32\xf9\x60\x03\xcb\x8c\x12\x1d\xe1\x91\x20\x99\x50\xf9\xad\x9f\x73\xd7\x78\x7a\x88\x5c\x09\xa5\x97\xb0\xa9\x79\xbf\x0d\x1c\x23\x68\x35\xf6\xf0\xd0\xb2\xa2\xe0\xb2\x5a\xc2\x8b\xb6\x3f\x0f\x34\x4c\x57\x5c\x2e\xe1\x72\xbf\x25\x89\x07\x35\x26\xb1\x8f\x58\x4f\x66\x49\xa6\x8a\xad\xb3\x61\xc1\xd7\x90\x0b\x66\x4c\x1a\x1c\xa9\xd8\x45\xa2\x03\x02\x1b\x80\x18\x97\xc3\xd2\xc1\x9a\x56\x9b\x00\x1c\xa3\x34\xf0\x42\x84\x99\x22\x52\xcd\x12\xae\xac\x78\xfd\x96\x23\x3c\x11\x8a\x2a\xbc\x7a\x36\x2c\xce\x92\xfa\x6a\x00\x21\xbc\xa3\xd0\xd9\x67\xb4\x4c\xb0\x4a\xf8\xb0\xb7\x64\x50\xb2\x30\x63\x54\x07\xc0\x34\x67\x61\xcd\x8b\x02\x65\x1a\x90\xee\xd0\xfa\x11\x5f\xc1\x34\xee\x0d\x61\xef\x65\x47\x35\x4a\x7b\x4e\xc2\xa2\x0f\x82\x70\x0c\x5b\x71\xaa\xbb\x2c\x64\x82\x1e\x05\x4f\xe2\xfa\x6a\x38\x52\x5c\xf0\x75\xaf\x91\xc9\xe7\x91\x72\x1e\x3f\xff\xe7\xd0\x7f\xa8\xb2\x34\x48\xe1\x44\x1d\x13\x62\x2e\xdb\x8e\xc2\x4a\xab\xae\x1d\xd7\x67\x89\x9b\x05\x5e\xa4\x41\xc5\x0d\x05\x40\xdb\xb6\xd7\x5d\x30\x1e\x49\xe9\x26\xb4\xa6\xd3\x4a\x04\xd0\x0a\x96\x63\xad\x44\x81\x3a\x0d\x7a\x9d\xbc\xe1\x86\xe0\xc7\xef\xff\x05\xbd\x81\xb9\xac\x60\xab\x3a\x0d\xaf\xa9\x46\x8d\x5d\x03\xac\x28\xac\x73\x47\x51\x34\xe1\xed\x3c\xfd\xa1\x74\x61\x46\x72\x4f\x35\x4b\xb2\x8e\x48\x8d\x84\x19\x49\xc8\x48\x86\x05\x96\xac\x13\xa3\xc4\x9e\x28\x00\x25\x73\xc1\xf3\xdb\x34\xb8\xbf\xe7\x25\x44\xdf\x63\xce\x5a\xca\x6b\xb6\xdb\x55\x7a\xf8\x8e\xf0\x0e\xf3\x8e\x70\xbe\xb8\xbf\x47\x61\x70\xb7\x33\x5d\xd6\x70\x72\x63\x59\xec\x76\xc1\xea\x0d\x5f\x23\x34\xe8\x0f\xf0\x34\x89\x3d\xfc\x5e\xf4\xd8\xca\x3e\x6a\xd9\x19\xed\x01\xc3\x13\x36\xa8\xc2\x51\x88\x00\x0a\x46\x2c\x34\x9c\xf0\x16\xb7\x56\xde\xe9\xde\x7e\x35\x67\x42\x64\xcc\x1e\xc7\x4b\x38\x6e\xfa\x1d\xad\xca\xd6\xdc\xb8\x22\x60\x35\x48\xe0\xa4\xff\x33\x4e\x75\x74\xe3\x48\xb5\x4b\xb8\x7e\x36\xb9\x6e\xa7\xfc\xed\xc5\x91\xbf\x5d\x9f\x24\x6e\x99\x44\x01\xee\x37\x34\x0d\x13\xc3\xf7\x60\xb8\xbd\x32\x8f\x37\x85\x36\xb8\x8c\xa2\x8d\x41\xea\xf2\x06\xd4\x1a\x75\x29\xd4\x66\x09\xac\x23\x75\x03\x0d\xbb\x1b\x03\xf5\xf5\xe5\xe5\x54\x6e\x5b\xbc\xb0\x4c\xa0\xf3\x6d\x8d\xbf\x75\x68\xc8\x8c\x3e\xed\x97\xdc\xaf\x75\xed\x02\xa5\xc1\xe2\x48\x1b\x96\xa3\x55\xad\xa3\x9a\x98\x7e\x54\xe6\x49\xd9\x4b\xa5\xc6\xd8\x37\x15\xa3\x87\x9e\x84\xe9\x60\x95\x90\xde\xd3\xcd\x12\x2a\xfe\x54\xec\xd2\xb6\x36\x79\x2c\x74\xf9\xcb\x65\xcf\xde\x22\x6a\x9f\x18\xad\xcb\x82\x1b\x26\x31\x15\x1f\xc1\xd9\x3a\x61\xc6\x0c\x7e\x08\x7b\x97\xa2\xf6\xec\xdd\xf0\x63\xf9\xd7\xc8\x34\x65\xc8\x1e\x8f\xae\x13\x01\xca\x4e\x16\x93\xf3\xbb\x1b\xfd\xb1\x02\x74\x92\xaf\x51\x1b\x4e\xdb\x0f\x95\x00\x8b\xbd\x08\x7e\x7c\x28\x42\x12\x93\x7e\xbf\xaf\x4d\x07\x7f\xd1\xe5\xfe\xa3\x5c\x7a\xbd\xfa\x4a\x6d\xa0\x50\x68\x80\x6a\x6e\xc0\x66\xc2\x2f\x92\xb8\xbe\x1e\x49\xda\xd5\x5b\xbb\xe0\x94\x0a\xa5\x4f\x86\xdc\x80\xee\xa4\x4b\x02\x4a\x02\xd5\x78\x98\x47\xa5\xff\x8a\xe0\xad\xb2\xb5\xc8\x1a\x25\x41\xc3\x04\xcf\xb9\xea\x0c\xb0\x9c\x94\x36\x50\x6a\xd5\x00\xde\xd5\xac\x33\x64\x81\x6c\xf8\x60\x6b\xc6\x85\xbb\x4b\xce\xa4\xa0\x34\xb0\x3c\xef\x9a\xce\xd6\x52\xb2\x02\x94\xaa\xab\xea\x5e\x16\x52\xd0\xa8\x4e\x12\x08\x25\xab\x51\x1e\xd3\xb2\x06\x18\x11\xcb\x6f\xcd\x05\x0c\x51\x01\x98\x46\x20\x8e\x85\xdd\xd5\xa7\x34\x96\xe7\x76\xbb\x89\xe0\xa5\xdc\x2a\x89\x50\xb3\xb5\x13\xe4\x88\x00\x1a\xb6\x1d\x80\x7a\xb9\x36\x9c\x6a\xee\x0f\xde\xa2\x6e\x6c\x71\x5c\x80\xe0\x0d\x27\x50\x25\x24\x86\xb4\x92\x95\xed\xa9\x5e\x3a\x09\x77\x3b\x2f\xf2\xdc\x2c\x20\xb6\xaa\xfa\x0e\x35\x57\xc5\x6e\x67\xeb\x2e\x47\x1a\x3d\x48\x2d\xf0\xb6\xc6\x13\xea\x1e\x33\x02\x68\x7c\xe5\x69\xa1\xd5\x8a\x30\xb7\x55\x24\xb0\x8a\x71\x69\x08\x32\x45\x26\xea\x93\x45\x12\xb7\x53\x63\xaa\xc3\xb3\x5c\x80\xe1\x4d\x2b\xb6\x90\x6b\x64\x84\xc0\x20\x61\x47\x8d\x96\x2d\x1b\x22\x5f\xef\xb8\x52\x3d\x00\x62\xba\xb2\x6d\xec\x7f\x59\xa6\x3a\x5a\x66\x82\xc9\x5b\x9b\x51\xc7\x52\x21\x89\xd9\xca\x69\xe9\x74\x91\x00\x2d\x33\x56\x65\x5c\x92\x72\x5a\xec\xfb\x56\x03\x73\x3b\x2a\xb9\x40\xd7\xda\x3a\xc7\x94\x67\xd6\x04\xb6\xff\x58\x5c\x40\xae\xda\xad\xdf\xed\xf6\x59\xd1\x8c\xab\x4b\x46\x28\x96\xa9\x35\x82\x2f\x7a\x32\x75\x07\x4c\x16\x50\x72\x8d\xc0\x36\x6c\xfb\x14\x7e\x52\x1d\xe4\x4c\x02\x69\x96\xdf\x7a\xde\x9d\xd6\xd6\x43\x5b\x94\x36\x0b\xed\x7d\x26\x43\xa1\x36\x8e\xc4\xa3\x95\x1c\x85\x73\x20\x83\x08\xb5\xda\x40\xd3\xe5\xee\x80\xd6\x73\xd0\x2e\x6c\x18\x27\xe8\x24\x71\xe1\xcf\x4d\x9d\x96\x90\xab\x06\x4d\xb4\xb7\xc2\xc9\x9b\x3d\x7e\xf5\x1f\xfb\xde\xc9\x2d\xc7\x31\xbc\x11\x2a\x63\x02\xd6\x36\x18\x65\xc2\xde\x57\x05\xb6\x48\x3b\x38\x83\x21\x46\x9d\xb1\x4e\x48\xa3\xfb\xd8\xfd\x6b\xa6\xed\xa5\xc0\xa6\x25\x48\xfb\xca\xdf\xce\x19\xd4\x6b\xdb\xcf\xf4\x3c\xbe\xc4\x92\x4b\xaf\xd9\xb2\x93\xde\xa5\xa8\x66\x04\xbe\x36\x31\xc0\x9c\xc6\xa1\xd3\x02\x7a\x75\x7b\x84\x11\xcf\xd1\x41\x3a\x6e\x9f\x3f\x70\xec\xfe\xa3\x77\xce\x45\xdf\xa8\x78\x98\xc8\xa0\x2c\xe6\xff\xfc\xe1\xdb\x6f\x22\x43\x9a\xcb\x8a\x97\xdb\xf9\x7d\xa7\xc5\x12\xfe\x3e\x0f\xfe\xe6\xea\xd7\xc5\xcf\x97\xbf\x46\x6b\x26\x3a\x7c\x00\x7d\x01\xfd\xe7\x12\x0e\xb9\xec\x16\x8b\x9b\xd3\xc5\xdb\xa4\x64\xd4\x68\x90\xe6\x96\x70\xac\xb1\x76\x37\x87\x8a\x61\xd0\x20\xd5\xca\x39\x81\xc6\x5c\x49\x89\x39\x41\xd7\x2a\xd9\xeb\x01\x84\x32\x66\x50\xc6\x9e\x62\xa2\x8f\xe1\xc0\xbc\x84\xf9\x60\x91\x4f\xe0\x19\xa4\x29\x5c\x0e\x6b\xbd\x36\x20\x05\x89\x1b\xf8\x37\x66\x3f\xa8\xfc\x16\x69\x1e\x6c\x8c\xbd\x8f\x01\x9c\x83\x50\x39\xb3\x78\x51\xad\x0c\xc1\x39\x04\x31\x6b\x79\xb0\xf0\x2d\xde\x0e\x6c\xcd\xfb\xc7\x60\x1f\x84\xe5\x9b\x60\x2f\xe9\xf9\xb9\x77\x95\xc1\x5c\x4a\x36\x68\x0c\xab\x70\x7a\x42\x17\xef\xc7\xa3\x58\x45\x34\xa6\x82\x14\x9c\x59\x5b\xa6\x0d\x7a\x92\xc8\xd6\x18\x3d\x17\xa7\x0e\x47\x96\xa6\x20\x3b\x21\xc6\xfd\x33\x8d\xf6\x16\xf5\x64\xbb\x27\x07\xe4\x91\x0f\xc7\x4f\xd3\x14\x6c\xc2\xb5\x36\x2a\xf6\x3b\xad\xcb\xf8\xd2\x60\x11\xd9\x9c\xbf\xdf\xb1\x18\xe1\x1e\xa0\x61\xf1\x47\x70\x58\x1c\xe3\x61\xf1\x08\xa0\xab\xc4\xde\x87\xe7\x2b\xb7\x09\x9c\x9b\x78\x04\x4d\x76\x4d\x86\xfa\x7d\x70\xbe\x12\xeb\xe1\x9c\xaa\xbf\x96\x34\xd9\x7b\x01\x57\x2f\x16\x8f\xa0\xa3\xd6\xea\x51\x70\xa9\x68\x3b\xbf\x17\x6c\x6b\xc3\x3d\x9c\x91\x6a\x5f\xb9\xc2\xe9\xec\x02\x2c\xaf\x25\x8c\x08\x17\xae\x5b\x5b\xc2\x99\x1b\x9d\xed\x1e\xe1\x66\xba\x3c\xb7\x89\xe0\x63\xf8\xf5\x18\x23\xc7\x7e\xfc\x28\xcf\x31\xb0\x1f\x30\x85\x4f\x3f\x85\x07\xab\x87\x2e\x68\x7d\xb8\xcf\x50\x90\x42\x10\xf4\xf0\xb3\x52\x69\x98\xdb\x45\x9e\x5e\xde\x00\x4f\xa6\x30\x91\x40\x59\x51\x7d\x03\xfc\xfc\x7c\x8f\x34\x1b\x60\xce\x53\x08\x6c\x6f\x90\x50\xb1\x72\x35\x9a\x2f\xe4\x7e\x09\x6c\x2f\x68\x7b\x64\x59\x2c\x6d\x98\x9d\x9f\xed\xb3\xf0\x24\x01\x9f\x1f\x88\xfc\x33\xff\x35\xea\x0c\x6a\x97\x32\xcf\x21\x88\x5a\x59\x7d\xe1\x3a\xc8\x17\xcf\xcf\x16\x37\xb0\xc7\x74\x7d\xe5\x12\x72\xdb\x65\xdd\x80\xef\x54\x5c\xbd\x08\x63\x8f\xe5\x46\x99\xd2\x05\xea\x50\xb3\x82\x77\x66\x09\xcf\xdb\xbb\x9b\x5f\x86\x1e\xd4\x55\xb5\x4e\xee\x56\xe3\xea\x94\x2c\x43\xe1\x74\x0e\x41\x12\x5b\xa2\x61\xcb\x78\xca\xe9\x53\x16\x9c\xa8\xc7\x61\x7c\x68\xea\xe7\x1b\x5e\x14\x02\xad\x10\x8e\xa1\x7f\x11\x2c\x3a\xed\x02\xd7\xdc\x8f\xe7\xc7\x72\x10\x6f\x70\x11\x75\x92\xdf\xcd\x17\x61\x4f\x33\x8c\x2f\xe0\xcc\xd8\xf8\x5c\x98\xb3\x45\x54\x77\x0d\x93\xfc\x77\x9c\xdb\xe2\x7e\xe1\xe5\xb6\x12\xdb\x8a\x7d\xb4\xf6\x6e\x72\xd1\xc6\x6e\x73\x11\xd5\xd4\x88\x79\x90\x90\x7b\x2e\xb3\xc2\x8d\x26\x76\x28\x7e\xfa\xd0\x23\x77\x87\x31\x34\x17\xca\xe0\x51\x8e\x00\x83\xf4\x96\x37\xa8\x3a\x9a\x8f\x79\xe4\xc2\x76\xc0\x97\x8b\x1b\xd8\xed\x5f\x15\xe3\x18\x5e\x1b\xdb\x53\x70\x53\x03\x83\x0d\x66\xc6\xc5\x77\xe8\xf7\xb8\x14\xee\x53\xf5\xcb\xef\xbe\x9e\xa4\xeb\x11\x75\xee\x84\x1b\x5f\x55\x4f\xe5\xc9\x93\xcf\xb8\x9b\xcd\x26\xaa\x94\xaa\x84\x7f\xc0\x1d\x13\xa9\xcd\x1e\xd1\x3b\xdb\xb8\x9a\xad\xcc\xa1\xc0\x12\xf5\x6a\x02\xdf\x67\xd7\x24\xf6\x0f\x8c\x49\xec\xff\x79\xf2\xbf\x00\x00\x00\xff\xff\x82\x9c\x59\xe7\x4d\x19\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go index 44016c53e..fc957721d 100644 --- a/cmd/puppeth/module_faucet.go +++ b/cmd/puppeth/module_faucet.go @@ -54,6 +54,7 @@ CMD [ \ "/faucet", "--genesis", "/genesis.json", "--network", "{{.NetworkID}}", "--bootnodes", "{{.Bootnodes}}", "--ethstats", "{{.Ethstats}}", \ "--ethport", "{{.EthPort}}", "--faucet.name", "{{.FaucetName}}", "--faucet.amount", "{{.FaucetAmount}}", "--faucet.minutes", "{{.FaucetMinutes}}", \ "--github.user", "{{.GitHubUser}}", "--github.token", "{{.GitHubToken}}", "--account.json", "/account.json", "--account.pass", "/account.pass" \ + {{if .CaptchaToken}}, "--captcha.token", "{{.CaptchaToken}}", "--captcha.secret", "{{.CaptchaSecret}}"{{end}} \ ]` // faucetComposefile is the docker-compose.yml file required to deploy and maintain @@ -75,7 +76,9 @@ services: - FAUCET_AMOUNT={{.FaucetAmount}} - FAUCET_MINUTES={{.FaucetMinutes}} - GITHUB_USER={{.GitHubUser}} - - GITHUB_TOKEN={{.GitHubToken}}{{if .VHost}} + - GITHUB_TOKEN={{.GitHubToken}} + - CAPTCHA_TOKEN={{.CaptchaToken}} + - CAPTCHA_SECRET={{.CaptchaSecret}}{{if .VHost}} - VIRTUAL_HOST={{.VHost}} - VIRTUAL_PORT=8080{{end}} restart: always @@ -97,6 +100,8 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config "EthPort": config.node.portFull, "GitHubUser": config.githubUser, "GitHubToken": config.githubToken, + "CaptchaToken": config.captchaToken, + "CaptchaSecret": config.captchaSecret, "FaucetName": strings.Title(network), "FaucetAmount": config.amount, "FaucetMinutes": config.minutes, @@ -113,6 +118,8 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config "EthName": config.node.ethstats[:strings.Index(config.node.ethstats, ":")], "GitHubUser": config.githubUser, "GitHubToken": config.githubToken, + "CaptchaToken": config.captchaToken, + "CaptchaSecret": config.captchaSecret, "FaucetAmount": config.amount, "FaucetMinutes": config.minutes, }) @@ -135,18 +142,20 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config // faucetInfos is returned from an faucet status check to allow reporting various // configuration parameters. type faucetInfos struct { - node *nodeInfos - host string - port int - amount int - minutes int - githubUser string - githubToken string + node *nodeInfos + host string + port int + amount int + minutes int + githubUser string + githubToken string + captchaToken string + captchaSecret string } // String implements the stringer interface. func (info *faucetInfos) String() string { - return fmt.Sprintf("host=%s, api=%d, eth=%d, amount=%d, minutes=%d, github=%s, ethstats=%s", info.host, info.port, info.node.portFull, info.amount, info.minutes, info.githubUser, info.node.ethstats) + return fmt.Sprintf("host=%s, api=%d, eth=%d, amount=%d, minutes=%d, github=%s, captcha=%v, ethstats=%s", info.host, info.port, info.node.portFull, info.amount, info.minutes, info.githubUser, info.captchaToken != "", info.node.ethstats) } // checkFaucet does a health-check against an faucet server to verify whether @@ -200,11 +209,13 @@ func checkFaucet(client *sshClient, network string) (*faucetInfos, error) { keyJSON: keyJSON, keyPass: keyPass, }, - host: host, - port: port, - amount: amount, - minutes: minutes, - githubUser: infos.envvars["GITHUB_USER"], - githubToken: infos.envvars["GITHUB_TOKEN"], + host: host, + port: port, + amount: amount, + minutes: minutes, + githubUser: infos.envvars["GITHUB_USER"], + githubToken: infos.envvars["GITHUB_TOKEN"], + captchaToken: infos.envvars["CAPTCHA_TOKEN"], + captchaSecret: infos.envvars["CAPTCHA_SECRET"], }, nil } diff --git a/cmd/puppeth/wizard_faucet.go b/cmd/puppeth/wizard_faucet.go index 71d1c910b..f3fd7c2a1 100644 --- a/cmd/puppeth/wizard_faucet.go +++ b/cmd/puppeth/wizard_faucet.go @@ -71,7 +71,7 @@ func (w *wizard) deployFaucet() { // Accessing GitHub gists requires API authorization, retrieve it if infos.githubUser != "" { fmt.Println() - fmt.Printf("Reused previous (%s) GitHub API authorization (y/n)? (default = yes)\n", infos.githubUser) + fmt.Printf("Reuse previous (%s) GitHub API authorization (y/n)? (default = yes)\n", infos.githubUser) if w.readDefaultString("y") != "y" { infos.githubUser, infos.githubToken = "", "" } @@ -109,6 +109,29 @@ func (w *wizard) deployFaucet() { return } } + // Accessing the reCaptcha service requires API authorizations, request it + if infos.captchaToken != "" { + fmt.Println() + fmt.Println("Reuse previous reCaptcha API authorization (y/n)? (default = yes)") + if w.readDefaultString("y") != "y" { + infos.captchaToken, infos.captchaSecret = "", "" + } + } + if infos.captchaToken == "" { + // No previous authorization (or old one discarded) + fmt.Println() + fmt.Println("Enable reCaptcha protection against robots (y/n)? (default = no)") + if w.readDefaultString("n") == "y" { + // Captcha protection explicitly requested, read the site and secret keys + fmt.Println() + fmt.Printf("What is the reCaptcha site key to authenticate human users?\n") + infos.captchaToken = w.readString() + + fmt.Println() + fmt.Printf("What is the reCaptcha secret key to verify authentications? (won't be echoed)\n") + infos.captchaSecret = w.readPassword() + } + } // Figure out where the user wants to store the persistent data fmt.Println() if infos.node.datadir == "" {