use of com.quorum.tessera.enclave.PayloadEncoder in project tessera by ConsenSys.
the class EncryptedTransactionDAOTest method saveTransactionWithCallbackRuntimeException.
@Test
public void saveTransactionWithCallbackRuntimeException() throws Exception {
PayloadEncoder payloadEncoder = mock(PayloadEncoder.class);
final byte[] payloadData = "PAYLOADATA".getBytes();
EncodedPayload encodedPayload = mock(EncodedPayload.class);
when(payloadEncoder.encode(encodedPayload)).thenReturn(payloadData);
when(payloadEncoder.decode(payloadData)).thenReturn(encodedPayload);
try (var createEncoderFunction = mockStatic(PayloadEncoder.class)) {
createEncoderFunction.when(() -> PayloadEncoder.create(EncodedPayloadCodec.current())).thenReturn(payloadEncoder);
MessageHash transactionHash = new MessageHash(UUID.randomUUID().toString().getBytes());
EncryptedTransaction transaction = new EncryptedTransaction();
transaction.setHash(transactionHash);
transaction.setPayload(encodedPayload);
Callable<Void> callback = mock(Callable.class);
when(callback.call()).thenThrow(new RuntimeException("OUCH"));
try {
encryptedTransactionDAO.save(transaction, callback);
failBecauseExceptionWasNotThrown(RuntimeException.class);
} catch (RuntimeException ex) {
assertThat(ex).isNotNull().hasMessageContaining("OUCH");
}
EntityManager entityManager = entityManagerFactory.createEntityManager();
final EncryptedTransaction result = entityManager.find(EncryptedTransaction.class, transactionHash);
assertThat(result).isNull();
verify(callback).call();
}
verify(payloadEncoder).encode(encodedPayload);
verifyNoMoreInteractions(payloadEncoder);
}
use of com.quorum.tessera.enclave.PayloadEncoder in project tessera by ConsenSys.
the class EncryptedTransactionDAOTest method cannotPersistMultipleOfSameHash.
@Test
public void cannotPersistMultipleOfSameHash() {
PayloadEncoder payloadEncoder = mock(PayloadEncoder.class);
final byte[] payloadData = "PAYLOADATA".getBytes();
EncodedPayload encodedPayload = mock(EncodedPayload.class);
when(payloadEncoder.encode(encodedPayload)).thenReturn(payloadData);
try (var createEncoderFunction = mockStatic(PayloadEncoder.class)) {
createEncoderFunction.when(() -> PayloadEncoder.create(EncodedPayloadCodec.current())).thenReturn(payloadEncoder);
final MessageHash messageHash = new MessageHash(new byte[] { 1 });
final EncryptedTransaction encryptedTransaction = new EncryptedTransaction();
encryptedTransaction.setPayload(encodedPayload);
encryptedTransaction.setHash(messageHash);
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(encryptedTransaction);
entityManager.getTransaction().commit();
final EncryptedTransaction duplicateTransaction = new EncryptedTransaction();
duplicateTransaction.setPayload(encodedPayload);
duplicateTransaction.setHash(messageHash);
try {
encryptedTransactionDAO.save(encryptedTransaction);
failBecauseExceptionWasNotThrown(PersistenceException.class);
} catch (PersistenceException ex) {
assertThat(ex).isInstanceOf(PersistenceException.class).hasMessageContaining(testConfig.getUniqueConstraintViolationMessage());
}
verify(payloadEncoder, times(2)).encode(encodedPayload);
verifyNoMoreInteractions(payloadEncoder);
}
}
use of com.quorum.tessera.enclave.PayloadEncoder in project tessera by ConsenSys.
the class ResendAllIT method transactionsAreReconstructedFromMultipleParties.
@Test
public void transactionsAreReconstructedFromMultipleParties() throws UnsupportedEncodingException, SQLException {
// setup (sending in a tx)
Response sendRawResponse = partyOne.getRestClient().target(partyOne.getQ2TUri()).path("/sendraw").request().header("c11n-from", partyOne.getPublicKey()).header("c11n-to", partyTwo.getPublicKey() + "," + partyThree.getPublicKey()).post(Entity.entity(transactionData, MediaType.APPLICATION_OCTET_STREAM));
URI location = sendRawResponse.getLocation();
String hash = sendRawResponse.readEntity(String.class);
final String encodedHash = URLEncoder.encode(hash, UTF_8.toString());
// delete it from the sender node
final Response deleteReq = partyOne.getRestClient().target(location).request().delete();
assertThat(deleteReq).isNotNull();
assertThat(deleteReq.getStatus()).isEqualTo(204);
// check it is deleted
final Response deleteCheck = partyOne.getRestClient().target(partyOne.getQ2TUri()).path("transaction").path(encodedHash).request().get();
assertThat(deleteCheck).isNotNull();
assertThat(deleteCheck.getStatus()).isEqualTo(404);
// request resend from recipients
final ResendRequest req = new ResendRequest();
req.setType(RESEND_ALL_VALUE);
req.setPublicKey(partyOne.getPublicKey());
final Response resendRequest = vanillaHttpOnlyClient.target(partyTwo.getP2PUri()).path(RESEND_PATH).request().buildPost(Entity.entity(req, MediaType.APPLICATION_JSON_TYPE)).invoke();
assertThat(resendRequest).isNotNull();
assertThat(resendRequest.getStatus()).isEqualTo(200);
final Response resendRequestNode3 = vanillaHttpOnlyClient.target(partyThree.getP2PUri()).path(RESEND_PATH).request().buildPost(Entity.entity(req, MediaType.APPLICATION_JSON_TYPE)).invoke();
assertThat(resendRequestNode3).isNotNull();
assertThat(resendRequestNode3.getStatus()).isEqualTo(200);
final String fetch = "SELECT ENCODED_PAYLOAD, PAYLOAD_CODEC FROM ENCRYPTED_TRANSACTION WHERE HASH = ?";
final Connection databaseConnection = PartyHelper.create().findByPublicKey(partyOne.getPublicKey()).getDatabaseConnection();
try (PreparedStatement statement = databaseConnection.prepareStatement(fetch)) {
statement.setBytes(1, Base64.getDecoder().decode(hash));
try (ResultSet rs = statement.executeQuery()) {
assertThat(rs.next()).isTrue();
final byte[] output = rs.getBytes(1);
final EncodedPayloadCodec codec = EncodedPayloadCodec.valueOf(rs.getString(2));
final PayloadEncoder encoderToUse = PayloadEncoder.create(codec);
final EncodedPayload payload = encoderToUse.decode(output);
assertThat(payload.getRecipientKeys()).hasSize(3);
assertThat(payload.getSenderKey().encodeToBase64()).isEqualTo(partyOne.getPublicKey());
assertThat(payload.getRecipientBoxes()).hasSize(3);
}
}
}
use of com.quorum.tessera.enclave.PayloadEncoder in project tessera by ConsenSys.
the class RestPayloadPublisher method publishPayload.
@Override
public void publishPayload(EncodedPayload payload, PublicKey recipientKey) {
final NodeInfo remoteNodeInfo = discovery.getRemoteNodeInfo(recipientKey);
final Set<String> supportedApiVersions = remoteNodeInfo.supportedApiVersions();
final EncodedPayloadCodec preferredCodec = EncodedPayloadCodec.getPreferredCodec(supportedApiVersions);
final PayloadEncoder payloadEncoder = PayloadEncoder.create(preferredCodec);
if (PrivacyMode.STANDARD_PRIVATE != payload.getPrivacyMode() && !supportedApiVersions.contains(EnhancedPrivacyVersion.API_VERSION_2)) {
throw new EnhancedPrivacyNotSupportedException("Transactions with enhanced privacy is not currently supported on recipient " + recipientKey.encodeToBase64());
}
if (PrivacyMode.MANDATORY_RECIPIENTS == payload.getPrivacyMode() && !supportedApiVersions.contains(MandatoryRecipientsVersion.API_VERSION_4)) {
throw new MandatoryRecipientsNotSupportedException("Transactions with mandatory recipients are not currently supported on recipient " + recipientKey.encodeToBase64());
}
final String targetUrl = remoteNodeInfo.getUrl();
LOGGER.info("Publishing message to {}", targetUrl);
final byte[] encoded = payloadEncoder.encode(payload);
try (Response response = client.target(targetUrl).path("/push").request().post(Entity.entity(encoded, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
if (Response.Status.OK.getStatusCode() != response.getStatus() && Response.Status.CREATED.getStatusCode() != response.getStatus()) {
throw new PublishPayloadException("Unable to push payload to recipient url " + targetUrl);
}
LOGGER.info("Published to {}", targetUrl);
} catch (ProcessingException ex) {
LOGGER.debug("", ex);
throw new NodeOfflineException(URI.create(targetUrl));
}
}
use of com.quorum.tessera.enclave.PayloadEncoder in project tessera by ConsenSys.
the class EncryptedTransactionListener method onUpdate.
@PreUpdate
public void onUpdate(EncryptedTransaction encryptedTransaction) {
LOGGER.debug("onUpdate {}", encryptedTransaction);
final EncodedPayload encodedPayload = encryptedTransaction.getPayload();
final EncodedPayloadCodec encodedPayloadCodec = encryptedTransaction.getEncodedPayloadCodec();
final PayloadEncoder payloadEncoder = PayloadEncoder.create(encodedPayloadCodec);
final byte[] encodedPayloadData = payloadEncoder.encode(encodedPayload);
encryptedTransaction.setEncodedPayload(encodedPayloadData);
}
Aggregations