[
https://issues.apache.org/jira/browse/ARTEMIS-1545?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16631603#comment-16631603
]
ASF GitHub Bot commented on ARTEMIS-1545:
-----------------------------------------
Github user gemmellr commented on a diff in the pull request:
https://github.com/apache/activemq-artemis/pull/2187#discussion_r221189768
--- Diff:
artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/SendAcknowledgementHandler.java
---
@@ -41,4 +41,13 @@
* @param message message sent asynchronously
*/
void sendAcknowledged(Message message);
+
+ default void sendFailed(Message message, Exception e) {
+ /**
+ * By default ignore failures to preserve compatibility with
existing implementations.
+ * If the message makes it to the broker and a failure occurs
sendAcknowledge() will
--- End diff --
Is this actually true? From skimming the diff it seems like it may not be
as there are some if-else sections added that call one of the handler methods
only. Unless somewhere else is also calling the sendAcknowledged method
(possibly in duplicate?) then it seems if only the failure method gets called,
and this default method drops it, that would mean an existing listener that
doesn't implement sendFailed then wont see anything at all now. IF that is the
case it suggests some tests are missing.
Should this default method impl perhaps be calling sendAcknowledged()?
(uglier alternative, the calling code could check the sendFailed method is
actually implemented and decide which to call)
> JMS MessageProducer fails to expose exception on send when message is sent
> non-persistent, but not authorised
> -------------------------------------------------------------------------------------------------------------
>
> Key: ARTEMIS-1545
> URL: https://issues.apache.org/jira/browse/ARTEMIS-1545
> Project: ActiveMQ Artemis
> Issue Type: Bug
> Reporter: Michael Andre Pearce
> Priority: Major
>
> When sending persistent, behaviour is blocking and a Security exception is
> thrown. The same behaviour that the client is exposed to the client when
> sending non-persistent, so that a client could log or take action
> asynchronously.
> This can be recreated easily by the following:
> Add the following security section , that means guest is not auth'd to send
> to "guest.cannot.send"
> activemq-artemis/tests/jms-tests/src/test/resources/broker.xml
> <security-setting match="guest.cannot.send">
> <permission type="createDurableQueue" roles="guest,def"/>
> <permission type="deleteDurableQueue" roles="guest,def"/>
> <permission type="createNonDurableQueue" roles="guest,def"/>
> <permission type="deleteNonDurableQueue" roles="guest,def"/>
> <permission type="consume" roles="guest,def"/>
> <permission type="browse" roles="guest,def"/>
> <permission type="send" roles="def"/>
> </security-setting>
> Then add the following tests to this test (first is proving exception
> correctly is thrown when persistent is sent using jms api, and second shows
> behaviour difference and no error):
> activemq-artemis/tests/jms-tests/src/test/java/org/apache/activemq/artemis/jms/tests/SecurityTest.java
> /**
> * Login with valid user and password
> * But try send to address not authorised - Persistent
> * Should not allow and should throw exception
> */
> @Test
> public void testLoginValidUserAndPasswordButNotAuthorisedToSend() throws
> Exception {
> ConnectionFactory connectionFactory = new
> ActiveMQConnectionFactory("tcp://localhost:61616");
> Connection connection = connectionFactory.createConnection("guest",
> "guest");
> Session session = connection.createSession();
> Destination destination = session.createQueue("guest.cannot.send");
> MessageProducer messageProducer = session.createProducer(destination);
> try {
> messageProducer.send(session.createTextMessage("hello"));
> fail("JMSSecurityException expected as guest is not allowed to
> send");
> } catch (JMSSecurityException activeMQSecurityException){
> //pass
> }
> connection.close();
> }
> /**
> * Login with valid user and password
> * But try send to address not authorised - Non Persistent.
> * Should have same behaviour as Persistent with exception on send.
> */
> @Test
> public void
> testLoginValidUserAndPasswordButNotAuthorisedToSendNonPersistent() throws
> Exception {
> ConnectionFactory connectionFactory = new
> ActiveMQConnectionFactory("tcp://localhost:61616");
> Connection connection = connectionFactory.createConnection("guest",
> "guest");
> Session session = connection.createSession();
> Destination destination = session.createQueue("guest.cannot.send");
> MessageProducer messageProducer = session.createProducer(destination);
> messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
> try {
> messageProducer.send(session.createTextMessage("hello"));
> fail("JMSSecurityException expected as guest is not allowed to
> send");
> } catch (JMSSecurityException activeMQSecurityException){
> //pass
> }
> connection.close();
> }
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)