feat_: Add WS settings to the node config (#5346)
* feat_: add ability to enable http and ws connections from the client app * feat_: add websocket option for api config * fix_: use new api options in statusd * chore_: add test for `overrideApiConfig`
This commit is contained in:
parent
8480429cbb
commit
1ba4b86c7e
|
@ -0,0 +1,45 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/status-im/status-go/params"
|
||||||
|
"github.com/status-im/status-go/protocol/requests"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestOverrideApiConfig(t *testing.T) {
|
||||||
|
newNodeConfig := ¶ms.NodeConfig{
|
||||||
|
APIModules: "test, eth, wakuv2",
|
||||||
|
ConnectorConfig: params.ConnectorConfig{Enabled: true},
|
||||||
|
HTTPEnabled: true,
|
||||||
|
HTTPHost: "0.0.0.0",
|
||||||
|
HTTPPort: 8545,
|
||||||
|
WSEnabled: false,
|
||||||
|
WSHost: "127.0.0.1",
|
||||||
|
WSPort: 8586,
|
||||||
|
}
|
||||||
|
|
||||||
|
apiConfig := &requests.APIConfig{
|
||||||
|
APIModules: "connector",
|
||||||
|
ConnectorEnabled: false,
|
||||||
|
HTTPEnabled: false,
|
||||||
|
HTTPHost: "127.0.0.1",
|
||||||
|
HTTPPort: 8080,
|
||||||
|
WSEnabled: true,
|
||||||
|
WSHost: "192.168.0.1",
|
||||||
|
WSPort: 7777,
|
||||||
|
}
|
||||||
|
|
||||||
|
overrideApiConfig(newNodeConfig, apiConfig)
|
||||||
|
|
||||||
|
require.Equal(t, apiConfig.APIModules, newNodeConfig.APIModules)
|
||||||
|
require.Equal(t, apiConfig.ConnectorEnabled, newNodeConfig.ConnectorConfig.Enabled)
|
||||||
|
require.Equal(t, apiConfig.HTTPEnabled, newNodeConfig.HTTPEnabled)
|
||||||
|
require.Equal(t, apiConfig.HTTPHost, newNodeConfig.HTTPHost)
|
||||||
|
require.Equal(t, apiConfig.HTTPPort, newNodeConfig.HTTPPort)
|
||||||
|
require.Equal(t, apiConfig.WSEnabled, newNodeConfig.WSEnabled)
|
||||||
|
require.Equal(t, apiConfig.WSHost, newNodeConfig.WSHost)
|
||||||
|
require.Equal(t, apiConfig.WSPort, newNodeConfig.WSPort)
|
||||||
|
}
|
|
@ -215,6 +215,19 @@ func buildWalletConfig(request *requests.WalletSecretsConfig) params.WalletConfi
|
||||||
return walletConfig
|
return walletConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func overrideApiConfig(nodeConfig *params.NodeConfig, config *requests.APIConfig) {
|
||||||
|
nodeConfig.APIModules = config.APIModules
|
||||||
|
nodeConfig.ConnectorConfig.Enabled = config.ConnectorEnabled
|
||||||
|
|
||||||
|
nodeConfig.HTTPEnabled = config.HTTPEnabled
|
||||||
|
nodeConfig.HTTPHost = config.HTTPHost
|
||||||
|
nodeConfig.HTTPPort = config.HTTPPort
|
||||||
|
|
||||||
|
nodeConfig.WSEnabled = config.WSEnabled
|
||||||
|
nodeConfig.WSHost = config.WSHost
|
||||||
|
nodeConfig.WSPort = config.WSPort
|
||||||
|
}
|
||||||
|
|
||||||
func defaultNodeConfig(installationID string, request *requests.CreateAccount, opts ...params.Option) (*params.NodeConfig, error) {
|
func defaultNodeConfig(installationID string, request *requests.CreateAccount, opts ...params.Option) (*params.NodeConfig, error) {
|
||||||
// Set mainnet
|
// Set mainnet
|
||||||
nodeConfig := ¶ms.NodeConfig{}
|
nodeConfig := ¶ms.NodeConfig{}
|
||||||
|
@ -339,10 +352,7 @@ func defaultNodeConfig(installationID string, request *requests.CreateAccount, o
|
||||||
}
|
}
|
||||||
|
|
||||||
if request.APIConfig != nil {
|
if request.APIConfig != nil {
|
||||||
nodeConfig.HTTPEnabled = true
|
overrideApiConfig(nodeConfig, request.APIConfig)
|
||||||
nodeConfig.HTTPHost = request.APIConfig.HTTPHost
|
|
||||||
nodeConfig.HTTPPort = request.APIConfig.HTTPPort
|
|
||||||
nodeConfig.APIModules = request.APIConfig.APIModules
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
|
|
|
@ -601,6 +601,10 @@ func (b *GethStatusBackend) loginAccount(request *requests.Login) error {
|
||||||
|
|
||||||
b.overrideNetworks(b.config, request)
|
b.overrideNetworks(b.config, request)
|
||||||
|
|
||||||
|
if request.APIConfig != nil {
|
||||||
|
overrideApiConfig(b.config, request.APIConfig)
|
||||||
|
}
|
||||||
|
|
||||||
err = b.setupLogSettings()
|
err = b.setupLogSettings()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to setup log settings")
|
return errors.Wrap(err, "failed to setup log settings")
|
||||||
|
|
|
@ -154,6 +154,9 @@ func randomNodeConfig() *params.NodeConfig {
|
||||||
HTTPPort: randomInt(math.MaxInt64),
|
HTTPPort: randomInt(math.MaxInt64),
|
||||||
HTTPVirtualHosts: randomStringSlice(),
|
HTTPVirtualHosts: randomStringSlice(),
|
||||||
HTTPCors: randomStringSlice(),
|
HTTPCors: randomStringSlice(),
|
||||||
|
WSEnabled: false, // NOTE: leaving ws field idle since we are moving away from the storing the whole config
|
||||||
|
WSHost: "",
|
||||||
|
WSPort: 0,
|
||||||
IPCEnabled: randomBool(),
|
IPCEnabled: randomBool(),
|
||||||
IPCFile: randomString(),
|
IPCFile: randomString(),
|
||||||
LogEnabled: randomBool(),
|
LogEnabled: randomBool(),
|
||||||
|
|
|
@ -139,6 +139,7 @@ func createAccountAndLogin(b *api.GethStatusBackend, name, rootDataDir, password
|
||||||
LogFilePath: "log",
|
LogFilePath: "log",
|
||||||
APIConfig: &requests.APIConfig{
|
APIConfig: &requests.APIConfig{
|
||||||
APIModules: apiModules,
|
APIModules: apiModules,
|
||||||
|
HTTPEnabled: true,
|
||||||
HTTPHost: "127.0.0.1",
|
HTTPHost: "127.0.0.1",
|
||||||
HTTPPort: port,
|
HTTPPort: port,
|
||||||
},
|
},
|
||||||
|
|
|
@ -211,8 +211,13 @@ func main() {
|
||||||
CustomizationColor: "0x000000",
|
CustomizationColor: "0x000000",
|
||||||
BackupDisabledDataDir: config.DataDir,
|
BackupDisabledDataDir: config.DataDir,
|
||||||
APIConfig: &requests.APIConfig{
|
APIConfig: &requests.APIConfig{
|
||||||
|
ConnectorEnabled: config.ClusterConfig.Enabled,
|
||||||
|
HTTPEnabled: config.HTTPEnabled,
|
||||||
HTTPHost: config.HTTPHost,
|
HTTPHost: config.HTTPHost,
|
||||||
HTTPPort: config.HTTPPort,
|
HTTPPort: config.HTTPPort,
|
||||||
|
WSEnabled: config.WSEnabled,
|
||||||
|
WSHost: config.WSHost,
|
||||||
|
WSPort: config.WSPort,
|
||||||
APIModules: config.APIModules,
|
APIModules: config.APIModules,
|
||||||
},
|
},
|
||||||
NetworkID: &config.NetworkID,
|
NetworkID: &config.NetworkID,
|
||||||
|
|
|
@ -94,7 +94,6 @@ func newGethNodeConfig(config *params.NodeConfig) (*node.Config, error) {
|
||||||
MaxPeers: maxPeers,
|
MaxPeers: maxPeers,
|
||||||
MaxPendingPeers: maxPendingPeers,
|
MaxPendingPeers: maxPendingPeers,
|
||||||
},
|
},
|
||||||
HTTPModules: config.FormatAPIModules(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.IPCEnabled {
|
if config.IPCEnabled {
|
||||||
|
@ -107,12 +106,19 @@ func newGethNodeConfig(config *params.NodeConfig) (*node.Config, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.HTTPEnabled {
|
if config.HTTPEnabled {
|
||||||
|
nc.HTTPModules = config.FormatAPIModules()
|
||||||
nc.HTTPHost = config.HTTPHost
|
nc.HTTPHost = config.HTTPHost
|
||||||
nc.HTTPPort = config.HTTPPort
|
nc.HTTPPort = config.HTTPPort
|
||||||
nc.HTTPVirtualHosts = config.HTTPVirtualHosts
|
nc.HTTPVirtualHosts = config.HTTPVirtualHosts
|
||||||
nc.HTTPCors = config.HTTPCors
|
nc.HTTPCors = config.HTTPCors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.WSEnabled {
|
||||||
|
nc.WSModules = config.FormatAPIModules()
|
||||||
|
nc.WSHost = config.WSHost
|
||||||
|
nc.WSPort = config.WSPort
|
||||||
|
}
|
||||||
|
|
||||||
if config.ClusterConfig.Enabled {
|
if config.ClusterConfig.Enabled {
|
||||||
nc.P2P.BootstrapNodesV5 = parseNodesV5(config.ClusterConfig.BootNodes)
|
nc.P2P.BootstrapNodesV5 = parseNodesV5(config.ClusterConfig.BootNodes)
|
||||||
nc.P2P.StaticNodes = parseNodes(config.ClusterConfig.StaticNodes)
|
nc.P2P.StaticNodes = parseNodes(config.ClusterConfig.StaticNodes)
|
||||||
|
|
|
@ -375,6 +375,15 @@ type NodeConfig struct {
|
||||||
// HTTPPort is the TCP port number on which to start the Geth's HTTP RPC server.
|
// HTTPPort is the TCP port number on which to start the Geth's HTTP RPC server.
|
||||||
HTTPPort int
|
HTTPPort int
|
||||||
|
|
||||||
|
// WSEnabled specifies whether the Websocket RPC server is to be enabled by default.
|
||||||
|
WSEnabled bool
|
||||||
|
|
||||||
|
// WSHost is the host interface on which to start Geth's Websocket RPC server.
|
||||||
|
WSHost string
|
||||||
|
|
||||||
|
// WSPort is the TCP port number on which to start the Geth's Websocket RPC server.
|
||||||
|
WSPort int
|
||||||
|
|
||||||
// HTTPVirtualHosts is the list of virtual hostnames which are allowed on incoming requests.
|
// HTTPVirtualHosts is the list of virtual hostnames which are allowed on incoming requests.
|
||||||
// This is by default {'localhost'}. Using this prevents attacks like
|
// This is by default {'localhost'}. Using this prevents attacks like
|
||||||
// DNS rebinding, which bypasses SOP by simply masquerading as being within the same
|
// DNS rebinding, which bypasses SOP by simply masquerading as being within the same
|
||||||
|
|
|
@ -22,8 +22,13 @@ type ImageCropRectangle struct {
|
||||||
|
|
||||||
type APIConfig struct {
|
type APIConfig struct {
|
||||||
APIModules string `json:"apiModules"`
|
APIModules string `json:"apiModules"`
|
||||||
|
ConnectorEnabled bool `json:"connectorEnabled"`
|
||||||
|
HTTPEnabled bool `json:"httpEnabled"`
|
||||||
HTTPHost string `json:"httpHost"`
|
HTTPHost string `json:"httpHost"`
|
||||||
HTTPPort int `json:"httpPort"`
|
HTTPPort int `json:"httpPort"`
|
||||||
|
WSEnabled bool `json:"wsEnabled"`
|
||||||
|
WSHost string `json:"wsHost"`
|
||||||
|
WSPort int `json:"wsPort"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreateAccount struct {
|
type CreateAccount struct {
|
||||||
|
|
|
@ -34,6 +34,8 @@ type Login struct {
|
||||||
Mnemonic string `json:"mnemonic"`
|
Mnemonic string `json:"mnemonic"`
|
||||||
|
|
||||||
WalletSecretsConfig
|
WalletSecretsConfig
|
||||||
|
|
||||||
|
APIConfig *APIConfig `json:"apiConfig"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Login) Validate() error {
|
func (c *Login) Validate() error {
|
||||||
|
|
Loading…
Reference in New Issue