This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/master by this push:
     new 959c38b  ARTEMIS-2352 - Add the ability to reject messages without a 
validated user set
     new 0a82a5c  This closes #2679
959c38b is described below

commit 959c38bd8deba4d0af804eb693b00ec0f2d0f1ab
Author: Andy <[email protected]>
AuthorDate: Thu May 23 13:39:09 2019 +0100

    ARTEMIS-2352 - Add the ability to reject messages without a validated user 
set
    
    https://issues.apache.org/jira/browse/ARTEMIS-2352
---
 .../api/config/ActiveMQDefaultConfiguration.java   |   7 ++
 .../artemis/core/config/Configuration.java         |   4 +
 .../core/config/impl/ConfigurationImpl.java        |  13 ++
 .../deployers/impl/FileConfigurationParser.java    |   2 +
 .../artemis/core/server/ActiveMQMessageBundle.java |   3 +
 .../core/server/impl/ServerSessionImpl.java        |   4 +
 .../resources/schema/artemis-configuration.xsd     |   8 ++
 .../core/config/impl/FileConfigurationTest.java    |   1 +
 .../resources/ConfigurationTest-full-config.xml    |   1 +
 .../ConfigurationTest-xinclude-config.xml          |   1 +
 .../integration/security/JMSXUserIDPluginTest.java | 138 +++++++++++++++++++++
 .../security/RejectValidatedUserTest.java          |  90 ++++++++++++++
 12 files changed, 272 insertions(+)

diff --git 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
index 8547414..543dff0 100644
--- 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
+++ 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
@@ -421,6 +421,9 @@ public final class ActiveMQDefaultConfiguration {
    // Will the broker populate the message with the name of the validated user
    private static boolean DEFAULT_POPULATE_VALIDATED_USER = false;
 
+   // Will the broker allow messages with no validated user
+   private static boolean DEFAULT_REJECT_EMPTY_VALIDATED_USER = false;
+
    // its possible that you only want a server to partake in scale down as a 
receiver, via a group. In this case set scale-down to false
    private static boolean DEFAULT_SCALE_DOWN_ENABLED = true;
 
@@ -1252,6 +1255,10 @@ public final class ActiveMQDefaultConfiguration {
       return DEFAULT_POPULATE_VALIDATED_USER;
    }
 
+   public static boolean isDefaultRejectEmptyValidatedUser() {
+      return DEFAULT_REJECT_EMPTY_VALIDATED_USER;
+   }
+
    /**
     * its possible that you only want a server to partake in scale down as a 
receiver, via a group. In this case set scale-down to false
     */
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index 783adca..04a95cb 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -1090,6 +1090,10 @@ public interface Configuration {
 
    Configuration setPopulateValidatedUser(boolean populateValidatedUser);
 
+   boolean isRejectEmptyValidatedUser();
+
+   Configuration setRejectEmptyValidatedUser(boolean rejectEmptyValidatedUser);
+
    /**
     * It will return all the connectors in a toString manner for debug 
purposes.
     */
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 7df8fb1..a6ece62 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -289,6 +289,8 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
 
    protected boolean populateValidatedUser = 
ActiveMQDefaultConfiguration.isDefaultPopulateValidatedUser();
 
+   protected boolean rejectEmptyValidatedUser = 
ActiveMQDefaultConfiguration.isDefaultRejectEmptyValidatedUser();
+
    private long connectionTtlCheckInterval = 
ActiveMQDefaultConfiguration.getDefaultConnectionTtlCheckInterval();
 
    private URL configurationUrl;
@@ -1735,6 +1737,17 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
    }
 
    @Override
+   public boolean isRejectEmptyValidatedUser() {
+      return rejectEmptyValidatedUser;
+   }
+
+   @Override
+   public Configuration setRejectEmptyValidatedUser(boolean 
rejectEmptyValidatedUser) {
+      this.rejectEmptyValidatedUser = rejectEmptyValidatedUser;
+      return this;
+   }
+
+   @Override
    public long getConnectionTtlCheckInterval() {
       return connectionTtlCheckInterval;
    }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index 637e3ac..edd667b 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -373,6 +373,8 @@ public final class FileConfigurationParser extends 
XMLConfigurationUtil {
 
       config.setPopulateValidatedUser(getBoolean(e, "populate-validated-user", 
config.isPopulateValidatedUser()));
 
+      config.setRejectEmptyValidatedUser(getBoolean(e, 
"reject-empty-validated-user", config.isRejectEmptyValidatedUser()));
+
       config.setConnectionTtlCheckInterval(getLong(e, 
"connection-ttl-check-interval", config.getConnectionTtlCheckInterval(), 
Validators.GT_ZERO));
 
       config.setConfigurationFileRefreshPeriod(getLong(e, 
"configuration-file-refresh-period", 
config.getConfigurationFileRefreshPeriod(), Validators.GT_ZERO));
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
index ff92501..930c236 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
@@ -470,4 +470,7 @@ public interface ActiveMQMessageBundle {
 
    @Message(id = 229224, value = "User {0} does not exist", format = 
Message.Format.MESSAGE_FORMAT)
    IllegalArgumentException userDoesNotExist(String user);
+
+   @Message(id = 229225, value = "Validated User is not set", format = 
Message.Format.MESSAGE_FORMAT)
+   ActiveMQIllegalStateException rejectEmptyValidatedUser();
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
index 4f8e514..bcedd1f 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
@@ -2023,6 +2023,10 @@ public class ServerSessionImpl implements ServerSession, 
FailureListener {
          msg.setValidatedUserID(validatedUser);
       }
 
+      if (server.getConfiguration().isRejectEmptyValidatedUser() && 
msg.getValidatedUserID() == null) {
+         throw ActiveMQMessageBundle.BUNDLE.rejectEmptyValidatedUser();
+      }
+
       if (tx == null || autoCommitSends) {
          routingContext.setTransaction(null);
       } else {
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd 
b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 957f8b4..8fc8216 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -396,6 +396,14 @@
             </xsd:annotation>
          </xsd:element>
 
+         <xsd:element name="reject-empty-validated-user" type="xsd:boolean" 
default="false" maxOccurs="1" minOccurs="0">
+            <xsd:annotation>
+               <xsd:documentation>
+                  true means that the server will not allow any message that 
doesn't have a validated user, in JMS this is JMSXUserID
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+
          <xsd:element name="connectors" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index 2e6dd88..f7b5585 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -139,6 +139,7 @@ public class FileConfigurationTest extends 
ConfigurationImplTest {
       Assert.assertEquals(true, conf.isGracefulShutdownEnabled());
       Assert.assertEquals(12345, conf.getGracefulShutdownTimeout());
       Assert.assertEquals(true, conf.isPopulateValidatedUser());
+      Assert.assertEquals(false, conf.isRejectEmptyValidatedUser());
       Assert.assertEquals(98765, conf.getConnectionTtlCheckInterval());
       Assert.assertEquals(1234567, conf.getConfigurationFileRefreshPeriod());
 
diff --git 
a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml 
b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index d27e7f4..4bc7679 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -53,6 +53,7 @@
       <journal-datasync>false</journal-datasync>
       <persist-id-cache>true</persist-id-cache>
       <populate-validated-user>true</populate-validated-user>
+      <reject-empty-validated-user>false</reject-empty-validated-user>
       <connection-ttl-check-interval>98765</connection-ttl-check-interval>
       
<configuration-file-refresh-period>1234567</configuration-file-refresh-period>
       <global-max-size>1234567</global-max-size>
diff --git 
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml 
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
index bd647d6..9eef2ac 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
@@ -54,6 +54,7 @@
       <journal-datasync>false</journal-datasync>
       <persist-id-cache>true</persist-id-cache>
       <populate-validated-user>true</populate-validated-user>
+      <reject-empty-validated-user>false</reject-empty-validated-user>
       <connection-ttl-check-interval>98765</connection-ttl-check-interval>
       
<configuration-file-refresh-period>1234567</configuration-file-refresh-period>
       <global-max-size>1234567</global-max-size>
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/security/JMSXUserIDPluginTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/security/JMSXUserIDPluginTest.java
new file mode 100644
index 0000000..fef2874
--- /dev/null
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/security/JMSXUserIDPluginTest.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.activemq.artemis.tests.integration.security;
+
+
+import org.apache.activemq.artemis.api.core.ActiveMQException;
+import org.apache.activemq.artemis.api.core.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.client.ClientConsumer;
+import org.apache.activemq.artemis.api.core.client.ClientMessage;
+import org.apache.activemq.artemis.api.core.client.ClientProducer;
+import org.apache.activemq.artemis.api.core.client.ClientSession;
+import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
+import org.apache.activemq.artemis.api.core.client.ServerLocator;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.ActiveMQServers;
+import org.apache.activemq.artemis.core.server.ServerSession;
+import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerPlugin;
+import org.apache.activemq.artemis.core.transaction.Transaction;
+import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.qpid.jms.JmsConnectionFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.jms.Connection;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import java.util.Map;
+
+public class JMSXUserIDPluginTest extends ActiveMQTestBase {
+
+   private ActiveMQServer server;
+   private SimpleString ADDRESS = new SimpleString("TestQueue");
+
+   @Override
+   @Before
+   public void setUp() throws Exception {
+      super.setUp();
+
+      server = 
addServer(ActiveMQServers.newActiveMQServer(createDefaultNettyConfig(), true));
+
+      JMSXUserIDPlugin plugin = new JMSXUserIDPlugin();
+      plugin.setPopulateValidatedUser("testuser");
+
+      server.registerBrokerPlugin(plugin);
+      server.start();
+      server.createQueue(ADDRESS, RoutingType.ANYCAST, ADDRESS, null, true, 
false);
+   }
+
+   @Test
+   public void testAddValidatedUserCore() throws Exception {
+      ServerLocator locator = createNettyNonHALocator();
+      ClientSessionFactory sf = createSessionFactory(locator);
+      ClientSession session = sf.createSession(false, true, true);
+      ClientProducer producer = session.createProducer(ADDRESS.toString());
+      producer.send(session.createMessage(true));
+      ClientConsumer consumer = session.createConsumer(ADDRESS.toString());
+      session.start();
+      ClientMessage clientMessage = consumer.receiveImmediate();
+      Assert.assertNotNull(clientMessage);
+      Assert.assertEquals(clientMessage.getValidatedUserID(), "testuser");
+   }
+
+   @Test
+   public void testAddValidatedUserAMQP() throws Exception {
+      JmsConnectionFactory factory = new 
JmsConnectionFactory("amqp://127.0.0.1:61616");
+      Connection connection = factory.createConnection();
+      Session session = connection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
+      javax.jms.Queue queue = session.createQueue(ADDRESS.toString());
+      MessageProducer producer = session.createProducer(queue);
+      producer.send(session.createMessage());
+      connection.close();
+
+      server.stop();
+      server.start();
+
+      connection = factory.createConnection();
+      session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+      connection.start();
+      MessageConsumer consumer = session.createConsumer(queue);
+      Message message = consumer.receive(5000);
+      Assert.assertNotNull(message);
+      Assert.assertEquals(message.getStringProperty("_AMQ_VALIDATED_USER"), 
"testuser");
+      connection.close();
+   }
+
+
+   private static class JMSXUserIDPlugin implements ActiveMQServerPlugin {
+
+      private static String POPULATE_VALIDATED_USER = 
"POPULATE_VALIDATED_USER";
+
+      private String populateValidatedUser;
+
+      /**
+       * used to pass configured properties to Plugin
+       *
+       * @param properties
+       */
+      @Override
+      public void init(Map<String, String> properties) {
+         populateValidatedUser = 
properties.getOrDefault(POPULATE_VALIDATED_USER, null);
+      }
+
+      @Override
+      public void beforeSend(ServerSession session, Transaction tx, 
org.apache.activemq.artemis.api.core.Message message, boolean direct, boolean 
noAutoCreateQueue) throws ActiveMQException {
+         if (populateValidatedUser != null && 
!message.containsProperty(org.apache.activemq.artemis.api.core.Message.HDR_VALIDATED_USER))
 {
+            message.messageChanged();
+            
message.putStringProperty(org.apache.activemq.artemis.api.core.Message.HDR_VALIDATED_USER,
 populateValidatedUser);
+         }
+      }
+
+      public String getPopulateValidatedUser() {
+         return populateValidatedUser;
+      }
+
+      public void setPopulateValidatedUser(String populateValidatedUser) {
+         this.populateValidatedUser = populateValidatedUser;
+      }
+   }
+
+}
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/security/RejectValidatedUserTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/security/RejectValidatedUserTest.java
new file mode 100644
index 0000000..996bea4
--- /dev/null
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/security/RejectValidatedUserTest.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.activemq.artemis.tests.integration.security;
+
+import org.apache.activemq.artemis.api.core.ActiveMQIllegalStateException;
+import org.apache.activemq.artemis.api.core.client.ClientMessage;
+import org.apache.activemq.artemis.api.core.client.ClientProducer;
+import org.apache.activemq.artemis.api.core.client.ClientSession;
+import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
+import org.apache.activemq.artemis.api.core.client.ServerLocator;
+import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.ActiveMQServers;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
+import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.jms.Connection;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+public class RejectValidatedUserTest  extends ActiveMQTestBase {
+
+   private static final String ADDRESS = "TestQueue";
+   private ActiveMQServer server;
+
+   @Override
+   public void setUp() throws Exception {
+      super.setUp();
+      server = 
addServer(ActiveMQServers.newActiveMQServer(createDefaultInVMConfig(), false));
+      server.getConfiguration().setRejectEmptyValidatedUser(true);
+      server.start();
+   }
+
+   @Test
+   public void testRejectException() throws Exception {
+      ServerLocator locator = createInVMNonHALocator();
+      ClientSessionFactory sessionFactory = locator.createSessionFactory();
+      ClientSession session = sessionFactory.createSession();
+      ClientProducer producer = session.createProducer(ADDRESS);
+      try {
+         producer.send(session.createMessage(true));
+         Assert.fail("Should throw exception");
+      } catch (ActiveMQIllegalStateException e) {
+         //pass
+      }
+      locator.close();
+   }
+
+   @Test
+   public void testAcceptException() throws Exception {
+      ServerLocator locator = createInVMNonHALocator();
+      ClientSessionFactory sessionFactory = locator.createSessionFactory();
+      ClientSession session = sessionFactory.createSession();
+      ClientProducer producer = session.createProducer(ADDRESS);
+      ClientMessage message = session.createMessage(true);
+      message.setValidatedUserID("testuser");
+      producer.send(message);
+      locator.close();
+   }
+
+   @Test
+   public void testAcceptJMSException() throws Exception {
+      ActiveMQConnectionFactory connectionFactory = 
ActiveMQJMSClient.createConnectionFactory("vm://0", "0");
+      Connection connection = connectionFactory.createConnection();
+      Session session = connection.createSession();
+      Queue queue = session.createQueue(ADDRESS.toString());
+      MessageProducer producer = session.createProducer(queue);
+      Message message = session.createMessage();
+      message.setStringProperty("JMSXUserID", "testuser");
+      producer.send(message);
+   }
+}

Reply via email to