JSON RPC: Add permissioning account "allowlist" methods (#1095)

* add alternate account allowlist RPC endpoints

* update rpc names in AT

* added changelog entries for whitelist -> allowlist changes

Signed-off-by: Sally MacFarlane <sally.macfarlane@consensys.net>
pull/1098/head
Sally MacFarlane 4 years ago committed by GitHub
parent 0fdff649b5
commit dc4e2a8368
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      CHANGELOG.md
  2. 6
      acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/transaction/perm/PermissioningJsonRpcRequestFactory.java
  3. 2
      acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeLocalConfigPermissioningAcceptanceTest.java
  4. 3
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java
  5. 83
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermAddAccountsToAllowlist.java
  6. 1
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermAddAccountsToWhitelist.java
  7. 52
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermGetAccountsAllowlist.java
  8. 1
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermGetAccountsWhitelist.java
  9. 2
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermRemoveAccountsFromAllowlist.java
  10. 83
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermRemoveAccountsFromWhitelist.java
  11. 14
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/response/JsonRpcError.java
  12. 6
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/PermJsonRpcMethods.java
  13. 136
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermAddAccountsToAllowlistTest.java
  14. 1
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermAddAccountsToWhitelistTest.java
  15. 76
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermGetAccountsAllowlistTest.java
  16. 1
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermGetAccountsWhitelistTest.java
  17. 6
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermRemoveAccountsFromAllowlistTest.java
  18. 138
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/permissioning/PermRemoveAccountsFromWhitelistTest.java

@ -31,6 +31,18 @@ This default is what most users want when they are syncing but if you want to fu
The [1.5 release](docs/1_5_Upgrade.md) is scheduled for early July.
### Additions and Improvements
- local permissioning TOML config now supports additional keys (`nodes-allowlist` and `accounts-allowlist`).
Support for `nodes-whitelist` and `accounts-whitelist` will be removed in a future release.
- CLI now supports `--host-allowlist`. Support for `--host-whitelist` will be removed in a future release.
- Additional `Allowlist` JSON RPC endpoints for permissioning now supported. `Whitelist` endpoints will be removed in a future release.
- Add `perm_getNodesAllowlist` as an alternative equivalent to `perm_getNodesWhitelist`
- Add `perm_addNodesToAllowlist` as an alternative equivalent to `perm_addNodesToWhitelist`
- Add `perm_removeNodesFromAllowlist` as an alternative equivalent to `perm_removeNodesFromWhitelist`
- Add `perm_getAccountsAllowlist` as an alternative equivalent to `perm_getAccountsWhitelist`
- Add `perm_addAccountsToAllowlist` as an alternative equivalent to `perm_addAccountsToWhitelist`
- Add `perm_removeAccountsFromAllowlist` as an alternative equivalent to `perm_removeAccountsFromWhitelist`
## 1.4.6
### Additions and Improvements

@ -66,12 +66,12 @@ public class PermissioningJsonRpcRequestFactory {
Request<?, GetAccountsWhitelistResponse> getAccountsWhitelist() {
return new Request<>(
"perm_getAccountsWhitelist", null, web3jService, GetAccountsWhitelistResponse.class);
"perm_getAccountsAllowlist", null, web3jService, GetAccountsWhitelistResponse.class);
}
Request<?, AddAccountsToWhitelistResponse> addAccountsToWhitelist(final List<String> accounts) {
return new Request<>(
"perm_addAccountsToWhitelist",
"perm_addAccountsToAllowlist",
Collections.singletonList(accounts),
web3jService,
AddAccountsToWhitelistResponse.class);
@ -80,7 +80,7 @@ public class PermissioningJsonRpcRequestFactory {
Request<?, RemoveAccountsFromWhitelistResponse> removeAccountsFromWhitelist(
final List<String> accounts) {
return new Request<>(
"perm_removeAccountsFromWhitelist",
"perm_removeAccountsFromAllowlist",
Collections.singletonList(accounts),
web3jService,
RemoveAccountsFromWhitelistResponse.class);

@ -69,7 +69,7 @@ public class NodeLocalConfigPermissioningAcceptanceTest extends AcceptanceTestBa
}
@Test
public void forbiddenNodeAddedToWhitelistCanConnectToPermissionedNode() {
public void forbiddenNodeAddedToAllowlistCanConnectToPermissionedNode() {
permissionedNode.verify(net.awaitPeerCount(2));
// add node to the allowlist

@ -114,11 +114,14 @@ public enum RpcMethod {
NET_SERVICES("net_services"),
NET_VERSION("net_version"),
PERM_ADD_ACCOUNTS_TO_WHITELIST("perm_addAccountsToWhitelist"),
PERM_ADD_ACCOUNTS_TO_ALLOWLIST("perm_addAccountsToAllowlist"),
PERM_ADD_NODES_TO_WHITELIST("perm_addNodesToWhitelist"),
PERM_GET_ACCOUNTS_WHITELIST("perm_getAccountsWhitelist"),
PERM_GET_ACCOUNTS_ALLOWLIST("perm_getAccountsAllowlist"),
PERM_GET_NODES_WHITELIST("perm_getNodesWhitelist"),
PERM_RELOAD_PERMISSIONS_FROM_FILE("perm_reloadPermissionsFromFile"),
PERM_REMOVE_ACCOUNTS_FROM_WHITELIST("perm_removeAccountsFromWhitelist"),
PERM_REMOVE_ACCOUNTS_FROM_ALLOWLIST("perm_removeAccountsFromAllowlist"),
PERM_REMOVE_NODES_FROM_WHITELIST("perm_removeNodesFromWhitelist"),
RPC_MODULES("rpc_modules"),
TRACE_REPLAY_BLOCK_TRANSACTIONS("trace_replayBlockTransactions"),

@ -0,0 +1,83 @@
/*
* Copyright ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning;
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController;
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult;
import java.util.List;
import java.util.Optional;
public class PermAddAccountsToAllowlist implements JsonRpcMethod {
private final Optional<AccountLocalConfigPermissioningController> whitelistController;
public PermAddAccountsToAllowlist(
final Optional<AccountLocalConfigPermissioningController> whitelistController) {
this.whitelistController = whitelistController;
}
@Override
public String getName() {
return RpcMethod.PERM_ADD_ACCOUNTS_TO_ALLOWLIST.getMethodName();
}
@Override
@SuppressWarnings("unchecked")
public JsonRpcResponse response(final JsonRpcRequestContext requestContext) {
final List<String> accountsList = requestContext.getRequiredParameter(0, List.class);
if (whitelistController.isPresent()) {
final AllowlistOperationResult addResult =
whitelistController.get().addAccounts(accountsList);
switch (addResult) {
case ERROR_EMPTY_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY);
case ERROR_INVALID_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY);
case ERROR_EXISTING_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_EXISTING_ENTRY);
case ERROR_DUPLICATED_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY);
case ERROR_WHITELIST_PERSIST_FAIL:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_PERSIST_FAILURE);
case ERROR_WHITELIST_FILE_SYNC:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_FILE_SYNC);
case SUCCESS:
return new JsonRpcSuccessResponse(requestContext.getRequest().getId());
default:
throw new IllegalStateException(
"Unmapped result from AccountLocalConfigPermissioningController");
}
} else {
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_NOT_ENABLED);
}
}
}

@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult;
import java.util.List;
import java.util.Optional;
@Deprecated
public class PermAddAccountsToWhitelist implements JsonRpcMethod {
private final Optional<AccountLocalConfigPermissioningController> whitelistController;

@ -0,0 +1,52 @@
/*
* Copyright ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning;
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController;
import java.util.Optional;
public class PermGetAccountsAllowlist implements JsonRpcMethod {
private final Optional<AccountLocalConfigPermissioningController> whitelistController;
public PermGetAccountsAllowlist(
final Optional<AccountLocalConfigPermissioningController> whitelistController) {
this.whitelistController = whitelistController;
}
@Override
public String getName() {
return RpcMethod.PERM_GET_ACCOUNTS_ALLOWLIST.getMethodName();
}
@Override
public JsonRpcResponse response(final JsonRpcRequestContext requestContext) {
if (whitelistController.isPresent()) {
return new JsonRpcSuccessResponse(
requestContext.getRequest().getId(), whitelistController.get().getAccountWhitelist());
} else {
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_NOT_ENABLED);
}
}
}

@ -25,6 +25,7 @@ import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioni
import java.util.Optional;
@Deprecated
public class PermGetAccountsWhitelist implements JsonRpcMethod {
private final Optional<AccountLocalConfigPermissioningController> whitelistController;

@ -38,7 +38,7 @@ public class PermRemoveAccountsFromAllowlist implements JsonRpcMethod {
@Override
public String getName() {
return RpcMethod.PERM_REMOVE_ACCOUNTS_FROM_WHITELIST.getMethodName();
return RpcMethod.PERM_REMOVE_ACCOUNTS_FROM_ALLOWLIST.getMethodName();
}
@Override

@ -0,0 +1,83 @@
/*
* Copyright ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning;
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController;
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult;
import java.util.List;
import java.util.Optional;
@Deprecated
public class PermRemoveAccountsFromWhitelist implements JsonRpcMethod {
private final Optional<AccountLocalConfigPermissioningController> allowlistController;
public PermRemoveAccountsFromWhitelist(
final Optional<AccountLocalConfigPermissioningController> allowlistController) {
this.allowlistController = allowlistController;
}
@Override
public String getName() {
return RpcMethod.PERM_REMOVE_ACCOUNTS_FROM_WHITELIST.getMethodName();
}
@Override
@SuppressWarnings("unchecked")
public JsonRpcResponse response(final JsonRpcRequestContext requestContext) {
final List<String> accountsList = requestContext.getRequiredParameter(0, List.class);
if (allowlistController.isPresent()) {
final AllowlistOperationResult removeResult =
allowlistController.get().removeAccounts(accountsList);
switch (removeResult) {
case ERROR_EMPTY_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY);
case ERROR_INVALID_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY);
case ERROR_ABSENT_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_ABSENT_ENTRY);
case ERROR_DUPLICATED_ENTRY:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY);
case ERROR_WHITELIST_PERSIST_FAIL:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_PERSIST_FAILURE);
case ERROR_WHITELIST_FILE_SYNC:
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_FILE_SYNC);
case SUCCESS:
return new JsonRpcSuccessResponse(requestContext.getRequest().getId());
default:
throw new IllegalStateException(
"Unmapped result from AccountLocalConfigPermissioningController");
}
} else {
return new JsonRpcErrorResponse(
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_NOT_ENABLED);
}
}
}

@ -74,16 +74,16 @@ public enum JsonRpcError {
// Debug failures
PARENT_BLOCK_NOT_FOUND(-32000, "Parent block not found"),
// Permissioning/Account whitelist errors
ACCOUNT_WHITELIST_NOT_ENABLED(-32000, "Account whitelisting has not been enabled"),
// Permissioning/Account allowlist errors
ACCOUNT_WHITELIST_NOT_ENABLED(-32000, "Account allowlisting has not been enabled"),
ACCOUNT_WHITELIST_EMPTY_ENTRY(-32000, "Request contains an empty list of accounts"),
ACCOUNT_WHITELIST_INVALID_ENTRY(-32000, "Request contains an invalid account"),
ACCOUNT_WHITELIST_DUPLICATED_ENTRY(-32000, "Request contains duplicate accounts"),
ACCOUNT_WHITELIST_EXISTING_ENTRY(-32000, "Cannot add an existing account to whitelist"),
ACCOUNT_WHITELIST_ABSENT_ENTRY(-32000, "Cannot remove an absent account from whitelist"),
ACCOUNT_WHITELIST_EXISTING_ENTRY(-32000, "Cannot add an existing account to allowlist"),
ACCOUNT_WHITELIST_ABSENT_ENTRY(-32000, "Cannot remove an absent account from allowlist"),
// Permissioning/Node whitelist errors
NODE_WHITELIST_NOT_ENABLED(-32000, "Node whitelisting has not been enabled"),
// Permissioning/Node allowlist errors
NODE_WHITELIST_NOT_ENABLED(-32000, "Node allowlisting has not been enabled"),
NODE_WHITELIST_EMPTY_ENTRY(-32000, "Request contains an empty list of nodes"),
NODE_WHITELIST_INVALID_ENTRY(-32000, "Request contains an invalid node"),
NODE_WHITELIST_DUPLICATED_ENTRY(-32000, "Request contains duplicate nodes"),
@ -100,7 +100,7 @@ public enum JsonRpcError {
"The permissioning whitelist configuration file is out of sync. The changes have been applied, but not persisted to disk"),
WHITELIST_RELOAD_ERROR(
-32000,
"Error reloading permissions file. Please use perm_getAccountsWhitelist and perm_getNodesWhitelist to review the current state of the whitelists"),
"Error reloading permissions file. Please use perm_getAccountsAllowlist and perm_getNodesWhitelist to review the current state of the whitelists"),
PERMISSIONING_NOT_ENABLED(-32000, "Node/Account whitelisting has not been enabled"),
NON_PERMITTED_NODE_CANNOT_BE_ADDED_AS_A_PEER(-32000, "Cannot add a non-permitted node as a peer"),

@ -17,12 +17,15 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.methods;
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcApi;
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcApis;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermAddAccountsToAllowlist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermAddAccountsToWhitelist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermAddNodesToWhitelist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermGetAccountsAllowlist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermGetAccountsWhitelist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermGetNodesWhitelist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermReloadPermissionsFromFile;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermRemoveAccountsFromAllowlist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermRemoveAccountsFromWhitelist;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning.PermRemoveNodesFromWhitelist;
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController;
import org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController;
@ -54,7 +57,10 @@ public class PermJsonRpcMethods extends ApiGroupJsonRpcMethods {
new PermRemoveNodesFromWhitelist(nodeWhitelistController),
new PermGetNodesWhitelist(nodeWhitelistController),
new PermGetAccountsWhitelist(accountsWhitelistController),
new PermGetAccountsAllowlist(accountsWhitelistController),
new PermAddAccountsToWhitelist(accountsWhitelistController),
new PermAddAccountsToAllowlist(accountsWhitelistController),
new PermRemoveAccountsFromWhitelist(accountsWhitelistController),
new PermRemoveAccountsFromAllowlist(accountsWhitelistController),
new PermReloadPermissionsFromFile(accountsWhitelistController, nodeWhitelistController));
}

@ -0,0 +1,136 @@
/*
* Copyright ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController;
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class PermAddAccountsToAllowlistTest {
@Mock private AccountLocalConfigPermissioningController accountWhitelist;
private PermAddAccountsToAllowlist method;
@Before
public void before() {
method = new PermAddAccountsToAllowlist(java.util.Optional.of(accountWhitelist));
}
@Test
public void getNameShouldReturnExpectedName() {
assertThat(method.getName()).isEqualTo("perm_addAccountsToAllowlist");
}
@Test
public void whenAccountsAreAddedToWhitelistShouldReturnSuccess() {
List<String> accounts = Arrays.asList("0x0", "0x1");
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null);
when(accountWhitelist.addAccounts(eq(accounts))).thenReturn(AllowlistOperationResult.SUCCESS);
JsonRpcResponse actualResponse = method.response(request(accounts));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenAccountIsInvalidShouldReturnInvalidAccountErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY);
when(accountWhitelist.addAccounts(any()))
.thenReturn(AllowlistOperationResult.ERROR_INVALID_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenAccountExistsShouldReturnExistingEntryErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_EXISTING_ENTRY);
when(accountWhitelist.addAccounts(any()))
.thenReturn(AllowlistOperationResult.ERROR_EXISTING_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenInputHasDuplicatedAccountsShouldReturnDuplicatedEntryErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY);
when(accountWhitelist.addAccounts(any()))
.thenReturn(AllowlistOperationResult.ERROR_DUPLICATED_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenEmptyListOnRequestShouldReturnEmptyEntryErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY);
when(accountWhitelist.addAccounts(eq(new ArrayList<>())))
.thenReturn(AllowlistOperationResult.ERROR_EMPTY_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenEmptyParamOnRequestShouldThrowInvalidJsonRpcException() {
JsonRpcRequestContext request =
new JsonRpcRequestContext(
new JsonRpcRequest("2.0", "perm_addAccountsToAllowlist", new Object[] {}));
final Throwable thrown = catchThrowable(() -> method.response(request));
assertThat(thrown)
.hasNoCause()
.isInstanceOf(InvalidJsonRpcParameters.class)
.hasMessage("Missing required json rpc parameter at index 0");
}
private JsonRpcRequestContext request(final List<String> accounts) {
return new JsonRpcRequestContext(
new JsonRpcRequest("2.0", "perm_addAccountsToAllowlist", new Object[] {accounts}));
}
}

@ -40,6 +40,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@Deprecated
@RunWith(MockitoJUnitRunner.class)
public class PermAddAccountsToWhitelistTest {

@ -0,0 +1,76 @@
/*
* Copyright ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class PermGetAccountsAllowlistTest {
private static final JsonRpcRequestContext request =
new JsonRpcRequestContext(new JsonRpcRequest("2.0", "perm_getAccountsAllowlist", null));
@Mock private AccountLocalConfigPermissioningController accountWhitelist;
private PermGetAccountsAllowlist method;
@Before
public void before() {
method = new PermGetAccountsAllowlist(java.util.Optional.of(accountWhitelist));
}
@Test
public void getNameShouldReturnExpectedName() {
assertThat(method.getName()).isEqualTo("perm_getAccountsAllowlist");
}
@Test
public void shouldReturnExpectedListOfAccountsWhenWhitelistHasBeenSet() {
List<String> accountsList = Arrays.asList("0x0", "0x1");
when(accountWhitelist.getAccountWhitelist()).thenReturn(accountsList);
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, accountsList);
JsonRpcResponse actualResponse = method.response(request);
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void shouldReturnEmptyListOfAccountsWhenWhitelistHasBeenSetAndIsEmpty() {
List<String> emptyAccountsList = new ArrayList<>();
when(accountWhitelist.getAccountWhitelist()).thenReturn(emptyAccountsList);
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, emptyAccountsList);
JsonRpcResponse actualResponse = method.response(request);
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
}

@ -33,6 +33,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@Deprecated
@RunWith(MockitoJUnitRunner.class)
public class PermGetAccountsWhitelistTest {

@ -53,7 +53,7 @@ public class PermRemoveAccountsFromAllowlistTest {
@Test
public void getNameShouldReturnExpectedName() {
assertThat(method.getName()).isEqualTo("perm_removeAccountsFromWhitelist");
assertThat(method.getName()).isEqualTo("perm_removeAccountsFromAllowlist");
}
@Test
@ -121,7 +121,7 @@ public class PermRemoveAccountsFromAllowlistTest {
public void whenEmptyParamOnRequestShouldThrowInvalidJsonRpcException() {
JsonRpcRequestContext request =
new JsonRpcRequestContext(
new JsonRpcRequest("2.0", "perm_removeAccountsFromWhitelist", new Object[] {}));
new JsonRpcRequest("2.0", "perm_removeAccountsFromAllowlist", new Object[] {}));
final Throwable thrown = catchThrowable(() -> method.response(request));
assertThat(thrown)
@ -132,6 +132,6 @@ public class PermRemoveAccountsFromAllowlistTest {
private JsonRpcRequestContext request(final List<String> accounts) {
return new JsonRpcRequestContext(
new JsonRpcRequest("2.0", "perm_removeAccountsFromWhitelist", new Object[] {accounts}));
new JsonRpcRequest("2.0", "perm_removeAccountsFromAllowlist", new Object[] {accounts}));
}
}

@ -0,0 +1,138 @@
/*
* Copyright ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse;
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController;
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@Deprecated
@RunWith(MockitoJUnitRunner.class)
public class PermRemoveAccountsFromWhitelistTest {
@Mock private AccountLocalConfigPermissioningController accountWhitelist;
private PermRemoveAccountsFromWhitelist method;
@Before
public void before() {
method = new PermRemoveAccountsFromWhitelist(java.util.Optional.of(accountWhitelist));
}
@Test
public void getNameShouldReturnExpectedName() {
assertThat(method.getName()).isEqualTo("perm_removeAccountsFromWhitelist");
}
@Test
public void whenAccountsAreRemovedFromWhitelistShouldReturnSuccess() {
List<String> accounts = Arrays.asList("0x0", "0x1");
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null);
when(accountWhitelist.removeAccounts(eq(accounts)))
.thenReturn(AllowlistOperationResult.SUCCESS);
JsonRpcResponse actualResponse = method.response(request(accounts));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenAccountIsInvalidShouldReturnInvalidAccountErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY);
when(accountWhitelist.removeAccounts(any()))
.thenReturn(AllowlistOperationResult.ERROR_INVALID_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenAccountIsAbsentShouldReturnAbsentAccountErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_ABSENT_ENTRY);
when(accountWhitelist.removeAccounts(any()))
.thenReturn(AllowlistOperationResult.ERROR_ABSENT_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenInputHasDuplicatedAccountsShouldReturnDuplicatedEntryErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY);
when(accountWhitelist.removeAccounts(any()))
.thenReturn(AllowlistOperationResult.ERROR_DUPLICATED_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenEmptyListOnRequestShouldReturnEmptyEntryErrorResponse() {
JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY);
when(accountWhitelist.removeAccounts(eq(new ArrayList<>())))
.thenReturn(AllowlistOperationResult.ERROR_EMPTY_ENTRY);
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>()));
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void whenEmptyParamOnRequestShouldThrowInvalidJsonRpcException() {
JsonRpcRequestContext request =
new JsonRpcRequestContext(
new JsonRpcRequest("2.0", "perm_removeAccountsFromWhitelist", new Object[] {}));
final Throwable thrown = catchThrowable(() -> method.response(request));
assertThat(thrown)
.hasNoCause()
.isInstanceOf(InvalidJsonRpcParameters.class)
.hasMessage("Missing required json rpc parameter at index 0");
}
private JsonRpcRequestContext request(final List<String> accounts) {
return new JsonRpcRequestContext(
new JsonRpcRequest("2.0", "perm_removeAccountsFromWhitelist", new Object[] {accounts}));
}
}
Loading…
Cancel
Save