Require BackupDisabledDataDir only if PFSEnabled is true

This commit is contained in:
Dmitry 2019-01-22 09:08:29 +02:00 committed by Dmitry Shulyak
parent 0e48a022f0
commit 1a365a5140
3 changed files with 47 additions and 100 deletions

View File

@ -46,9 +46,6 @@ func TestValidateNodeConfig(t *testing.T) {
"EnableMailServer": true, "EnableMailServer": true,
"DataDir": "/tmp", "DataDir": "/tmp",
"MailServerPassword": "status-offline-inbox" "MailServerPassword": "status-offline-inbox"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Callback: noErrorsCallback, Callback: noErrorsCallback,
@ -69,9 +66,6 @@ func TestValidateNodeConfig(t *testing.T) {
"NoDiscovery": true, "NoDiscovery": true,
"WhisperConfig": { "WhisperConfig": {
"Enabled": false "Enabled": false
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Callback: func(t *testing.T, resp APIDetailedResponse) { Callback: func(t *testing.T, resp APIDetailedResponse) {
@ -97,9 +91,7 @@ func TestValidateNodeConfig(t *testing.T) {
}`, }`,
Callback: func(t *testing.T, resp APIDetailedResponse) { Callback: func(t *testing.T, resp APIDetailedResponse) {
require.False(t, resp.Status) require.False(t, resp.Status)
require.Equal(t, 1, len(resp.FieldErrors)) require.Contains(t, resp.Message, "validation: field BackupDisabledDataDir is required if PFSEnabled is true")
require.Equal(t, "NodeConfig.ShhextConfig.BackupDisabledDataDir", resp.FieldErrors[0].Parameter)
require.Contains(t, resp.Message, "validation: validation failed")
}, },
}, },
{ {
@ -110,9 +102,6 @@ func TestValidateNodeConfig(t *testing.T) {
"NoDiscovery": true, "NoDiscovery": true,
"WhisperConfig": { "WhisperConfig": {
"Enabled": false "Enabled": false
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Callback: func(t *testing.T, resp APIDetailedResponse) { Callback: func(t *testing.T, resp APIDetailedResponse) {
@ -132,9 +121,6 @@ func TestValidateNodeConfig(t *testing.T) {
"WhisperConfig": { "WhisperConfig": {
"Enabled": true, "Enabled": true,
"EnableMailServer": true "EnableMailServer": true
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Callback: func(t *testing.T, resp APIDetailedResponse) { Callback: func(t *testing.T, resp APIDetailedResponse) {
@ -153,9 +139,6 @@ func TestValidateNodeConfig(t *testing.T) {
"WhisperConfig": { "WhisperConfig": {
"Enabled": true, "Enabled": true,
"EnableMailServer": false "EnableMailServer": false
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Callback: noErrorsCallback, Callback: noErrorsCallback,
@ -165,15 +148,14 @@ func TestValidateNodeConfig(t *testing.T) {
Config: `{}`, Config: `{}`,
Callback: func(t *testing.T, resp APIDetailedResponse) { Callback: func(t *testing.T, resp APIDetailedResponse) {
required := map[string]string{ required := map[string]string{
"NodeConfig.NetworkID": "required", "NodeConfig.NetworkID": "required",
"NodeConfig.DataDir": "required", "NodeConfig.DataDir": "required",
"NodeConfig.ShhextConfig.BackupDisabledDataDir": "required", "NodeConfig.KeyStoreDir": "required",
"NodeConfig.KeyStoreDir": "required",
} }
require.False(t, resp.Status) require.False(t, resp.Status)
require.Contains(t, resp.Message, "validation: validation failed") require.Contains(t, resp.Message, "validation: validation failed")
require.Equal(t, 4, len(resp.FieldErrors)) require.Equal(t, 3, len(resp.FieldErrors))
for _, err := range resp.FieldErrors { for _, err := range resp.FieldErrors {
require.Contains(t, required, err.Parameter, err.Error()) require.Contains(t, required, err.Parameter, err.Error())

View File

@ -2,6 +2,7 @@ package params
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net/url" "net/url"
@ -283,7 +284,7 @@ type NodeConfig struct {
WhisperConfig WhisperConfig `json:"WhisperConfig," validate:"structonly"` WhisperConfig WhisperConfig `json:"WhisperConfig," validate:"structonly"`
// ShhextConfig keeps configuration for service running under shhext namespace. // ShhextConfig keeps configuration for service running under shhext namespace.
ShhextConfig ShhextConfig `json:"ShhextConfig," validate:"required"` ShhextConfig ShhextConfig `json:"ShhextConfig," validate:"structonly"`
// SwarmConfig extra configuration for Swarm and ENS // SwarmConfig extra configuration for Swarm and ENS
SwarmConfig SwarmConfig `json:"SwarmConfig," validate:"structonly"` SwarmConfig SwarmConfig `json:"SwarmConfig," validate:"structonly"`
@ -302,12 +303,12 @@ type NodeConfig struct {
// ShhextConfig defines options used by shhext service. // ShhextConfig defines options used by shhext service.
type ShhextConfig struct { type ShhextConfig struct {
PFSEnabled bool
// BackupDisabledDataDir is the file system folder the node should use for any data storage needs that it doesn't want backed up. // BackupDisabledDataDir is the file system folder the node should use for any data storage needs that it doesn't want backed up.
BackupDisabledDataDir string `validate:"required"` BackupDisabledDataDir string
// InstallationId id of the current installation // InstallationId id of the current installation
InstallationID string InstallationID string
DebugAPIEnabled bool DebugAPIEnabled bool
PFSEnabled bool
// MailServerConfirmations should be true if client wants to receive confirmatons only from a selected mail servers. // MailServerConfirmations should be true if client wants to receive confirmatons only from a selected mail servers.
MailServerConfirmations bool MailServerConfirmations bool
// EnableConnectionManager turns on management of the mail server connections if true. // EnableConnectionManager turns on management of the mail server connections if true.
@ -322,7 +323,13 @@ type ShhextConfig struct {
// Validate validates the ShhextConfig struct and returns an error if inconsistent values are found // Validate validates the ShhextConfig struct and returns an error if inconsistent values are found
func (c *ShhextConfig) Validate(validate *validator.Validate) error { func (c *ShhextConfig) Validate(validate *validator.Validate) error {
return validate.Struct(c) if err := validate.Struct(c); err != nil {
return err
}
if c.PFSEnabled && len(c.BackupDisabledDataDir) == 0 {
return errors.New("field BackupDisabledDataDir is required if PFSEnabled is true")
}
return nil
} }
// Option is an additional setting when creating a NodeConfig // Option is an additional setting when creating a NodeConfig

View File

@ -60,10 +60,7 @@ func TestNewConfigFromJSON(t *testing.T) {
"NetworkId": 3, "NetworkId": 3,
"DataDir": "` + tmpDir + `", "DataDir": "` + tmpDir + `",
"KeyStoreDir": "` + tmpDir + `", "KeyStoreDir": "` + tmpDir + `",
"NoDiscovery": true, "NoDiscovery": true
"ShhextConfig": {
"BackupDisabledDataDir": "` + tmpDir + `"
}
}` }`
c, err := params.NewConfigFromJSON(json) c, err := params.NewConfigFromJSON(json)
require.NoError(t, err) require.NoError(t, err)
@ -107,10 +104,7 @@ func TestNodeConfigValidate(t *testing.T) {
"DataDir": "/tmp/data", "DataDir": "/tmp/data",
"BackupDisabledDataDir": "/tmp/data", "BackupDisabledDataDir": "/tmp/data",
"KeyStoreDir": "/tmp/data", "KeyStoreDir": "/tmp/data",
"NoDiscovery": true, "NoDiscovery": true
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
}
}`, }`,
}, },
{ {
@ -127,10 +121,9 @@ func TestNodeConfigValidate(t *testing.T) {
Name: "Validate all required fields", Name: "Validate all required fields",
Config: `{}`, Config: `{}`,
FieldErrors: map[string]string{ FieldErrors: map[string]string{
"NetworkID": "required", "NetworkID": "required",
"DataDir": "required", "DataDir": "required",
"BackupDisabledDataDir": "required", "KeyStoreDir": "required",
"KeyStoreDir": "required",
}, },
}, },
{ {
@ -138,12 +131,8 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"BackupDisabledDataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"Name": "invalid/name", "Name": "invalid/name"
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
}
}`, }`,
FieldErrors: map[string]string{ FieldErrors: map[string]string{
"Name": "excludes", "Name": "excludes",
@ -154,13 +143,9 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"BackupDisabledDataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"NoDiscovery": true, "NoDiscovery": true,
"NodeKey": "foo", "NodeKey": "foo"
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
}
}`, }`,
Error: "NodeKey is invalid", Error: "NodeKey is invalid",
}, },
@ -169,15 +154,11 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"BackupDisabledDataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"NoDiscovery": true, "NoDiscovery": true,
"UpstreamConfig": { "UpstreamConfig": {
"Enabled": true, "Enabled": true,
"URL": "[bad.url]" "URL": "[bad.url]"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Error: "'[bad.url]' is invalid", Error: "'[bad.url]' is invalid",
@ -187,15 +168,11 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"BackupDisabledDataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"NoDiscovery": true, "NoDiscovery": true,
"UpstreamConfig": { "UpstreamConfig": {
"Enabled": false, "Enabled": false,
"URL": "[bad.url]" "URL": "[bad.url]"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
}, },
@ -204,15 +181,11 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"BackupDisabledDataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"NoDiscovery": true, "NoDiscovery": true,
"UpstreamConfig": { "UpstreamConfig": {
"Enabled": true, "Enabled": true,
"URL": "` + params.MainnetEthereumNetworkURL + `" "URL": "` + params.MainnetEthereumNetworkURL + `"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
}, },
@ -221,12 +194,8 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"BackupDisabledDataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"NoDiscovery": false, "NoDiscovery": false
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
}
}`, }`,
Error: "NoDiscovery is false, but ClusterConfig.BootNodes is empty", Error: "NoDiscovery is false, but ClusterConfig.BootNodes is empty",
}, },
@ -235,13 +204,9 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"BackupDisabledDataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"NoDiscovery": true, "NoDiscovery": true,
"Rendezvous": true, "Rendezvous": true
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
}
}`, }`,
Error: "Rendezvous is enabled, but ClusterConfig.RendezvousNodes is empty", Error: "Rendezvous is enabled, but ClusterConfig.RendezvousNodes is empty",
}, },
@ -255,9 +220,6 @@ func TestNodeConfigValidate(t *testing.T) {
"Rendezvous": false, "Rendezvous": false,
"ClusterConfig": { "ClusterConfig": {
"RendezvousNodes": ["a"] "RendezvousNodes": ["a"]
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Error: "Rendezvous is disabled, but ClusterConfig.RendezvousNodes is not empty", Error: "Rendezvous is disabled, but ClusterConfig.RendezvousNodes is not empty",
@ -273,9 +235,6 @@ func TestNodeConfigValidate(t *testing.T) {
"Enabled": true, "Enabled": true,
"EnableMailServer": true, "EnableMailServer": true,
"MailserverPassword": "foo" "MailserverPassword": "foo"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Error: "WhisperConfig.DataDir must be specified when WhisperConfig.EnableMailServer is true", Error: "WhisperConfig.DataDir must be specified when WhisperConfig.EnableMailServer is true",
@ -292,9 +251,6 @@ func TestNodeConfigValidate(t *testing.T) {
"EnableMailServer": true, "EnableMailServer": true,
"DataDir": "/other/dir", "DataDir": "/other/dir",
"MailserverPassword": "foo" "MailserverPassword": "foo"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Error: "WhisperConfig.DataDir must start with DataDir fragment", Error: "WhisperConfig.DataDir must start with DataDir fragment",
@ -311,9 +267,6 @@ func TestNodeConfigValidate(t *testing.T) {
"EnableMailServer": true, "EnableMailServer": true,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"MailserverPassword": "foo" "MailserverPassword": "foo"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
CheckFunc: func(t *testing.T, config *params.NodeConfig) { CheckFunc: func(t *testing.T, config *params.NodeConfig) {
@ -331,9 +284,6 @@ func TestNodeConfigValidate(t *testing.T) {
"Enabled": true, "Enabled": true,
"EnableMailServer": true, "EnableMailServer": true,
"DataDir": "/some/dir" "DataDir": "/some/dir"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Error: "WhisperConfig.MailServerPassword or WhisperConfig.MailServerAsymKey must be specified when WhisperConfig.EnableMailServer is true", Error: "WhisperConfig.MailServerPassword or WhisperConfig.MailServerAsymKey must be specified when WhisperConfig.EnableMailServer is true",
@ -350,9 +300,6 @@ func TestNodeConfigValidate(t *testing.T) {
"EnableMailServer": true, "EnableMailServer": true,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"MailServerAsymKey": "06c365919f1fc8e13ff79a84f1dd14b7e45b869aa5fc0e34940481ee20d32f90" "MailServerAsymKey": "06c365919f1fc8e13ff79a84f1dd14b7e45b869aa5fc0e34940481ee20d32f90"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
CheckFunc: func(t *testing.T, config *params.NodeConfig) { CheckFunc: func(t *testing.T, config *params.NodeConfig) {
@ -371,9 +318,6 @@ func TestNodeConfigValidate(t *testing.T) {
"EnableMailServer": true, "EnableMailServer": true,
"DataDir": "/foo", "DataDir": "/foo",
"MailServerAsymKey": "bar" "MailServerAsymKey": "bar"
},
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
} }
}`, }`,
Error: "WhisperConfig.MailServerAsymKey is invalid", Error: "WhisperConfig.MailServerAsymKey is invalid",
@ -401,10 +345,7 @@ func TestNodeConfigValidate(t *testing.T) {
Config: `{ Config: `{
"NetworkId": 1, "NetworkId": 1,
"DataDir": "/some/dir", "DataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir"
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
}
}`, }`,
CheckFunc: func(t *testing.T, config *params.NodeConfig) { CheckFunc: func(t *testing.T, config *params.NodeConfig) {
require.Equal(t, []string{"localhost"}, config.HTTPVirtualHosts) require.Equal(t, []string{"localhost"}, config.HTTPVirtualHosts)
@ -418,16 +359,33 @@ func TestNodeConfigValidate(t *testing.T) {
"DataDir": "/some/dir", "DataDir": "/some/dir",
"KeyStoreDir": "/some/dir", "KeyStoreDir": "/some/dir",
"HTTPVirtualHosts": ["my.domain.com"], "HTTPVirtualHosts": ["my.domain.com"],
"HTTPCors": ["http://my.domain.com:8080"], "HTTPCors": ["http://my.domain.com:8080"]
"ShhextConfig": {
"BackupDisabledDataDir": "/tmp"
}
}`, }`,
CheckFunc: func(t *testing.T, config *params.NodeConfig) { CheckFunc: func(t *testing.T, config *params.NodeConfig) {
require.Equal(t, []string{"my.domain.com"}, config.HTTPVirtualHosts) require.Equal(t, []string{"my.domain.com"}, config.HTTPVirtualHosts)
require.Equal(t, []string{"http://my.domain.com:8080"}, config.HTTPCors) require.Equal(t, []string{"http://my.domain.com:8080"}, config.HTTPCors)
}, },
}, },
{
Name: "ShhextConfig is not required",
Config: `{
"NetworkId": 1,
"DataDir": "/some/dir",
"KeyStoreDir": "/some/dir"
}`,
},
{
Name: "BackupDisabledDataDir must be set if PFSEnabled is true",
Config: `{
"NetworkId": 1,
"DataDir": "/some/dir",
"KeyStoreDir": "/some/dir",
"ShhextConfig": {
"PFSEnabled": true
}
}`,
Error: "field BackupDisabledDataDir is required if PFSEnabled is true",
},
} }
for _, tc := range testCases { for _, tc := range testCases {