Skip to content
This repository has been archived by the owner on Sep 26, 2019. It is now read-only.

[FIX] Refactored permissioning components to be Optional. #747

Merged
merged 9 commits into from
Feb 4, 2019
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public class PantheonNode implements Node, NodeConfiguration, RunnableNode, Auto
private final JsonRpcConfiguration jsonRpcConfiguration;
private final WebSocketConfiguration webSocketConfiguration;
private final MetricsConfiguration metricsConfiguration;
private final PermissioningConfiguration permissioningConfiguration;
private final Optional<PermissioningConfiguration> permissioningConfiguration;
private final GenesisConfigProvider genesisConfigProvider;
private final boolean devMode;
private final boolean discoveryEnabled;
Expand All @@ -93,7 +93,7 @@ public PantheonNode(
final JsonRpcConfiguration jsonRpcConfiguration,
final WebSocketConfiguration webSocketConfiguration,
final MetricsConfiguration metricsConfiguration,
final PermissioningConfiguration permissioningConfiguration,
final Optional<PermissioningConfiguration> permissioningConfiguration,
final boolean devMode,
final GenesisConfigProvider genesisConfigProvider,
final int p2pPort,
Expand Down Expand Up @@ -348,7 +348,7 @@ public boolean isDiscoveryEnabled() {
return discoveryEnabled;
}

PermissioningConfiguration getPermissioningConfiguration() {
Optional<PermissioningConfiguration> getPermissioningConfiguration() {
return permissioningConfiguration;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,11 @@ public void startNode(final PantheonNode node) {
throw new RuntimeException("Error building PantheonController", e);
}

RunnerBuilder runnerBuilder = new RunnerBuilder();
node.getPermissioningConfiguration().ifPresent(runnerBuilder::permissioningConfiguration);

final Runner runner =
new RunnerBuilder()
runnerBuilder
.vertx(Vertx.vertx())
.pantheonController(pantheonController)
.discovery(node.isDiscoveryEnabled())
Expand All @@ -93,7 +96,6 @@ public void startNode(final PantheonNode node) {
.bannedNodeIds(Collections.emptySet())
.metricsSystem(noOpMetricsSystem)
.metricsConfiguration(node.metricsConfiguration())
.permissioningConfiguration(node.getPermissioningConfiguration())
.p2pEnabled(node.p2pEnabled())
.build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@
import tech.pegasys.pantheon.metrics.prometheus.MetricsConfiguration;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.GenesisConfigProvider;

import java.util.Optional;

class PantheonFactoryConfiguration {

private final String name;
private final MiningParameters miningParameters;
private final JsonRpcConfiguration jsonRpcConfiguration;
private final WebSocketConfiguration webSocketConfiguration;
private final MetricsConfiguration metricsConfiguration;
private final PermissioningConfiguration permissioningConfiguration;
private final Optional<PermissioningConfiguration> permissioningConfiguration;
private final boolean devMode;
private final GenesisConfigProvider genesisConfigProvider;
private final Boolean p2pEnabled;
Expand All @@ -38,7 +40,7 @@ class PantheonFactoryConfiguration {
final JsonRpcConfiguration jsonRpcConfiguration,
final WebSocketConfiguration webSocketConfiguration,
final MetricsConfiguration metricsConfiguration,
final PermissioningConfiguration permissioningConfiguration,
final Optional<PermissioningConfiguration> permissioningConfiguration,
final boolean devMode,
final GenesisConfigProvider genesisConfigProvider,
final Boolean p2pEnabled,
Expand Down Expand Up @@ -75,7 +77,7 @@ public MetricsConfiguration getMetricsConfiguration() {
return metricsConfiguration;
}

public PermissioningConfiguration getPermissioningConfiguration() {
public Optional<PermissioningConfiguration> getPermissioningConfiguration() {
return permissioningConfiguration;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ public class PantheonFactoryConfigurationBuilder {
private JsonRpcConfiguration jsonRpcConfiguration = JsonRpcConfiguration.createDefault();
private WebSocketConfiguration webSocketConfiguration = WebSocketConfiguration.createDefault();
private MetricsConfiguration metricsConfiguration = MetricsConfiguration.createDefault();
private PermissioningConfiguration permissioningConfiguration =
PermissioningConfiguration.createDefault();
private Optional<PermissioningConfiguration> permissioningConfiguration = Optional.empty();
private boolean devMode = true;
private GenesisConfigProvider genesisConfigProvider = ignore -> Optional.empty();
private Boolean p2pEnabled = true;
Expand Down Expand Up @@ -94,7 +93,7 @@ public PantheonFactoryConfigurationBuilder webSocketEnabled() {

public PantheonFactoryConfigurationBuilder setPermissioningConfiguration(
final PermissioningConfiguration permissioningConfiguration) {
this.permissioningConfiguration = permissioningConfiguration;
this.permissioningConfiguration = Optional.of(permissioningConfiguration);
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,27 +190,6 @@ public PantheonNode createNodeWithAccountsWhitelist(
.build());
}

public PantheonNode createNodeWithNodesWhitelistAndPermRPC(
final String name, final List<URI> nodesWhitelist) throws IOException {
PermissioningConfiguration permissioningConfiguration =
PermissioningConfiguration.createDefault();
permissioningConfiguration.setNodeWhitelist(nodesWhitelist);

JsonRpcConfiguration rpcConfig = JsonRpcConfiguration.createDefault();

rpcConfig.setEnabled(true);
rpcConfig.setPort(0);
rpcConfig.setHostsWhitelist(singletonList("*"));
rpcConfig.addRpcApi(RpcApis.PERM);

return create(
new PantheonFactoryConfigurationBuilder()
.setName(name)
.setJsonRpcConfiguration(rpcConfig)
.setPermissioningConfiguration(permissioningConfiguration)
.build());
}

public PantheonNode createNodeWithNoDiscovery(final String name) throws IOException {
return create(
new PantheonFactoryConfigurationBuilder().setName(name).setDiscoveryEnabled(false).build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@
*/
package tech.pegasys.pantheon.tests.acceptance.jsonrpc.perm;

import tech.pegasys.pantheon.ethereum.jsonrpc.RpcApis;
import tech.pegasys.pantheon.tests.acceptance.dsl.AcceptanceTestBase;
import tech.pegasys.pantheon.tests.acceptance.dsl.node.Node;

import java.util.ArrayList;

import org.assertj.core.util.Lists;
import org.junit.Before;
import org.junit.Test;
Expand All @@ -33,7 +34,7 @@ public class PermAddNodesToWhitelistAcceptanceTest extends AcceptanceTestBase {

@Before
public void setUp() throws Exception {
node = pantheon.createArchiveNodeWithRpcApis("node1", RpcApis.WEB3, RpcApis.NET, RpcApis.PERM);
node = pantheon.createNodeWithNodesWhitelist("node1", new ArrayList<>());
cluster.start(node);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ public class PermGetNodesWhitelistAcceptanceTest extends AcceptanceTestBase {

@Before
public void setUp() throws Exception {

node = pantheon.createNodeWithNodesWhitelist("node1", nodesWhitelist);
cluster.start(node);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,6 @@ public void shouldAllowWhitelistedTransactionWhenWhitelistEnabled() {
transactionPool.setAccountWhitelist(accountWhitelistController);
givenTransactionIsValid(transaction1);

when(accountWhitelistController.isAccountWhiteListSet()).thenReturn(true);
when(accountWhitelistController.contains(transaction1.getSender().toString())).thenReturn(true);

assertThat(transactionPool.addLocalTransaction(transaction1)).isEqualTo(valid());
Expand All @@ -377,7 +376,6 @@ public void shouldRejectNonWhitelistedTransactionWhenWhitelistEnabled() {
transactionPool.setAccountWhitelist(accountWhitelistController);
givenTransactionIsValid(transaction1);

when(accountWhitelistController.isAccountWhiteListSet()).thenReturn(true);
when(accountWhitelistController.contains(transaction1.getSender().toString()))
.thenReturn(false);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,7 @@
import tech.pegasys.pantheon.ethereum.p2p.peers.Endpoint;
import tech.pegasys.pantheon.ethereum.p2p.peers.Peer;
import tech.pegasys.pantheon.ethereum.p2p.peers.PeerBlacklist;
import tech.pegasys.pantheon.ethereum.p2p.permissioning.NodeWhitelistController;
import tech.pegasys.pantheon.ethereum.p2p.wire.messages.DisconnectMessage.DisconnectReason;
import tech.pegasys.pantheon.ethereum.permissioning.PermissioningConfiguration;
import tech.pegasys.pantheon.ethereum.worldstate.WorldStateArchive;
import tech.pegasys.pantheon.metrics.noop.NoOpMetricsSystem;
import tech.pegasys.pantheon.util.bytes.BytesValue;
Expand All @@ -55,6 +53,7 @@
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.concurrent.CompletableFuture;

Expand Down Expand Up @@ -121,7 +120,7 @@ public TestNode(
() -> true,
new PeerBlacklist(),
new NoOpMetricsSystem(),
new NodeWhitelistController(PermissioningConfiguration.createDefault())))
Optional.empty()))
.metricsSystem(new NoOpMetricsSystem())
.build();
network = networkRunner.getNetwork();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@

import java.util.HashSet;
import java.util.Map;
import java.util.Optional;

/** Provides a facade to construct the JSON-RPC component. */
public class JsonRpcTestMethodsFactory {
Expand Down Expand Up @@ -80,8 +81,8 @@ public Map<String, JsonRpcMethod> methods() {
blockchainQueries, transactionPool, new FilterIdGenerator(), new FilterRepository());
final EthHashMiningCoordinator miningCoordinator = mock(EthHashMiningCoordinator.class);
final MetricsSystem metricsSystem = new NoOpMetricsSystem();
final AccountWhitelistController accountWhitelistController =
mock(AccountWhitelistController.class);
final Optional<AccountWhitelistController> accountWhitelistController =
Optional.of(mock(AccountWhitelistController.class));
final PrivateTransactionHandler privateTransactionHandler =
mock(PrivateTransactionHandler.class);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

public class JsonRpcMethodsFactory {
Expand All @@ -112,7 +113,7 @@ public Map<String, JsonRpcMethod> methods(
final Set<Capability> supportedCapabilities,
final Collection<RpcApi> rpcApis,
final FilterManager filterManager,
final AccountWhitelistController accountsWhitelistController,
final Optional<AccountWhitelistController> accountsWhitelistController,
final PrivateTransactionHandler privateTransactionHandler) {
final BlockchainQueries blockchainQueries =
new BlockchainQueries(blockchain, worldStateArchive);
Expand Down Expand Up @@ -143,7 +144,7 @@ public Map<String, JsonRpcMethod> methods(
final MiningCoordinator miningCoordinator,
final MetricsSystem metricsSystem,
final Set<Capability> supportedCapabilities,
final AccountWhitelistController accountsWhitelistController,
final Optional<AccountWhitelistController> accountsWhitelistController,
final Collection<RpcApi> rpcApis,
final PrivateTransactionHandler privateTransactionHandler) {
final Map<String, JsonRpcMethod> enabledMethods = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,16 @@
import tech.pegasys.pantheon.ethereum.permissioning.WhitelistOperationResult;

import java.util.List;
import java.util.Optional;

public class PermAddAccountsToWhitelist implements JsonRpcMethod {

private final JsonRpcParameter parameters;
private final AccountWhitelistController whitelistController;
private final Optional<AccountWhitelistController> whitelistController;

public PermAddAccountsToWhitelist(
final AccountWhitelistController whitelistController, final JsonRpcParameter parameters) {
final Optional<AccountWhitelistController> whitelistController,
final JsonRpcParameter parameters) {
this.whitelistController = whitelistController;
this.parameters = parameters;
}
Expand All @@ -44,25 +46,31 @@ public String getName() {
@SuppressWarnings("unchecked")
public JsonRpcResponse response(final JsonRpcRequest request) {
final List<String> accountsList = parameters.required(request.getParams(), 0, List.class);
final WhitelistOperationResult addResult = whitelistController.addAccounts(accountsList);

switch (addResult) {
case ERROR_EMPTY_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY);
case ERROR_INVALID_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY);
case ERROR_EXISTING_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_EXISTING_ENTRY);
case ERROR_DUPLICATED_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY);
case SUCCESS:
return new JsonRpcSuccessResponse(request.getId());
default:
throw new IllegalStateException("Unmapped result from AccountWhitelistController");
if (whitelistController.isPresent()) {
final WhitelistOperationResult addResult =
whitelistController.get().addAccounts(accountsList);

switch (addResult) {
case ERROR_EMPTY_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY);
case ERROR_INVALID_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY);
case ERROR_EXISTING_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_EXISTING_ENTRY);
case ERROR_DUPLICATED_ENTRY:
return new JsonRpcErrorResponse(
request.getId(), JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY);
case SUCCESS:
return new JsonRpcSuccessResponse(request.getId());
default:
throw new IllegalStateException("Unmapped result from AccountWhitelistController");
}
} else {
return new JsonRpcErrorResponse(request.getId(), JsonRpcError.ACCOUNT_WHITELIST_NOT_ENABLED);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,35 +49,42 @@ public JsonRpcResponse response(final JsonRpcRequest req) {
parameters.required(req.getParams(), 0, StringListParameter.class);

try {
List<DefaultPeer> peers =
enodeListParam
.getStringList()
.parallelStream()
.map(this::parsePeer)
.collect(Collectors.toList());
if (p2pNetwork.getNodeWhitelistController().isPresent()) {
try {
List<DefaultPeer> peers =
enodeListParam
.getStringList()
.parallelStream()
.map(this::parsePeer)
.collect(Collectors.toList());

NodeWhitelistController.NodesWhitelistResult nodesWhitelistResult =
p2pNetwork.getNodeWhitelistController().addNodes(peers);
NodeWhitelistController.NodesWhitelistResult nodesWhitelistResult =
p2pNetwork.getNodeWhitelistController().get().addNodes(peers);

switch (nodesWhitelistResult.result()) {
case SUCCESS:
return new JsonRpcSuccessResponse(req.getId());
case ERROR_EMPTY_ENTRY:
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.NODE_WHITELIST_EMPTY_ENTRY);
case ERROR_EXISTING_ENTRY:
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.NODE_WHITELIST_EXISTING_ENTRY);
case ERROR_DUPLICATED_ENTRY:
return new JsonRpcErrorResponse(
req.getId(), JsonRpcError.NODE_WHITELIST_DUPLICATED_ENTRY);
default:
throw new Exception();
switch (nodesWhitelistResult.result()) {
case SUCCESS:
return new JsonRpcSuccessResponse(req.getId());
case ERROR_EMPTY_ENTRY:
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.NODE_WHITELIST_EMPTY_ENTRY);
case ERROR_EXISTING_ENTRY:
return new JsonRpcErrorResponse(
req.getId(), JsonRpcError.NODE_WHITELIST_EXISTING_ENTRY);
case ERROR_DUPLICATED_ENTRY:
return new JsonRpcErrorResponse(
req.getId(), JsonRpcError.NODE_WHITELIST_DUPLICATED_ENTRY);
default:
throw new Exception();
}
} catch (IllegalArgumentException e) {
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.NODE_WHITELIST_INVALID_ENTRY);
} catch (Exception e) {
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.INTERNAL_ERROR);
}
} else {
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.NODE_WHITELIST_NOT_ENABLED);
}
} catch (IllegalArgumentException e) {
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.NODE_WHITELIST_INVALID_ENTRY);
} catch (P2pDisabledException e) {
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.P2P_DISABLED);
} catch (Exception e) {
return new JsonRpcErrorResponse(req.getId(), JsonRpcError.INTERNAL_ERROR);
}
}

Expand Down
Loading