From b9e10654c626d5638bb0ea835bd4624e98790c08 Mon Sep 17 00:00:00 2001 From: Mark Terry Date: Fri, 14 Feb 2020 00:44:18 +1000 Subject: [PATCH 1/4] [PIE-1798] Added some multitenancy fail case tests. Signed-off-by: Mark Terry --- .../dsl/condition/priv/PrivConditions.java | 31 ++++ ...tionFailPrivateFromNotMatchEnclaveKey.java | 42 +++++ .../condition/priv/fail/MultiTenancyFail.java | 35 ++++ ...ePrivacyGroupFailEnclaveKeyNotInGroup.java | 48 +++++ ...dPrivacyGroupFailEnclaveKeyNotInGroup.java | 42 +++++ ...ountFailPrivateFromNotMatchEnclaveKey.java | 42 +++++ ...nsactionCountFailEnclaveKeyNotInGroup.java | 42 +++++ .../MultiTenancyFailAcceptanceTest.java | 175 ++++++++++++++++++ .../resources/authentication/auth_priv.toml | 5 + 9 files changed, 462 insertions(+) create mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java create mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java create mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java create mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java create mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java create mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java create mode 100644 acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyFailAcceptanceTest.java diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java index a763eab6957..367a45cfb6e 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java @@ -18,6 +18,11 @@ import org.hyperledger.besu.ethereum.core.Hash; import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; +import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey; +import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup; +import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivFindPrivacyGroupFailEnclaveKeyNotInGroup; +import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey; +import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivGetTransactionCountFailEnclaveKeyNotInGroup; import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyTransactions; import java.util.List; @@ -54,14 +59,28 @@ public Condition deletePrivacyGroup(final String groupId) { return new PrivDeletePrivacyGroupSuccess(transactions.deletePrivacyGroup(groupId), groupId); } + public Condition deletePrivacyGroupFailEnclaveKeyNotInGroup(final String groupId) { + return new PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup( + transactions.deletePrivacyGroup(groupId)); + } + public Condition findPrivacyGroup(final int numGroups, final String... groupMembers) { return new PrivFindPrivacyGroupSuccess(transactions.findPrivacyGroup(groupMembers), numGroups); } + public Condition findPrivacyGroupFailEnclaveKeyNotInGroup(final String... groupMembers) { + return new PrivFindPrivacyGroupFailEnclaveKeyNotInGroup( + transactions.findPrivacyGroup(groupMembers)); + } + public Condition eeaSendRawTransaction(final String transaction) { return new EeaSendRawTransactionSuccess(transactions.sendRawTransaction(transaction)); } + public Condition eeaSendRawTransactionPrivateFromNotMatchEnclaveKey(final String transaction) { + return new EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey(transactions.sendRawTransaction(transaction)); + } + public Condition distributeRawTransaction( final String transactionRLP, final String enclaveResponseKey) { return new PrivDistributeRawTransactionSuccess( @@ -76,6 +95,12 @@ public Condition getTransactionCount( transactions.getTransactionCount(accountAddress, privacyGroupId), expectedTransactionCount); } + public Condition getTransactionCountFailWhenEnclaveKeyNotInPrivacyGroup( + final String accountAddress, final String privacyGroupId) { + return new PrivGetTransactionCountFailEnclaveKeyNotInGroup( + transactions.getTransactionCount(accountAddress, privacyGroupId)); + } + public Condition getEeaTransactionCount( final String accountAddress, final String privateFrom, @@ -86,6 +111,12 @@ public Condition getEeaTransactionCount( expectedTransactionCount); } + public Condition getEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( + final String accountAddress, final String privateFrom, final String[] privateFor) { + return new PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( + transactions.getEeaTransactionCount(accountAddress, privateFrom, privateFor)); + } + public Condition getTransactionReceipt(final Hash transactionHash) { return new PrivGetTransactionReceiptSuccess( transactions.getTransactionReceipt(transactionHash)); diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java new file mode 100644 index 00000000000..0e93ec774e8 --- /dev/null +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java @@ -0,0 +1,42 @@ +/* + * 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.tests.acceptance.dsl.condition.priv.fail; + +import org.hyperledger.besu.ethereum.core.Hash; +import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; +import org.hyperledger.besu.tests.acceptance.dsl.node.Node; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.EeaSendRawTransactionTransaction; +import org.web3j.protocol.exceptions.ClientConnectionException; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +public class EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey implements Condition { + + private final EeaSendRawTransactionTransaction sendRawTransactionTransaction; + + public EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey( + final EeaSendRawTransactionTransaction sendRawTransactionTransaction) { + this.sendRawTransactionTransaction = sendRawTransactionTransaction; + } + + @Override + public void verify(final Node node) { + try { + node.execute(sendRawTransactionTransaction); + } catch (final Exception e) { + assertThat(e).isInstanceOf(ClientConnectionException.class); + } + } +} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java new file mode 100644 index 00000000000..1d8c6100174 --- /dev/null +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java @@ -0,0 +1,35 @@ +package org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail; + +import org.assertj.core.api.Assertions; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; +import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; +import org.hyperledger.besu.tests.acceptance.dsl.node.Node; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; +import org.web3j.protocol.exceptions.ClientConnectionException; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class MultiTenancyFail implements Condition { + + private final Transaction transaction; + private final JsonRpcError error; + + public MultiTenancyFail( + final Transaction transaction, final JsonRpcError error) { + this.transaction = transaction; + this.error = error; + } + + @Override + public void verify(final Node node) { + try { + node.execute(transaction); + assertThatExceptionOfType(ClientConnectionException.class); + } catch (final Exception e) { + Assertions.assertThat(e) + .isInstanceOf(ClientConnectionException.class) + .hasMessageContaining("400") + .hasMessageContaining(error.getMessage()); + } + } +} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java new file mode 100644 index 00000000000..8a443373d1e --- /dev/null +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java @@ -0,0 +1,48 @@ +/* + * 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.tests.acceptance.dsl.condition.priv.fail; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError.DELETE_PRIVACY_GROUP_ERROR; + +import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; +import org.hyperledger.besu.tests.acceptance.dsl.node.Node; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivDeletePrivacyGroupTransaction; + +import org.web3j.protocol.exceptions.ClientConnectionException; + +public class PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup implements Condition { + + private final PrivDeletePrivacyGroupTransaction transaction; + + public PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup( + final PrivDeletePrivacyGroupTransaction transaction) { + this.transaction = transaction; + } + + @Override + public void verify(final Node node) { + try { + node.execute(transaction); + assertThatExceptionOfType(ClientConnectionException.class); + } catch (final Exception e) { + assertThat(e) + .isInstanceOf(ClientConnectionException.class) + .hasMessageContaining("400") + .hasMessageContaining(DELETE_PRIVACY_GROUP_ERROR.getMessage()); + } + } +} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java new file mode 100644 index 00000000000..f10e24f14e1 --- /dev/null +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java @@ -0,0 +1,42 @@ +/* + * 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.tests.acceptance.dsl.condition.priv.fail; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; +import org.hyperledger.besu.tests.acceptance.dsl.node.Node; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivFindPrivacyGroupTransaction; + +import org.web3j.protocol.exceptions.ClientConnectionException; + +public class PrivFindPrivacyGroupFailEnclaveKeyNotInGroup implements Condition { + + private final PrivFindPrivacyGroupTransaction transaction; + + public PrivFindPrivacyGroupFailEnclaveKeyNotInGroup( + final PrivFindPrivacyGroupTransaction transaction) { + this.transaction = transaction; + } + + @Override + public void verify(final Node node) { + try { + node.execute(transaction); + } catch (final Exception e) { + assertThat(e).isInstanceOf(ClientConnectionException.class); + } + } +} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java new file mode 100644 index 00000000000..cfc43a3509c --- /dev/null +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java @@ -0,0 +1,42 @@ +/* + * 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.tests.acceptance.dsl.condition.priv.fail; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; +import org.hyperledger.besu.tests.acceptance.dsl.node.Node; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetEeaTransactionCountTransaction; + +import org.web3j.protocol.exceptions.ClientConnectionException; + +public class PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey implements Condition { + + private final PrivGetEeaTransactionCountTransaction privGetEeaTransactionCountTransaction; + + public PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( + final PrivGetEeaTransactionCountTransaction privGetEeaTransactionCountTransaction) { + this.privGetEeaTransactionCountTransaction = privGetEeaTransactionCountTransaction; + } + + @Override + public void verify(final Node node) { + try { + node.execute(privGetEeaTransactionCountTransaction); + } catch (final Exception e) { + assertThat(e).isInstanceOf(ClientConnectionException.class); + } + } +} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java new file mode 100644 index 00000000000..16ad88fdd1d --- /dev/null +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java @@ -0,0 +1,42 @@ +/* + * 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.tests.acceptance.dsl.condition.priv.fail; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; +import org.hyperledger.besu.tests.acceptance.dsl.node.Node; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetTransactionCountTransaction; + +import org.web3j.protocol.exceptions.ClientConnectionException; + +public class PrivGetTransactionCountFailEnclaveKeyNotInGroup implements Condition { + + private final PrivGetTransactionCountTransaction privGetTransactionCountTransaction; + + public PrivGetTransactionCountFailEnclaveKeyNotInGroup( + final PrivGetTransactionCountTransaction privGetTransactionCountTransaction) { + this.privGetTransactionCountTransaction = privGetTransactionCountTransaction; + } + + @Override + public void verify(final Node node) { + try { + node.execute(privGetTransactionCountTransaction); + } catch (final Exception e) { + assertThat(e).isInstanceOf(ClientConnectionException.class); + } + } +} diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyFailAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyFailAcceptanceTest.java new file mode 100644 index 00000000000..f44525f5154 --- /dev/null +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyFailAcceptanceTest.java @@ -0,0 +1,175 @@ +/* + * 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.tests.acceptance.privacy.multitenancy; + +import static com.github.tomakehurst.wiremock.client.WireMock.ok; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; + +import org.hyperledger.besu.crypto.SECP256K1; +import org.hyperledger.besu.enclave.types.PrivacyGroup; +import org.hyperledger.besu.ethereum.core.Address; +import org.hyperledger.besu.ethereum.core.Wei; +import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; +import org.hyperledger.besu.ethereum.privacy.Restriction; +import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; +import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; +import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; +import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.Cluster; +import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfiguration; +import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder; + +import java.math.BigInteger; +import java.util.List; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import org.apache.tuweni.bytes.Bytes; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +public class MultiTenancyFailAcceptanceTest extends AcceptanceTestBase { + private BesuNode node; + private final ObjectMapper mapper = new ObjectMapper(); + private Cluster multiTenancyCluster; + + private static final int ENCLAVE_PORT = 1080; + private static final String PRIVACY_GROUP_ID = "Z3JvdXBJZA=="; + private static final String ENCLAVE_KEY = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; + private static final String OTHER_ENCLAVE_KEY = "A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; + private final Address senderAddress = + Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); + + @Rule public WireMockRule wireMockRule = new WireMockRule(options().port(ENCLAVE_PORT)); + + @Before + public void setUp() throws Exception { + final ClusterConfiguration clusterConfiguration = + new ClusterConfigurationBuilder().awaitPeerDiscovery(false).build(); + multiTenancyCluster = new Cluster(clusterConfiguration, net); + node = + besu.createNodeWithMultiTenantedPrivacy( + "node1", + "http://127.0.0.1:" + ENCLAVE_PORT, + "authentication/auth_priv.toml", + "authentication/auth_priv_key"); + multiTenancyCluster.start(node); + + final String token = + node.execute(permissioningTransactions.createSuccessfulLogin("failUser", "pegasys")); + node.useAuthenticationTokenInHeaderForJsonRpc(token); + } + + @After + public void tearDown() { + multiTenancyCluster.close(); + } + + @Test + public void sendTransactionShouldFailWhenPrivateFromNotMatchEnclaveKey() + throws JsonProcessingException { + final PrivateTransaction validSignedPrivateTransaction = + getValidSignedPrivateTransaction(senderAddress, OTHER_ENCLAVE_KEY); + retrievePrivacyGroupEnclaveStub(); + node.verify( + priv.eeaSendRawTransactionPrivateFromNotMatchEnclaveKey( + getRLPOutput(validSignedPrivateTransaction).encoded().toHexString())); + } + + @Test + public void sendTransactionShouldFailWhenPrivacyGroupDoesNotContainEnclaveKey() throws JsonProcessingException { + final PrivateTransaction validSignedPrivateTransaction = + getValidSignedPrivateTransaction(senderAddress, ENCLAVE_KEY); + retrievePrivacyGroupEnclaveStub(); + node.verify( + priv.eeaSendRawTransactionPrivateFromNotMatchEnclaveKey( + getRLPOutput(validSignedPrivateTransaction).encoded().toHexString())); + } + + @Test + public void deletePrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() + throws JsonProcessingException { + retrievePrivacyGroupEnclaveStub(); + node.verify(priv.deletePrivacyGroupFailEnclaveKeyNotInGroup(PRIVACY_GROUP_ID)); + } + + @Test + public void findPrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() { + node.verify(priv.findPrivacyGroupFailEnclaveKeyNotInGroup(OTHER_ENCLAVE_KEY)); + } + + @Test + public void determineEeaNonceShouldFailWhenPrivateFromNotMatchEnclaveKey() { + final String accountAddress = Address.ZERO.toHexString(); + final String senderAddressBase64 = Bytes.fromHexString(accountAddress).toBase64String(); + final String[] privateFor = {senderAddressBase64}; + node.verify( + priv.getEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( + accountAddress, OTHER_ENCLAVE_KEY, privateFor)); + } + + @Test + public void determineBesuNonceShouldFailWhenEnclaveKeyNotInPrivacyGroup() + throws JsonProcessingException { + retrievePrivacyGroupEnclaveStub(); + final String accountAddress = Address.ZERO.toHexString(); + node.verify( + priv.getTransactionCountFailWhenEnclaveKeyNotInPrivacyGroup( + accountAddress, PRIVACY_GROUP_ID)); + } + + private void retrievePrivacyGroupEnclaveStub() throws JsonProcessingException { + final String retrieveGroupResponse = + mapper.writeValueAsString( + testPrivacyGroup(List.of(OTHER_ENCLAVE_KEY), PrivacyGroup.Type.PANTHEON)); + stubFor(post("/retrievePrivacyGroup").willReturn(ok(retrieveGroupResponse))); + } + + private PrivacyGroup testPrivacyGroup( + final List groupMembers, final PrivacyGroup.Type groupType) { + return new PrivacyGroup(PRIVACY_GROUP_ID, groupType, "test", "testGroup", groupMembers); + } + + private BytesValueRLPOutput getRLPOutput(final PrivateTransaction validSignedPrivateTransaction) { + final BytesValueRLPOutput bvrlpo = new BytesValueRLPOutput(); + validSignedPrivateTransaction.writeTo(bvrlpo); + return bvrlpo; + } + + private static PrivateTransaction getValidSignedPrivateTransaction( + final Address senderAddress, final String privateFrom) { + return PrivateTransaction.builder() + .nonce(0) + .gasPrice(Wei.ZERO) + .gasLimit(3000000) + .to(null) + .value(Wei.ZERO) + .payload(Bytes.wrap(new byte[] {})) + .sender(senderAddress) + .chainId(BigInteger.valueOf(2018)) + .privateFrom(Bytes.fromBase64String(privateFrom)) + .restriction(Restriction.RESTRICTED) + .privacyGroupId(Bytes.fromBase64String(PRIVACY_GROUP_ID)) + .signAndBuild( + SECP256K1.KeyPair.create( + SECP256K1.PrivateKey.create( + new BigInteger( + "853d7f0010fd86d0d7811c1f9d968ea89a24484a8127b4a483ddf5d2cfec766d", 16)))); + } +} diff --git a/acceptance-tests/tests/src/test/resources/authentication/auth_priv.toml b/acceptance-tests/tests/src/test/resources/authentication/auth_priv.toml index 2c86f165bf7..bcd2673c1ae 100644 --- a/acceptance-tests/tests/src/test/resources/authentication/auth_priv.toml +++ b/acceptance-tests/tests/src/test/resources/authentication/auth_priv.toml @@ -2,3 +2,8 @@ password = "$2a$10$l3GA7K8g6rJ/Yv.YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC" permissions = ["fakePermission", "*:*"] privacyPublicKey = "A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo=" + +[Users.failUser] +password = "$2a$10$l3GA7K8g6rJ/Yv.YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC" +permissions = ["fakePermission", "*:*"] +privacyPublicKey = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo=" From c2cc6f9fce1c89fcf419b3160409bf6c3537146c Mon Sep 17 00:00:00 2001 From: Mark Terry Date: Fri, 14 Feb 2020 01:36:56 +1000 Subject: [PATCH 2/4] [PIE-1798] Refactoring. Signed-off-by: Mark Terry --- ...p.java => MultiTenancyValidationFail.java} | 25 ++++----- .../dsl/condition/priv/PrivConditions.java | 38 +++----------- ...tionFailPrivateFromNotMatchEnclaveKey.java | 42 --------------- .../condition/priv/fail/MultiTenancyFail.java | 35 ------------- ...dPrivacyGroupFailEnclaveKeyNotInGroup.java | 42 --------------- ...ountFailPrivateFromNotMatchEnclaveKey.java | 42 --------------- ...nsactionCountFailEnclaveKeyNotInGroup.java | 42 --------------- ...iTenancyValidationFailAcceptanceTest.java} | 52 ++++++++++++------- 8 files changed, 53 insertions(+), 265 deletions(-) rename acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/{fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java => MultiTenancyValidationFail.java} (59%) delete mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java delete mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java delete mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java delete mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java delete mode 100644 acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java rename acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/{MultiTenancyFailAcceptanceTest.java => MultiTenancyValidationFailAcceptanceTest.java} (76%) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/MultiTenancyValidationFail.java similarity index 59% rename from acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java rename to acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/MultiTenancyValidationFail.java index 8a443373d1e..14956a25f0b 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/MultiTenancyValidationFail.java @@ -12,37 +12,38 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail; +package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError.DELETE_PRIVACY_GROUP_ERROR; +import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; import org.hyperledger.besu.tests.acceptance.dsl.node.Node; -import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivDeletePrivacyGroupTransaction; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; +import org.assertj.core.api.Assertions; import org.web3j.protocol.exceptions.ClientConnectionException; -public class PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup implements Condition { +public class MultiTenancyValidationFail implements Condition { - private final PrivDeletePrivacyGroupTransaction transaction; + private final Transaction transaction; + private final JsonRpcError error; - public PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup( - final PrivDeletePrivacyGroupTransaction transaction) { + public MultiTenancyValidationFail(final Transaction transaction, final JsonRpcError error) { this.transaction = transaction; + this.error = error; } @Override public void verify(final Node node) { try { node.execute(transaction); - assertThatExceptionOfType(ClientConnectionException.class); + failBecauseExceptionWasNotThrown(ClientConnectionException.class); } catch (final Exception e) { - assertThat(e) + Assertions.assertThat(e) .isInstanceOf(ClientConnectionException.class) .hasMessageContaining("400") - .hasMessageContaining(DELETE_PRIVACY_GROUP_ERROR.getMessage()); + .hasMessageContaining(error.getMessage()); } } } diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java index 367a45cfb6e..815a3525f84 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java @@ -14,15 +14,12 @@ */ package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; import org.hyperledger.besu.ethereum.core.Address; import org.hyperledger.besu.ethereum.core.Hash; import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; -import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey; -import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup; -import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivFindPrivacyGroupFailEnclaveKeyNotInGroup; -import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey; -import org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail.PrivGetTransactionCountFailEnclaveKeyNotInGroup; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyTransactions; import java.util.List; @@ -59,28 +56,14 @@ public Condition deletePrivacyGroup(final String groupId) { return new PrivDeletePrivacyGroupSuccess(transactions.deletePrivacyGroup(groupId), groupId); } - public Condition deletePrivacyGroupFailEnclaveKeyNotInGroup(final String groupId) { - return new PrivDeletePrivacyGroupFailEnclaveKeyNotInGroup( - transactions.deletePrivacyGroup(groupId)); - } - public Condition findPrivacyGroup(final int numGroups, final String... groupMembers) { return new PrivFindPrivacyGroupSuccess(transactions.findPrivacyGroup(groupMembers), numGroups); } - public Condition findPrivacyGroupFailEnclaveKeyNotInGroup(final String... groupMembers) { - return new PrivFindPrivacyGroupFailEnclaveKeyNotInGroup( - transactions.findPrivacyGroup(groupMembers)); - } - public Condition eeaSendRawTransaction(final String transaction) { return new EeaSendRawTransactionSuccess(transactions.sendRawTransaction(transaction)); } - public Condition eeaSendRawTransactionPrivateFromNotMatchEnclaveKey(final String transaction) { - return new EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey(transactions.sendRawTransaction(transaction)); - } - public Condition distributeRawTransaction( final String transactionRLP, final String enclaveResponseKey) { return new PrivDistributeRawTransactionSuccess( @@ -95,12 +78,6 @@ public Condition getTransactionCount( transactions.getTransactionCount(accountAddress, privacyGroupId), expectedTransactionCount); } - public Condition getTransactionCountFailWhenEnclaveKeyNotInPrivacyGroup( - final String accountAddress, final String privacyGroupId) { - return new PrivGetTransactionCountFailEnclaveKeyNotInGroup( - transactions.getTransactionCount(accountAddress, privacyGroupId)); - } - public Condition getEeaTransactionCount( final String accountAddress, final String privateFrom, @@ -111,14 +88,13 @@ public Condition getEeaTransactionCount( expectedTransactionCount); } - public Condition getEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( - final String accountAddress, final String privateFrom, final String[] privateFor) { - return new PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( - transactions.getEeaTransactionCount(accountAddress, privateFrom, privateFor)); - } - public Condition getTransactionReceipt(final Hash transactionHash) { return new PrivGetTransactionReceiptSuccess( transactions.getTransactionReceipt(transactionHash)); } + + public Condition multiTenancyValidationFail( + final Transaction transaction, final JsonRpcError error) { + return new MultiTenancyValidationFail(transaction, error); + } } diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java deleted file mode 100644 index 0e93ec774e8..00000000000 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.tests.acceptance.dsl.condition.priv.fail; - -import org.hyperledger.besu.ethereum.core.Hash; -import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; -import org.hyperledger.besu.tests.acceptance.dsl.node.Node; -import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.EeaSendRawTransactionTransaction; -import org.web3j.protocol.exceptions.ClientConnectionException; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - -public class EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey implements Condition { - - private final EeaSendRawTransactionTransaction sendRawTransactionTransaction; - - public EeaSendRawTransactionFailPrivateFromNotMatchEnclaveKey( - final EeaSendRawTransactionTransaction sendRawTransactionTransaction) { - this.sendRawTransactionTransaction = sendRawTransactionTransaction; - } - - @Override - public void verify(final Node node) { - try { - node.execute(sendRawTransactionTransaction); - } catch (final Exception e) { - assertThat(e).isInstanceOf(ClientConnectionException.class); - } - } -} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java deleted file mode 100644 index 1d8c6100174..00000000000 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/MultiTenancyFail.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.hyperledger.besu.tests.acceptance.dsl.condition.priv.fail; - -import org.assertj.core.api.Assertions; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; -import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; -import org.hyperledger.besu.tests.acceptance.dsl.node.Node; -import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; -import org.web3j.protocol.exceptions.ClientConnectionException; - -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; - -public class MultiTenancyFail implements Condition { - - private final Transaction transaction; - private final JsonRpcError error; - - public MultiTenancyFail( - final Transaction transaction, final JsonRpcError error) { - this.transaction = transaction; - this.error = error; - } - - @Override - public void verify(final Node node) { - try { - node.execute(transaction); - assertThatExceptionOfType(ClientConnectionException.class); - } catch (final Exception e) { - Assertions.assertThat(e) - .isInstanceOf(ClientConnectionException.class) - .hasMessageContaining("400") - .hasMessageContaining(error.getMessage()); - } - } -} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java deleted file mode 100644 index f10e24f14e1..00000000000 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivFindPrivacyGroupFailEnclaveKeyNotInGroup.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.tests.acceptance.dsl.condition.priv.fail; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - -import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; -import org.hyperledger.besu.tests.acceptance.dsl.node.Node; -import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivFindPrivacyGroupTransaction; - -import org.web3j.protocol.exceptions.ClientConnectionException; - -public class PrivFindPrivacyGroupFailEnclaveKeyNotInGroup implements Condition { - - private final PrivFindPrivacyGroupTransaction transaction; - - public PrivFindPrivacyGroupFailEnclaveKeyNotInGroup( - final PrivFindPrivacyGroupTransaction transaction) { - this.transaction = transaction; - } - - @Override - public void verify(final Node node) { - try { - node.execute(transaction); - } catch (final Exception e) { - assertThat(e).isInstanceOf(ClientConnectionException.class); - } - } -} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java deleted file mode 100644 index cfc43a3509c..00000000000 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.tests.acceptance.dsl.condition.priv.fail; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - -import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; -import org.hyperledger.besu.tests.acceptance.dsl.node.Node; -import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetEeaTransactionCountTransaction; - -import org.web3j.protocol.exceptions.ClientConnectionException; - -public class PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey implements Condition { - - private final PrivGetEeaTransactionCountTransaction privGetEeaTransactionCountTransaction; - - public PrivGetEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( - final PrivGetEeaTransactionCountTransaction privGetEeaTransactionCountTransaction) { - this.privGetEeaTransactionCountTransaction = privGetEeaTransactionCountTransaction; - } - - @Override - public void verify(final Node node) { - try { - node.execute(privGetEeaTransactionCountTransaction); - } catch (final Exception e) { - assertThat(e).isInstanceOf(ClientConnectionException.class); - } - } -} diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java deleted file mode 100644 index 16ad88fdd1d..00000000000 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/fail/PrivGetTransactionCountFailEnclaveKeyNotInGroup.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.tests.acceptance.dsl.condition.priv.fail; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - -import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; -import org.hyperledger.besu.tests.acceptance.dsl.node.Node; -import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetTransactionCountTransaction; - -import org.web3j.protocol.exceptions.ClientConnectionException; - -public class PrivGetTransactionCountFailEnclaveKeyNotInGroup implements Condition { - - private final PrivGetTransactionCountTransaction privGetTransactionCountTransaction; - - public PrivGetTransactionCountFailEnclaveKeyNotInGroup( - final PrivGetTransactionCountTransaction privGetTransactionCountTransaction) { - this.privGetTransactionCountTransaction = privGetTransactionCountTransaction; - } - - @Override - public void verify(final Node node) { - try { - node.execute(privGetTransactionCountTransaction); - } catch (final Exception e) { - assertThat(e).isInstanceOf(ClientConnectionException.class); - } - } -} diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyFailAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java similarity index 76% rename from acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyFailAcceptanceTest.java rename to acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java index f44525f5154..70f7c9c1676 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyFailAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.crypto.SECP256K1; import org.hyperledger.besu.enclave.types.PrivacyGroup; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; import org.hyperledger.besu.ethereum.core.Address; import org.hyperledger.besu.ethereum.core.Wei; import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; @@ -31,6 +32,7 @@ import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.Cluster; import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfiguration; import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; import java.math.BigInteger; import java.util.List; @@ -44,7 +46,7 @@ import org.junit.Rule; import org.junit.Test; -public class MultiTenancyFailAcceptanceTest extends AcceptanceTestBase { +public class MultiTenancyValidationFailAcceptanceTest extends AcceptanceTestBase { private BesuNode node; private final ObjectMapper mapper = new ObjectMapper(); private Cluster multiTenancyCluster; @@ -87,31 +89,39 @@ public void sendTransactionShouldFailWhenPrivateFromNotMatchEnclaveKey() final PrivateTransaction validSignedPrivateTransaction = getValidSignedPrivateTransaction(senderAddress, OTHER_ENCLAVE_KEY); retrievePrivacyGroupEnclaveStub(); - node.verify( - priv.eeaSendRawTransactionPrivateFromNotMatchEnclaveKey( - getRLPOutput(validSignedPrivateTransaction).encoded().toHexString())); + final Transaction transaction = + privacyTransactions.sendRawTransaction( + getRLPOutput(validSignedPrivateTransaction).encoded().toHexString()); + node.verify(priv.multiTenancyValidationFail(transaction, JsonRpcError.ENCLAVE_ERROR)); } - @Test - public void sendTransactionShouldFailWhenPrivacyGroupDoesNotContainEnclaveKey() throws JsonProcessingException { - final PrivateTransaction validSignedPrivateTransaction = - getValidSignedPrivateTransaction(senderAddress, ENCLAVE_KEY); - retrievePrivacyGroupEnclaveStub(); - node.verify( - priv.eeaSendRawTransactionPrivateFromNotMatchEnclaveKey( - getRLPOutput(validSignedPrivateTransaction).encoded().toHexString())); - } + @Test + public void sendTransactionShouldFailWhenPrivacyGroupDoesNotContainEnclaveKey() + throws JsonProcessingException { + final PrivateTransaction validSignedPrivateTransaction = + getValidSignedPrivateTransaction(senderAddress, ENCLAVE_KEY); + retrievePrivacyGroupEnclaveStub(); + final Transaction transaction = + privacyTransactions.sendRawTransaction( + getRLPOutput(validSignedPrivateTransaction).encoded().toHexString()); + node.verify(priv.multiTenancyValidationFail(transaction, JsonRpcError.ENCLAVE_ERROR)); + } @Test public void deletePrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() throws JsonProcessingException { retrievePrivacyGroupEnclaveStub(); - node.verify(priv.deletePrivacyGroupFailEnclaveKeyNotInGroup(PRIVACY_GROUP_ID)); + final Transaction transaction = privacyTransactions.deletePrivacyGroup(PRIVACY_GROUP_ID); + node.verify( + priv.multiTenancyValidationFail(transaction, JsonRpcError.DELETE_PRIVACY_GROUP_ERROR)); } @Test public void findPrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() { - node.verify(priv.findPrivacyGroupFailEnclaveKeyNotInGroup(OTHER_ENCLAVE_KEY)); + final Transaction transaction = + privacyTransactions.findPrivacyGroup(new String[] {OTHER_ENCLAVE_KEY}); + node.verify( + priv.multiTenancyValidationFail(transaction, JsonRpcError.FIND_PRIVACY_GROUP_ERROR)); } @Test @@ -119,9 +129,11 @@ public void determineEeaNonceShouldFailWhenPrivateFromNotMatchEnclaveKey() { final String accountAddress = Address.ZERO.toHexString(); final String senderAddressBase64 = Bytes.fromHexString(accountAddress).toBase64String(); final String[] privateFor = {senderAddressBase64}; + final Transaction transaction = + privacyTransactions.getEeaTransactionCount(accountAddress, OTHER_ENCLAVE_KEY, privateFor); node.verify( - priv.getEeaTransactionCountFailPrivateFromNotMatchEnclaveKey( - accountAddress, OTHER_ENCLAVE_KEY, privateFor)); + priv.multiTenancyValidationFail( + transaction, JsonRpcError.GET_PRIVATE_TRANSACTION_NONCE_ERROR)); } @Test @@ -129,9 +141,11 @@ public void determineBesuNonceShouldFailWhenEnclaveKeyNotInPrivacyGroup() throws JsonProcessingException { retrievePrivacyGroupEnclaveStub(); final String accountAddress = Address.ZERO.toHexString(); + final Transaction transaction = + privacyTransactions.getTransactionCount(accountAddress, PRIVACY_GROUP_ID); node.verify( - priv.getTransactionCountFailWhenEnclaveKeyNotInPrivacyGroup( - accountAddress, PRIVACY_GROUP_ID)); + priv.multiTenancyValidationFail( + transaction, JsonRpcError.GET_PRIVATE_TRANSACTION_NONCE_ERROR)); } private void retrievePrivacyGroupEnclaveStub() throws JsonProcessingException { From e335ca8e048d0d67f4066a4bfaf3d5d9caf343ae Mon Sep 17 00:00:00 2001 From: Mark Terry Date: Fri, 14 Feb 2020 10:00:18 +1000 Subject: [PATCH 3/4] [PIE-1798] PR fixes. Signed-off-by: Mark Terry --- ...ationFail.java => ExpectJsonRpcError.java} | 4 +-- .../dsl/condition/priv/PrivConditions.java | 2 +- .../MultiTenancyAcceptanceTest.java | 5 ++- ...tiTenancyValidationFailAcceptanceTest.java | 35 ++++++++++--------- 4 files changed, 24 insertions(+), 22 deletions(-) rename acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/{MultiTenancyValidationFail.java => ExpectJsonRpcError.java} (91%) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/MultiTenancyValidationFail.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/ExpectJsonRpcError.java similarity index 91% rename from acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/MultiTenancyValidationFail.java rename to acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/ExpectJsonRpcError.java index 14956a25f0b..0fd0b970ebe 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/MultiTenancyValidationFail.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/ExpectJsonRpcError.java @@ -24,12 +24,12 @@ import org.assertj.core.api.Assertions; import org.web3j.protocol.exceptions.ClientConnectionException; -public class MultiTenancyValidationFail implements Condition { +public class ExpectJsonRpcError implements Condition { private final Transaction transaction; private final JsonRpcError error; - public MultiTenancyValidationFail(final Transaction transaction, final JsonRpcError error) { + public ExpectJsonRpcError(final Transaction transaction, final JsonRpcError error) { this.transaction = transaction; this.error = error; } diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java index 815a3525f84..043e00a81cb 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/priv/PrivConditions.java @@ -95,6 +95,6 @@ public Condition getTransactionReceipt(final Hash transactionHash) { public Condition multiTenancyValidationFail( final Transaction transaction, final JsonRpcError error) { - return new MultiTenancyValidationFail(transaction, error); + return new ExpectJsonRpcError(transaction, error); } } diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java index 0c873402c2a..83aed561c28 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java @@ -56,7 +56,6 @@ public class MultiTenancyAcceptanceTest extends AcceptanceTestBase { private final ObjectMapper mapper = new ObjectMapper(); private Cluster multiTenancyCluster; - private static final int ENCLAVE_PORT = 1080; private static final String PRIVACY_GROUP_ID = "Z3JvdXBJZA=="; private static final String ENCLAVE_KEY = "A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; private static final String KEY1 = "sgFkVOyFndZe/5SAZJO5UYbrl7pezHetveriBBWWnE8="; @@ -65,7 +64,7 @@ public class MultiTenancyAcceptanceTest extends AcceptanceTestBase { private final Address senderAddress = Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); - @Rule public WireMockRule wireMockRule = new WireMockRule(options().port(ENCLAVE_PORT)); + @Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort()); @Before public void setUp() throws Exception { @@ -75,7 +74,7 @@ public void setUp() throws Exception { node = besu.createNodeWithMultiTenantedPrivacy( "node1", - "http://127.0.0.1:" + ENCLAVE_PORT, + "http://127.0.0.1:" + wireMockRule.port(), "authentication/auth_priv.toml", "authentication/auth_priv_key"); multiTenancyCluster.start(node); diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java index 70f7c9c1676..4af82a251c0 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.enclave.types.PrivacyGroup; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; import org.hyperledger.besu.ethereum.core.Address; +import org.hyperledger.besu.ethereum.core.Hash; import org.hyperledger.besu.ethereum.core.Wei; import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; import org.hyperledger.besu.ethereum.privacy.Restriction; @@ -51,14 +52,14 @@ public class MultiTenancyValidationFailAcceptanceTest extends AcceptanceTestBase private final ObjectMapper mapper = new ObjectMapper(); private Cluster multiTenancyCluster; - private static final int ENCLAVE_PORT = 1080; private static final String PRIVACY_GROUP_ID = "Z3JvdXBJZA=="; - private static final String ENCLAVE_KEY = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; - private static final String OTHER_ENCLAVE_KEY = "A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; + private static final String ENCLAVE_PUBLIC_KEY = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; + private static final String OTHER_ENCLAVE_PUBLIC_KEY = + "A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; private final Address senderAddress = Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); - @Rule public WireMockRule wireMockRule = new WireMockRule(options().port(ENCLAVE_PORT)); + @Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort()); @Before public void setUp() throws Exception { @@ -68,7 +69,7 @@ public void setUp() throws Exception { node = besu.createNodeWithMultiTenantedPrivacy( "node1", - "http://127.0.0.1:" + ENCLAVE_PORT, + "http://127.0.0.1:" + wireMockRule.port(), "authentication/auth_priv.toml", "authentication/auth_priv_key"); multiTenancyCluster.start(node); @@ -87,9 +88,9 @@ public void tearDown() { public void sendTransactionShouldFailWhenPrivateFromNotMatchEnclaveKey() throws JsonProcessingException { final PrivateTransaction validSignedPrivateTransaction = - getValidSignedPrivateTransaction(senderAddress, OTHER_ENCLAVE_KEY); + getValidSignedPrivateTransaction(senderAddress, OTHER_ENCLAVE_PUBLIC_KEY); retrievePrivacyGroupEnclaveStub(); - final Transaction transaction = + final Transaction transaction = privacyTransactions.sendRawTransaction( getRLPOutput(validSignedPrivateTransaction).encoded().toHexString()); node.verify(priv.multiTenancyValidationFail(transaction, JsonRpcError.ENCLAVE_ERROR)); @@ -99,9 +100,9 @@ public void sendTransactionShouldFailWhenPrivateFromNotMatchEnclaveKey() public void sendTransactionShouldFailWhenPrivacyGroupDoesNotContainEnclaveKey() throws JsonProcessingException { final PrivateTransaction validSignedPrivateTransaction = - getValidSignedPrivateTransaction(senderAddress, ENCLAVE_KEY); + getValidSignedPrivateTransaction(senderAddress, ENCLAVE_PUBLIC_KEY); retrievePrivacyGroupEnclaveStub(); - final Transaction transaction = + final Transaction transaction = privacyTransactions.sendRawTransaction( getRLPOutput(validSignedPrivateTransaction).encoded().toHexString()); node.verify(priv.multiTenancyValidationFail(transaction, JsonRpcError.ENCLAVE_ERROR)); @@ -111,15 +112,16 @@ public void sendTransactionShouldFailWhenPrivacyGroupDoesNotContainEnclaveKey() public void deletePrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() throws JsonProcessingException { retrievePrivacyGroupEnclaveStub(); - final Transaction transaction = privacyTransactions.deletePrivacyGroup(PRIVACY_GROUP_ID); + final Transaction transaction = + privacyTransactions.deletePrivacyGroup(PRIVACY_GROUP_ID); node.verify( priv.multiTenancyValidationFail(transaction, JsonRpcError.DELETE_PRIVACY_GROUP_ERROR)); } @Test public void findPrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() { - final Transaction transaction = - privacyTransactions.findPrivacyGroup(new String[] {OTHER_ENCLAVE_KEY}); + final Transaction transaction = + privacyTransactions.findPrivacyGroup(new String[] {OTHER_ENCLAVE_PUBLIC_KEY}); node.verify( priv.multiTenancyValidationFail(transaction, JsonRpcError.FIND_PRIVACY_GROUP_ERROR)); } @@ -129,8 +131,9 @@ public void determineEeaNonceShouldFailWhenPrivateFromNotMatchEnclaveKey() { final String accountAddress = Address.ZERO.toHexString(); final String senderAddressBase64 = Bytes.fromHexString(accountAddress).toBase64String(); final String[] privateFor = {senderAddressBase64}; - final Transaction transaction = - privacyTransactions.getEeaTransactionCount(accountAddress, OTHER_ENCLAVE_KEY, privateFor); + final Transaction transaction = + privacyTransactions.getEeaTransactionCount( + accountAddress, OTHER_ENCLAVE_PUBLIC_KEY, privateFor); node.verify( priv.multiTenancyValidationFail( transaction, JsonRpcError.GET_PRIVATE_TRANSACTION_NONCE_ERROR)); @@ -141,7 +144,7 @@ public void determineBesuNonceShouldFailWhenEnclaveKeyNotInPrivacyGroup() throws JsonProcessingException { retrievePrivacyGroupEnclaveStub(); final String accountAddress = Address.ZERO.toHexString(); - final Transaction transaction = + final Transaction transaction = privacyTransactions.getTransactionCount(accountAddress, PRIVACY_GROUP_ID); node.verify( priv.multiTenancyValidationFail( @@ -151,7 +154,7 @@ public void determineBesuNonceShouldFailWhenEnclaveKeyNotInPrivacyGroup() private void retrievePrivacyGroupEnclaveStub() throws JsonProcessingException { final String retrieveGroupResponse = mapper.writeValueAsString( - testPrivacyGroup(List.of(OTHER_ENCLAVE_KEY), PrivacyGroup.Type.PANTHEON)); + testPrivacyGroup(List.of(OTHER_ENCLAVE_PUBLIC_KEY), PrivacyGroup.Type.PANTHEON)); stubFor(post("/retrievePrivacyGroup").willReturn(ok(retrieveGroupResponse))); } From ce1317d55acd277ffd0110564ff6543e29e93f2f Mon Sep 17 00:00:00 2001 From: Mark Terry Date: Fri, 14 Feb 2020 16:45:52 +1000 Subject: [PATCH 4/4] [PIE-1798] Rawtypes fix. Signed-off-by: Mark Terry --- .../MultiTenancyValidationFailAcceptanceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java index c6d6ca59708..88df1930a6e 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java @@ -116,7 +116,7 @@ public void distributeRawTransactionShouldFailWhenPrivateFromNotMatchEnclaveKey( final Address senderAddress = Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); - final Transaction transaction = + final Transaction transaction = privacyTransactions.distributeRawTransaction( getRLPOutput(getValidSignedPrivateTransaction(senderAddress, OTHER_ENCLAVE_PUBLIC_KEY)) .encoded() @@ -132,7 +132,7 @@ public void distributeRawTransactionShouldFailWhenPrivacyGroupDoesNotContainEncl retrievePrivacyGroupEnclaveStub(); - final Transaction transaction = + final Transaction transaction = privacyTransactions.distributeRawTransaction( getRLPOutput(getValidSignedPrivateTransaction(senderAddress, ENCLAVE_PUBLIC_KEY)) .encoded()