You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Tim Bain <tb...@alumni.duke.edu> on 2018/01/02 05:26:36 UTC

Re: ActiveMQ custom plugin

I spent a little time this evening looking through the ActiveMQ 5.x code
and didn't find an obvious way to hook into the MQTT-specific pieces, so
switching to Artemis may be your best bet.

Tim

On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> I hadn't caught that this question was about making the connection rather
> vs. the first question about sending messages across it; thanks for helping
> me understand your question.
>
> As far as I know, the interception capabilities of 5.x apply only to the
> core broker using the interface you used in the earlier messages in this
> thread, but not to the code that translates non-OpenWire protocols such as
> MQTT into OpenWire. I'll need to spend some time digging through the code
> to make sure there isn't an MQTT plugin capability I don't know about, and
> I probably won't get a chance to do that until the weekend. But unless I
> find something unexpected when I do that digging, what you want may not be
> possible with ActiveMQ 5.x. If as you say Artemis allows you to do
> everything you're trying to do, then switching to it may be a good option.
>
> Tim
>
> On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Yes the question I asked here is not answered earlier. In previous
>> threads/mail focus was on when client was publishing a message on topic the
>> activemq.send method was called to intercept the message before it actually
>> published on topic.
>>
>> Here I am majorly focusing on intercepting mqtt connections, which means
>> intercepting the client request to activemq and Call my plugin there. So
>> which method of activemq can be used here?
>>
>> As I went thru many solutions over internet and see Artemis as an option.
>>
>> I hope I am able to put my point clear now. :) please let me know if more
>> info is needed from my end.
>>
>>
>>
>> Sent from my iPhone
>>
>> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> tbain@alumni.duke.edu>> wrote:
>>
>> Is there some aspect of your question that's not answered by the first
>> 12(!) emails in the thread? I'm not clear why you're asking what appears
>> to
>> be the same question again. If there's some new aspect of the question or
>> something that wasn't previously answered, please highlight what it is.
>>
>> And no, I don't believe that Artemis is required to do what you're trying
>> to do. It might be equally possible to do in Artemis compared to doing in
>> 5.x (I don't know Artemis well enough to comment on whether this can be
>> done in Artemis), but you definitely don't "have to use Artemis here to
>> achieve this."
>>
>> Tim
>>
>> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com>> wrote:
>>
>> hello again,
>>
>> I am asking my question here again if you can possibly help me with a
>> method.
>>
>> 1. Need to intercept the Incoming connections from MQTT clients.
>> User is connecting to activemq broker by hitting on url and sending a
>> TOKEN [(hostname:port) + token]
>>
>> How can we intercept the connections and validate the token sent by mqtt
>> client?
>>
>> I have my own custom plugin that will validate the token. Just Need to
>> know method on which we can call that Plugin.
>>
>> Also do we have to use Artemis here to achieve this?
>>
>> Thanks In Advance
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007, +91-9718483802
>> bharat.gupta@scania.com<ma...@scania.com>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: Tuesday, December 5, 2017 7:29 PM
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: RE: ActiveMQ custom plugin
>>
>> I'd suggest that you store your cache of known credentials in your plugin.
>> I'm not sure that you'd have access to the web session from a plugin,
>> because that's MQTT-specific, so I think your best bet would be to store
>> it
>> in a Map (better: a Guava cache, so you get free age-off behavior) within
>> your plugin.
>>
>> Tim
>>
>> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com>> wrote:
>>
>> Hi Tim,
>>
>> I am having a scenario here. Using custom plugin I am validating my JWT
>> tokens and fetching the claims from it.
>>
>> Claims:
>>
>> {
>>  "unique_name": "gubhpi",
>>  "sub": "gubhpi",
>>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>>  "AdAccount": "bguvvw",
>>  "FunctionalPermissions": "490879",
>>  "UserPermissions": [
>>    "2482503678 <(248)%20250-3678>",
>>    "1006"
>>  ],
>>  "iss": "https://xyz/",
>>  "aud": "58b99b37-db1c78d7fef5",
>>  "exp": 1510240047,
>>  "nbf": 1510236447
>> }
>>
>> From this I need to fetch "AdAccount": "bguvvw", and store it
>> somewhere(please suggest me-- context or session) and when next time user
>> sends me message on activemq using mqtt or web socket I need to check the
>> message header with the users stored in contextsession or from some
>> object.
>> If user is present then we validate else we don’t.
>>
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007, +91-9718483802
>> bharat.gupta@scania.com<ma...@scania.com>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 29 november 2017 04:20
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: RE: ActiveMQ custom plugin
>>
>> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com>> wrote:
>>
>> Hello Tim,
>>
>> Thank you for your help. :)
>>
>> I have used below method to fetch that text from message when client
>> publish on topic and it works.
>>
>> public void send(ProducerBrokerExchange producerExchange, Message
>> messageSend) throws Exception {
>> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>>
>>
>> ((ActiveMQTextMessage)messageSend).getText()
>> It returns the text from web console only.
>>
>>
>> Really appreciate your help here. :)
>>
>>
>>
>> Great, I'm glad I've been able to help.
>>
>> ------------------------------------------------------------
>> ------------------------------------------------------------
>> ------------------------------------------------------------
>> -----------------------
>>
>> Apart from this I have a situation here that when I try to execute below
>> code:
>> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> creating a queue
>> 2. TextMessage claims = session.createTextMessage(payload); ---
>> converting
>> the string to message to send it on above made queue
>> 3. producer.send(dest, claims); --- send the message on
>> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> JWT_PAYLOAD
>> why?
>>
>>
>> What makes you think that this message on an advisory topic was your
>> message instead of a standard advisory message that's sent anytime a
>> non-anonymous producer sends a message? What makes you think that thos
>> message was sent instead of the message you sent to your queue, rather
>> than
>> sent *in addition to* the message on your queue? Can you share
>> before-and-after screenshots of your queue's row on the Queues page of
>> the
>> web console? And were there any warnings or errors logged in the broker's
>> logs when this happened?
>>
>> 4. Before executing producer.send(dest, claims); ----- it is going on
>> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> returning null as it is again checking for Content and data. So my ques
>> is
>> why it is going back again on first line? Why it is not simply putting
>> the
>> data on queue?
>>
>>
>> I didn't understand what you meant by "it is going back again on first
>> line." Are you saying that the broker is putting the original message
>> onto
>> your topic? If so, that's because by calling super.send(), you're
>> allowing
>> the publishing of the original message to the original topic to
>> continue. I
>> advised you to do that because I didn't realize that you wanted to
>> transform the message and publish it to a different destination, but
>> since
>> it seems like you do, I think you don't want to call super.send() after
>> all.
>>
>> If that's not what you meant, then please help me to better understand
>> your
>> question.
>>
>> @Override
>>        public void send(ProducerBrokerExchange producerExchange, Message
>> messageSend) throws Exception {
>> if(messageSend != null)
>> {
>>        if(messageSend.getContent() != null)
>> {
>>        =               byte[] msg = ((ActiveMQMessage)
>> messageSend).getContent().data;
>>
>>                String message = new String(msg);
>>                logger.warn("messageBody::::::::::::::::              "
>> +
>> message);
>>
>>                DecodedJWT jwt = JWT.decode(message);
>>                byte[] contentBytes = String.format("%s.%s",
>> jwt.getHeader(), jwt.getPayload())
>>                                .getBytes(StandardCharsets.UTF_8);
>>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> getSignature());
>>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>>                                + "please enter your key"
>>                                + "-----END PUBLIC KEY-----";
>>
>>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>>
>>                Security.addProvider(new BouncyCastleProvider());
>>                Signature signatureInstance =
>> Signature.getInstance("SHA256withRSA",
>> "BC");
>>                signatureInstance.initVerify(pk);
>>                signatureInstance.update(contentBytes);
>>                boolean result = signatureInstance.verify(
>> signatureBytes);
>>
>>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>>
>>                String payload = new String(pload);
>>                logger.warn("messageBody::::::::::::::::              "
>> +
>> payload);
>>                logger.warn("result::::::::::::::::              " +
>> result);
>>                if (result = true) {
>>
>>                        // Create a ConnectionFactory
>>            ActiveMQConnectionFactory connectionFactory = new
>> ActiveMQConnectionFactory("vm://localhost");
>>
>>            // Create a Connection
>>            javax.jms.Connection jmsConnection = connectionFactory.
>> createConnection();
>>            jmsConnection.start();
>>
>>            // Create a Session
>>            Session session = jmsConnection.createSession(false,
>> Session.AUTO_ACKNOWLEDGE);
>>
>>                Destination dest = session.createQueue("JWT_PAYLOAD");
>>                        MessageProducer producer =
>> session.createProducer(dest);
>>                        producer.setDeliveryMode(
>> DeliveryMode.PERSISTENT);
>>
>>                        TextMessage claims = session.createTextMessage(
>> payload);
>>                        claims.setJMSType("TEXT");
>>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> claims);
>>                        producer.send(dest, claims);
>>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> claims);
>>
>>
>> //
>>                        MessageConsumer consumer =
>> session.createConsumer(dest);
>>                        consumer.setMessageListener(this);
>>
>>                }
>>
>>                else {
>>
>>                        logger.warn("Else Authentication failed. Please
>> send Valid Token");
>>                }
>>
>>                super.send(producerExchange, messageSend);
>>                // getNext().send(producerExchange, messageSend);
>>
>>        }
>>
>>        else
>>        {
>>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>>        }
>>        }
>> else
>> {
>>        logger.fatal("MESSAGE SEND IS NULL");
>> }
>>        }
>>
>>        @Override
>>        public void onMessage(javax.jms.Message message) {
>>                  String messageText = null;
>>                try {
>>                    if (message instanceof TextMessage) {
>>                        TextMessage textMessage = (TextMessage) message;
>>                        messageText = textMessage.getText();
>>                        System.out.println("messageText = " +
>> messageText);
>>                    }
>>                } catch (JMSException e) {
>>                    //Handle the exception appropriately
>>                }
>>        }
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007 <+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> bharat.gupta@scania.com<ma...@scania.com>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 27 november 2017 08:12
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: Re: ActiveMQ custom plugin
>>
>> Thank you for providing that code. I spent some time running your code,
>> and
>> found the following problems with it, which are causing this to not work
>> as
>> you intended:
>>
>>   1. The signature for the send() method is "public void
>>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> throws
>>   Exception," not the signature you had defined. Because your signature
>>   didn't match the method you were trying to override, you weren't
>> actually
>>   overriding a method that would be called when a message was sent, but
>>   instead you were simply defining a public method that nothing ever
>> called.
>>   The compiler would have caught this for you if you'd annotated the
>> method
>>   as @Override; you should be using that annotation for all overriden
>>   methods, for exactly this reason.
>>   2. messageSend.getContent() returns null for the test message I sent
>> via
>>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> returns
>>   the body. I think this same code would work for an MQTT message, but
>> since
>>   I've never used MQTT you'll need to confirm that.
>>   3. I mentioned this earlier, but your send() method needs to call
>>   super.send() at the end, otherwise the broker's not going to process
>> any
>>   messages and you're going to be wondering why the broker "doesn't
>> work."
>>   This doesn't explain why you're not seeing your logging occur, but
>> once
>> we
>>   get past that problem, this is the next issue you're going to hit.
>>
>> Tim
>>
>> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <bharat.gupta@scania.com
>> <ma...@scania.com>>
>> wrote:
>>
>> Hello,
>>
>> MyBroker.java
>>
>> package jwt.validation;
>>
>> import java.util.HashMap;
>> import java.util.Map;
>>
>> import javax.jms.Destination;
>> import javax.jms.ExceptionListener;
>> import javax.jms.JMSException;
>> import javax.jms.MessageConsumer;
>> import javax.jms.Session;
>> import javax.jms.TextMessage;
>>
>> import org.apache.activemq.ActiveMQConnection;
>> import org.apache.activemq.ActiveMQConnectionFactory;
>> import org.apache.activemq.ActiveMQMessageConsumer;
>> import org.apache.activemq.broker.BrokerFilter;
>> import org.apache.activemq.broker.Connection;
>> import org.apache.activemq.broker.ConnectionContext;
>> import org.apache.activemq.broker.ProducerBrokerExchange;
>> import org.apache.activemq.broker.region.Subscription;
>> import org.apache.activemq.command.ActiveMQDestination;
>> import org.apache.activemq.command.ActiveMQMessage;
>> import org.apache.activemq.command.ConnectionInfo;
>> import org.apache.activemq.command.ConsumerInfo;
>> import org.apache.activemq.command.Message;
>> import org.apache.activemq.command.SessionInfo;
>> import org.apache.log4j.Logger;
>>
>>
>> public class MyBroker extends BrokerFilter {
>>
>>                final static Logger logger = Logger.getLogger(MyBroker.
>> class);
>>                private Map<String, String> userMap = new
>> HashMap<String,
>> String>();
>>
>>                public MyBroker(org.apache.activemq.broker.Broker
>> next)
>> {
>>                                super(next);
>>
>>                }
>>
>>
>>
>>                public void send(ProducerBrokerExchange
>> producerExchange,
>> ActiveMQMessage messageSend) throws JMSException
>>                {
>>                                  byte[] messageBytes =
>> messageSend.getContent().data;
>>
>>                                  Message data =
>> messageSend.getMessage();
>>                                  logger.warn("
>> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> + data);
>>                                  String message = new
>> String(messageBytes);
>>                                  logger.warn("messageBody" + message);
>>                                  logger.info<http://logger.info>("messageBody"
>> +
>> message);
>>                                  logger.fatal("messageBody" +
>> message);
>>                                  logger.debug("messageBody" +
>> message);
>>
>>
>>                 }
>>
>>                public void addConnection(ConnectionContext context,
>> ConnectionInfo info)
>>            throws Exception {
>>
>>                                info.getUserName();
>>                                info.toString();
>>
>>
>>                                logger.warn("info1" +
>> info.getUserName());
>>                                logger.fatal("info2" +
>> info.toString());
>>
>>       String token = context.getUserName();
>>       logger.debug("token1" + token);
>>       logger.warn("token2" + token);
>>       logger.fatal("token3" + token);
>>
>>
>>        // Then call your parent
>>        super.addConnection(context, info);
>>    }
>>
>>    public Subscription addConsumer(ConnectionContext context,
>> ConsumerInfo info) throws Exception {
>>
>>
>>
>>        ActiveMQDestination dest = info.getDestination();
>>        Connection conn = context.getConnection();
>>        if (dest != null) {
>>            String destName = info.getDestination().getPhysicalName();
>>            String clientId = context.getClientId();
>>            String allowedDest = userMap.get(clientId);
>>
>>            logger.info<http://logger.info>(">>> Got Consumer Add request
>> { Destination:
>> " +
>> destName
>>                    + ", Remote Address: " + conn.getRemoteAddress()
>>                    + ", ClientID: " + clientId
>>                    + " }");
>>            if (allowedDest != null && (allowedDest.equals("*") ||
>> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>>                logger.info<http://logger.info>(">>> Subscription
>> allowed");
>>            } else {
>>                logger.error(">>> Destination not allowed. Subscription
>> denied!");
>>                throw new Exception(">>> Subscription denied!");
>>            }
>>        } else {
>>            logger.error("<<< Got Consumer Add request from Remote
>> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>>        }
>>        return super.addConsumer(context, info);
>>    }
>> }
>>
>> Sample.java
>>
>> package jwt.validation;
>>
>> import org.apache.activemq.ActiveMQMessageProducer;
>> import org.apache.activemq.broker.Broker;
>> import org.apache.activemq.broker.BrokerPlugin;
>> import org.apache.log4j.Logger;
>>
>> public class Sample  implements BrokerPlugin {
>>
>>                final static Logger logger =
>> Logger.getLogger(Sample.class)
>> ;
>>
>>                public static void main(String[] args) {
>>
>>
>>                }
>>
>>                private void runMe(String parameter){
>>
>>                                if(logger.isDebugEnabled()){
>>                                                logger.debug("This is
>> debug : " + parameter);
>>                                }
>>
>>                                if(logger.isInfoEnabled()){
>>                                                logger.info<http://logger.
>> info>("This is
>> info
>> : " + parameter);
>>                                }
>>
>>                                logger.warn("This is warn : " +
>> parameter);
>>                                logger.error("This is error : " +
>> parameter);
>>                                logger.fatal("This is fatal : " +
>> parameter);
>>
>>                }
>>
>>                public Broker installPlugin(Broker broker) throws
>> Exception {
>>                                Sample sample = new Sample();
>>                                sample.runMe("ActiveMQ Hello");
>>
>>                                return new MyBroker(broker);
>>                }
>>
>>
>> }
>>
>> The above are two classes I have implemented for my custom plugin.
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007, +91-9718483802
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com>
>>
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim
>> Bain
>> Sent: Sunday, November 26, 2017 4:31 AM
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: RE: ActiveMQ custom plugin
>>
>>
>>
>> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com><
>> mailto:
>> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>>
>> hello Tim,
>>
>>
>>
>> My Custom Plugin is getting installed as I am using log4j to print
>> random
>> stuff and its getting printed in logs.
>> Can you please describe in more detail exactly what methods that
>> logging
>> is done in and how it proves that the plugin was actually installed? If
>> (for example) your logging is only in your constructor or your
>> initialization method, that just proves that Spring made your bean, not
>> that it was installed in the broker as a plugin.
>>
>> I am hereby attaching my codes that you can see.
>> Where? All I see is your activemq.xml snippet below, but no actual code
>> for your plugin.
>>
>> activemq.xml configurations:
>>
>> <plugins>
>>
>>                               <bean id="sample"
>>
>>                                class="jwt.validation.Sample"
>>
>>                                xmlns="http://www.
>> springframework.org/schema/beans<http://springframework.org/schema/beans
>> >"/>
>>
>>                               </plugins>
>>
>>
>>
>> Also I would like to explain you my exact requirement.
>>
>>
>>
>> The diagram below shows what I am trying to do it now.
>>
>>
>>
>>
>>
>> [cid:image001.png@01D3658E.4A6B3E20]
>> That sounds like it should be doable via an interceptor based on what I
>> know about them (i.e. the wiki, but no hands-on experience).
>>
>> QUESTIONS:
>>
>>
>>
>> 1.       how can we provide JWT to custom plugin from client?
>> If you have to use MQTT, you'll need to encode it directly into the
>> message body, because that's all MQTT supports. You could for example
>> make
>> a JSON payload with two fields: the JWT and the message body. Or you
>> could
>> switch to OpenWire and put the JWT into a custom header on the message
>> the
>> client is sending.
>>
>> 2.       do we need to store jwt in topic first and then consume it
>> from
>> topic to validate it? (not idle case)
>> You need to put the JWT into the message itself so that your plugin can
>> evaluate the token and then decide what to do with the message based on
>> that evaluation.
>>
>> 3.       can we call restful service from activeMQ broker that can
>> validate token and gives the result back to broker?
>> Yes, as far as I know, you'd be able to do that from within the broker.
>> (I've never done that, but I'm not aware of anything that would prevent
>> you
>> from doing it.)
>>
>> Tim please let me know if I am clear with my requirements. Else we can
>> talk more on call/phone.
>>
>>
>>
>> Thanks in advance
>>
>>
>>
>>
>>
>> Regards,
>>
>> Bharat Gupta
>>
>> Development & Support | Platform Technician, IXCB | Scania IT
>>
>> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <tel:+91%2097184%2083802>
>>
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com>
>>
>>
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> mail.com> [mailto:
>> tbain98@gmail.com<ma...@gmail.com>]
>> On Behalf Of Tim Bain
>> Sent: Friday, November 24, 2017 7:19 PM
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org><mailto:
>> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org><mailto:users-owner@
>> activemq.apache.org<http://activemq.apache.org>
>>
>> Subject: RE: ActiveMQ custom plugin
>>
>>
>>
>> 1. Your send() method needs to call super.send() after doing your
>> custom
>>
>> work, otherwise the message will never be sent to the real Broker
>> object.
>>
>> Please review the wiki page I referred to earlier, which covers how to
>>
>> implement an interceptor.
>>
>>
>>
>> 2. To me it sounds like your plugin isn't getting installed. Do you
>> have
>>
>> any indication that it is, from logs or some other mechanism? And can
>> you
>>
>> please share the code of the class that implements BrokerPlugin, to
>> confirm
>>
>> that your installPlugin() method looks right, and the XML block where
>> you
>>
>> create the plugin bean?
>>
>>
>>
>> Tim
>>
>>
>>
>> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com><
>> mailto:
>> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>>
>>
>>
>> Hello,
>>
>>
>>
>> I tried implementing the method as below:
>>
>>
>>
>>        public void send(ProducerBrokerExchange producerExchange,
>>
>> ActiveMQMessage messageSend) throws JMSException
>>
>>         {
>>
>>                  byte[] messageBytes =
>> messageSend.getContent().data;
>>
>>                  String message = new String(messageBytes);
>>
>>                  logger.info<http://logger.info><http://logger.info>("messageBody"
>> +
>> message);
>>
>>        }
>>
>>
>>
>> Also I am publishing a message on a topic even though this send()
>> method
>>
>> is not been called as logger.info<http://logger.info><http://logger.info>
>> is not getting
>> printed in my Custom
>>
>> Plugin.
>>
>>
>>
>> Could you please help me on this?
>>
>>
>>
>> Regards,
>>
>> Bharat Gupta
>>
>> Development & Support | Platform Technician, IXCB | Scania IT
>>
>> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <tel:+91%2097184%2083802>
>>
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com>
>>
>>
>>
>>
>>
>> -----Original Message-----
>>
>> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> mail.com> [mailto:
>> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>>
>> Sent: Friday, November 24, 2017 7:15 PM
>>
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org><mailto:
>> users@activemq.apache.org<ma...@activemq.apache.org>>>
>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org><mailto:users-owner@
>> activemq.apache.org<http://activemq.apache.org>>
>>
>> Subject: Re: ActiveMQ custom plugin
>>
>>
>>
>> As I said in your other thread, you would do that by implementing
>> code
>> in
>>
>> the send() method of your subclass of BrokerFilter, which you would
>> create
>>
>> and return in your installPlugin() method.
>>
>>
>>
>> Tim
>>
>>
>>
>> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com><
>> mailto:
>> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>>
>>
>>
>> Hello,
>>
>>
>>
>> I have a scenario as follows:
>>
>>
>>
>>
>>
>> 1.       I have Custom Plugins that decrypts the data and validates
>> it.
>>
>>
>>
>> 2.       I am getting Encrypted data (token) from user that need to
>> be
>>
>> decrypted on custom plugin.
>>
>>
>>
>> 3.       Client is accessing the broker using mqtt protocol
>>
>>
>>
>> Need Solution for the following:
>>
>>
>>
>> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>>
>> validate the  data(token) in my custom plugin
>>
>>
>>
>> 2.       How to extract a data what customer is sending? So that I
>> can
>>
>> extract the data, decrypt the message and validate.
>>
>>
>>
>>
>>
>> Implementation so far:
>>
>>
>>
>> 1.       Custom Plugin is ready and JAR has been added in
>> <ActiveMQ>/libs
>>
>>
>>
>> 2.       Added the plugin configuration in activemq.xml
>>
>>
>>
>>
>>
>> Could anyone help me with a solution for the same as it's critical
>> case.
>>
>>
>>
>> Thank you In Advance
>>
>>
>>
>> Regards,
>>
>> Bharat Gupta
>>
>> Development & Support | Platform Technician, IXCB | Scania IT
>>
>> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> <tel:+91%2097184%2083802>
>>
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>>
>>
>>
>>
>>
>>
>>

Re: ActiveMQ custom plugin

Posted by Bruce Snyder <br...@gmail.com>.
Hi Guys,

Can you please remove the users-owner@ from this conversation? There is no
need to continue to include it.

Bruce

On Thu, Feb 1, 2018 at 7:23 AM, Gupta Bharat <bh...@scania.com>
wrote:

> I don't wish to add headers in the message I pasted. This message I am
> getting from user and it is content. Even the tag header is part of
> content. But when I route the message from Active MQ to IBM MQ certain
> attributes like destination topic name and message id need to be added.
>
> Also I am using MQTT client to publish a message on ActiveMQ specifying
> the topic name and message. I need to add that topic name as destination
> and also want to remove JWTtoken from message.
>
> Publication:
> Topic: Demo
> Message: {"header":{"messageId":"fcbef565-18ea-429a-836f-
> 7e24d9b53743","jwtToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
> eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIs
> ImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIs
> IkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAt
> OTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNl
> IjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRB
> Y2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkx
> MDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwi
> aXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoi
> MmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjox
> NTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7Bx
> A6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_
> 0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_
> VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_
> xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_
> LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-
> TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd
> 73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vs
> rcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_
> Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpI
> vI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-
> tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47k
> flNNwt1_QVo","correlId":"","initialMessageid":"fcbef565-
> 18ea-429a-836f-7e24d9b53743","environment":"st5","producerUTCTimestamp":
> 1515677099337,"contractId":"SCCO3822","producerVer":"1.0","messageType":"
> SendChatMessageInConversationMessage","appId":"fma","
> messageTypeVer":"1.0","receivers":[]},"body":{"conversationId":"2b575462-
> 97bd-4e9a-8ac4-6fec793c836a","chatMessageId":"098ee4e7-8976-
> 4c21-8f0a-521873fd6ac5","content":"grte","attachments":[]}}
>
>
> I need *Demo* to be added in headers and remove jwtToken from message. I
> removed it. But what method I can use in ActiveMQ to publish it on Topic
> Demo instead of message with jwtToken value.
>
> I Hope I am able to explain you better :)
>
> Regards,
> Bharat Gupta
>
>
> -----Original Message-----
> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
> Sent: den 1 februari 2018 15:02
> To: ActiveMQ Users <us...@activemq.apache.org>
> Cc: users-owner@activemq.apache.org
> Subject: RE: ActiveMQ custom plugin
>
> Oh, and I missed your second question. I would expect that you could add
> headers similar to how the code you posted removed some. Does your question
> mean that you tried that and it didn't work? If so, how did it fail?
>
> Tim
>
> On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:
>
> > Bharat,
> >
> > Is this in 5.x, or did you switch to Artemis?
> >
> > Your code is operating on a message, but what called your code? We'd need
> > some context on how you got that message to know what you should do with
> it
> > next.
> >
> > Tim
> >
> > On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
> >
> >> Hello Tim,
> >>
> >> I am getting following message from client using MQTT
> >>
> >> {
> >>         "header": {
> >>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
> >>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
> >> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
> >> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
> >> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
> >> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
> >> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
> >> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
> >> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
> >> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
> >> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
> >> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
> >> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
> >> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
> >> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
> >> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
> >> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
> >> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
> >> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
> >> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
> >> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
> >> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
> >> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
> >> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
> >>                 "correlId": "",
> >>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
> >> 9b53743",
> >>                 "environment": "st5",
> >>                 "producerUTCTimestamp": 1515677099337,
> >>                 "contractId": "SCCO3822",
> >>                 "producerVer": "1.0",
> >>                 "messageType": "SendChatMessageInConversationMessage",
> >>                 "appId": "fma",
> >>                 "messageTypeVer": "1.0",
> >>                 "receivers": []
> >>         },
> >>         "body": {
> >>                 "conversationId": "2b575462-97bd-4e9a-8ac4-
> 6fec793c836a",
> >>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-
> 521873fd6ac5",
> >>                 "content": "grte",
> >>                 "attachments": []
> >>         }
> >> }
> >>
> >> I am validating the message by validating the jwt token. I don’t want
> >> jwtToken field in message once I have validate it and used following to
> >> remove it:
> >>
> >> for (JsonNode jsonNode : jsonNodeRoot) {
> >>            if (jsonNode instanceof ObjectNode) {
> >>                ObjectNode o = (ObjectNode) jsonNode;
> >>                o.remove("jwtToken");
> >>
> >>            }
> >>        }
> >>
> >> But how to publish a message on topic once I have done the following
> >> checks on it? What method I can use here?
> >>
> >> Also I wish to add certain attributes in the message header and then
> >> publish on the topic how I can do that also?
> >>
> >> Thank You in Advance
> >>
> >> Regards,
> >> Bharat Gupta
> >>
> >>
> >> -----Original Message-----
> >> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim
> Bain
> >> Sent: den 2 januari 2018 06:27
> >> To: ActiveMQ Users <us...@activemq.apache.org>
> >> Cc: users-owner@activemq.apache.org
> >> Subject: Re: ActiveMQ custom plugin
> >>
> >> I spent a little time this evening looking through the ActiveMQ 5.x code
> >> and didn't find an obvious way to hook into the MQTT-specific pieces, so
> >> switching to Artemis may be your best bet.
> >>
> >> Tim
> >>
> >> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu>
> wrote:
> >>
> >> > Bharat,
> >> >
> >> > I hadn't caught that this question was about making the connection
> >> rather
> >> > vs. the first question about sending messages across it; thanks for
> >> helping
> >> > me understand your question.
> >> >
> >> > As far as I know, the interception capabilities of 5.x apply only to
> the
> >> > core broker using the interface you used in the earlier messages in
> this
> >> > thread, but not to the code that translates non-OpenWire protocols
> such
> >> as
> >> > MQTT into OpenWire. I'll need to spend some time digging through the
> >> code
> >> > to make sure there isn't an MQTT plugin capability I don't know about,
> >> and
> >> > I probably won't get a chance to do that until the weekend. But
> unless I
> >> > find something unexpected when I do that digging, what you want may
> not
> >> be
> >> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
> >> > everything you're trying to do, then switching to it may be a good
> >> option.
> >> >
> >> > Tim
> >> >
> >> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
> >> wrote:
> >> >
> >> >> Yes the question I asked here is not answered earlier. In previous
> >> >> threads/mail focus was on when client was publishing a message on
> >> topic the
> >> >> activemq.send method was called to intercept the message before it
> >> actually
> >> >> published on topic.
> >> >>
> >> >> Here I am majorly focusing on intercepting mqtt connections, which
> >> means
> >> >> intercepting the client request to activemq and Call my plugin there.
> >> So
> >> >> which method of activemq can be used here?
> >> >>
> >> >> As I went thru many solutions over internet and see Artemis as an
> >> option.
> >> >>
> >> >> I hope I am able to put my point clear now. :) please let me know if
> >> more
> >> >> info is needed from my end.
> >> >>
> >> >>
> >> >>
> >> >> Sent from my iPhone
> >> >>
> >> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
> >> >> tbain@alumni.duke.edu>> wrote:
> >> >>
> >> >> Is there some aspect of your question that's not answered by the
> first
> >> >> 12(!) emails in the thread? I'm not clear why you're asking what
> >> appears
> >> >> to
> >> >> be the same question again. If there's some new aspect of the
> question
> >> or
> >> >> something that wasn't previously answered, please highlight what it
> is.
> >> >>
> >> >> And no, I don't believe that Artemis is required to do what you're
> >> trying
> >> >> to do. It might be equally possible to do in Artemis compared to
> doing
> >> in
> >> >> 5.x (I don't know Artemis well enough to comment on whether this can
> be
> >> >> done in Artemis), but you definitely don't "have to use Artemis here
> to
> >> >> achieve this."
> >> >>
> >> >> Tim
> >> >>
> >> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com
> <mailt
> >> o:
> >> >> bharat.gupta@scania.com>> wrote:
> >> >>
> >> >> hello again,
> >> >>
> >> >> I am asking my question here again if you can possibly help me with a
> >> >> method.
> >> >>
> >> >> 1. Need to intercept the Incoming connections from MQTT clients.
> >> >> User is connecting to activemq broker by hitting on url and sending a
> >> >> TOKEN [(hostname:port) + token]
> >> >>
> >> >> How can we intercept the connections and validate the token sent by
> >> mqtt
> >> >> client?
> >> >>
> >> >> I have my own custom plugin that will validate the token. Just Need
> to
> >> >> know method on which we can call that Plugin.
> >> >>
> >> >> Also do we have to use Artemis here to achieve this?
> >> >>
> >> >> Thanks In Advance
> >> >>
> >> >> Regards,
> >> >> Bharat Gupta
> >> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> >> Mobile: +46700869007, +91-9718483802
> >> >> bharat.gupta@scania.com<ma...@scania.com>
> >> >>
> >> >> -----Original Message-----
> >> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> >> tbain98@gmail.com] On Behalf Of Tim Bain
> >> >> Sent: Tuesday, December 5, 2017 7:29 PM
> >> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> >> users@activemq.apache.org>>
> >> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> >> apache.org>
> >> >> Subject: RE: ActiveMQ custom plugin
> >> >>
> >> >> I'd suggest that you store your cache of known credentials in your
> >> plugin.
> >> >> I'm not sure that you'd have access to the web session from a plugin,
> >> >> because that's MQTT-specific, so I think your best bet would be to
> >> store
> >> >> it
> >> >> in a Map (better: a Guava cache, so you get free age-off behavior)
> >> within
> >> >> your plugin.
> >> >>
> >> >> Tim
> >> >>
> >> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com
> <mailt
> >> o:
> >> >> bharat.gupta@scania.com>> wrote:
> >> >>
> >> >> Hi Tim,
> >> >>
> >> >> I am having a scenario here. Using custom plugin I am validating my
> JWT
> >> >> tokens and fetching the claims from it.
> >> >>
> >> >> Claims:
> >> >>
> >> >> {
> >> >>  "unique_name": "gubhpi",
> >> >>  "sub": "gubhpi",
> >> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
> >> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
> >> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-
> 3e80430ec4d1",
> >> >>  "AdAccount": "bguvvw",
> >> >>  "FunctionalPermissions": "490879",
> >> >>  "UserPermissions": [
> >> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
> >> >>    "1006"
> >> >>  ],
> >> >>  "iss": "https://xyz/",
> >> >>  "aud": "58b99b37-db1c78d7fef5",
> >> >>  "exp": 1510240047,
> >> >>  "nbf": 1510236447
> >> >> }
> >> >>
> >> >> From this I need to fetch "AdAccount": "bguvvw", and store it
> >> >> somewhere(please suggest me-- context or session) and when next time
> >> user
> >> >> sends me message on activemq using mqtt or web socket I need to check
> >> the
> >> >> message header with the users stored in contextsession or from some
> >> >> object.
> >> >> If user is present then we validate else we don’t.
> >> >>
> >> >>
> >> >> Regards,
> >> >> Bharat Gupta
> >> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> >> Mobile: +46700869007, +91-9718483802
> >> >> bharat.gupta@scania.com<ma...@scania.com>
> >> >>
> >> >> -----Original Message-----
> >> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> >> tbain98@gmail.com] On Behalf Of Tim Bain
> >> >> Sent: den 29 november 2017 04:20
> >> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> >> users@activemq.apache.org>>
> >> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> >> apache.org>
> >> >> Subject: RE: ActiveMQ custom plugin
> >> >>
> >> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com
> <mailt
> >> o:
> >> >> bharat.gupta@scania.com>> wrote:
> >> >>
> >> >> Hello Tim,
> >> >>
> >> >> Thank you for your help. :)
> >> >>
> >> >> I have used below method to fetch that text from message when client
> >> >> publish on topic and it works.
> >> >>
> >> >> public void send(ProducerBrokerExchange producerExchange, Message
> >> >> messageSend) throws Exception {
> >> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
> >> >>
> >> >>
> >> >> ((ActiveMQTextMessage)messageSend).getText()
> >> >> It returns the text from web console only.
> >> >>
> >> >>
> >> >> Really appreciate your help here. :)
> >> >>
> >> >>
> >> >>
> >> >> Great, I'm glad I've been able to help.
> >> >>
> >> >> ------------------------------------------------------------
> >> >> ------------------------------------------------------------
> >> >> ------------------------------------------------------------
> >> >> -----------------------
> >> >>
> >> >> Apart from this I have a situation here that when I try to execute
> >> below
> >> >> code:
> >> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
> >> >> creating a queue
> >> >> 2. TextMessage claims = session.createTextMessage(payload); ---
> >> >> converting
> >> >> the string to message to send it on above made queue
> >> >> 3. producer.send(dest, claims); --- send the message on
> >> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
> >> >> JWT_PAYLOAD
> >> >> why?
> >> >>
> >> >>
> >> >> What makes you think that this message on an advisory topic was your
> >> >> message instead of a standard advisory message that's sent anytime a
> >> >> non-anonymous producer sends a message? What makes you think that
> thos
> >> >> message was sent instead of the message you sent to your queue,
> rather
> >> >> than
> >> >> sent *in addition to* the message on your queue? Can you share
> >> >> before-and-after screenshots of your queue's row on the Queues page
> of
> >> >> the
> >> >> web console? And were there any warnings or errors logged in the
> >> broker's
> >> >> logs when this happened?
> >> >>
> >> >> 4. Before executing producer.send(dest, claims); ----- it is going on
> >> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
> >> >> returning null as it is again checking for Content and data. So my
> ques
> >> >> is
> >> >> why it is going back again on first line? Why it is not simply
> putting
> >> >> the
> >> >> data on queue?
> >> >>
> >> >>
> >> >> I didn't understand what you meant by "it is going back again on
> first
> >> >> line." Are you saying that the broker is putting the original message
> >> >> onto
> >> >> your topic? If so, that's because by calling super.send(), you're
> >> >> allowing
> >> >> the publishing of the original message to the original topic to
> >> >> continue. I
> >> >> advised you to do that because I didn't realize that you wanted to
> >> >> transform the message and publish it to a different destination, but
> >> >> since
> >> >> it seems like you do, I think you don't want to call super.send()
> after
> >> >> all.
> >> >>
> >> >> If that's not what you meant, then please help me to better
> understand
> >> >> your
> >> >> question.
> >> >>
> >> >> @Override
> >> >>        public void send(ProducerBrokerExchange producerExchange,
> >> Message
> >> >> messageSend) throws Exception {
> >> >> if(messageSend != null)
> >> >> {
> >> >>        if(messageSend.getContent() != null)
> >> >> {
> >> >>        =               byte[] msg = ((ActiveMQMessage)
> >> >> messageSend).getContent().data;
> >> >>
> >> >>                String message = new String(msg);
> >> >>                logger.warn("messageBody::::::::::::::::
>   "
> >> >> +
> >> >> message);
> >> >>
> >> >>                DecodedJWT jwt = JWT.decode(message);
> >> >>                byte[] contentBytes = String.format("%s.%s",
> >> >> jwt.getHeader(), jwt.getPayload())
> >> >>                                .getBytes(StandardCharsets.UTF_8);
> >> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
> >> >> getSignature());
> >> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
> >> >>                                + "please enter your key"
> >> >>                                + "-----END PUBLIC KEY-----";
> >> >>
> >> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
> >> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(
> publicKeyPEM);
> >> >>
> >> >>                Security.addProvider(new BouncyCastleProvider());
> >> >>                Signature signatureInstance =
> >> >> Signature.getInstance("SHA256withRSA",
> >> >> "BC");
> >> >>                signatureInstance.initVerify(pk);
> >> >>                signatureInstance.update(contentBytes);
> >> >>                boolean result = signatureInstance.verify(
> >> >> signatureBytes);
> >> >>
> >> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
> >> >>
> >> >>                String payload = new String(pload);
> >> >>                logger.warn("messageBody::::::::::::::::
>   "
> >> >> +
> >> >> payload);
> >> >>                logger.warn("result::::::::::::::::              " +
> >> >> result);
> >> >>                if (result = true) {
> >> >>
> >> >>                        // Create a ConnectionFactory
> >> >>            ActiveMQConnectionFactory connectionFactory = new
> >> >> ActiveMQConnectionFactory("vm://localhost");
> >> >>
> >> >>            // Create a Connection
> >> >>            javax.jms.Connection jmsConnection = connectionFactory.
> >> >> createConnection();
> >> >>            jmsConnection.start();
> >> >>
> >> >>            // Create a Session
> >> >>            Session session = jmsConnection.createSession(false,
> >> >> Session.AUTO_ACKNOWLEDGE);
> >> >>
> >> >>                Destination dest = session.createQueue("JWT_
> PAYLOAD");
> >> >>                        MessageProducer producer =
> >> >> session.createProducer(dest);
> >> >>                        producer.setDeliveryMode(
> >> >> DeliveryMode.PERSISTENT);
> >> >>
> >> >>                        TextMessage claims =
> session.createTextMessage(
> >> >> payload);
> >> >>                        claims.setJMSType("TEXT");
> >> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
> >> >> claims);
> >> >>                        producer.send(dest, claims);
> >> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
> >> >> claims);
> >> >>
> >> >>
> >> >> //
> >> >>                        MessageConsumer consumer =
> >> >> session.createConsumer(dest);
> >> >>                        consumer.setMessageListener(this);
> >> >>
> >> >>                }
> >> >>
> >> >>                else {
> >> >>
> >> >>                        logger.warn("Else Authentication failed.
> Please
> >> >> send Valid Token");
> >> >>                }
> >> >>
> >> >>                super.send(producerExchange, messageSend);
> >> >>                // getNext().send(producerExchange, messageSend);
> >> >>
> >> >>        }
> >> >>
> >> >>        else
> >> >>        {
> >> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
> >> >>        }
> >> >>        }
> >> >> else
> >> >> {
> >> >>        logger.fatal("MESSAGE SEND IS NULL");
> >> >> }
> >> >>        }
> >> >>
> >> >>        @Override
> >> >>        public void onMessage(javax.jms.Message message) {
> >> >>                  String messageText = null;
> >> >>                try {
> >> >>                    if (message instanceof TextMessage) {
> >> >>                        TextMessage textMessage = (TextMessage)
> message;
> >> >>                        messageText = textMessage.getText();
> >> >>                        System.out.println("messageText = " +
> >> >> messageText);
> >> >>                    }
> >> >>                } catch (JMSException e) {
> >> >>                    //Handle the exception appropriately
> >> >>                }
> >> >>        }
> >> >>
> >> >> Regards,
> >> >> Bharat Gupta
> >> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
> >> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
> >> >> <+91%2097184%2083802>
> >> >> bharat.gupta@scania.com<ma...@scania.com>
> >> >>
> >> >> -----Original Message-----
> >> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> >> tbain98@gmail.com] On Behalf Of Tim Bain
> >> >> Sent: den 27 november 2017 08:12
> >> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> >> users@activemq.apache.org>>
> >> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> >> apache.org>
> >> >> Subject: Re: ActiveMQ custom plugin
> >> >>
> >> >> Thank you for providing that code. I spent some time running your
> code,
> >> >> and
> >> >> found the following problems with it, which are causing this to not
> >> work
> >> >> as
> >> >> you intended:
> >> >>
> >> >>   1. The signature for the send() method is "public void
> >> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
> >> >> throws
> >> >>   Exception," not the signature you had defined. Because your
> signature
> >> >>   didn't match the method you were trying to override, you weren't
> >> >> actually
> >> >>   overriding a method that would be called when a message was sent,
> but
> >> >>   instead you were simply defining a public method that nothing ever
> >> >> called.
> >> >>   The compiler would have caught this for you if you'd annotated the
> >> >> method
> >> >>   as @Override; you should be using that annotation for all overriden
> >> >>   methods, for exactly this reason.
> >> >>   2. messageSend.getContent() returns null for the test message I
> sent
> >> >> via
> >> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
> >> >> returns
> >> >>   the body. I think this same code would work for an MQTT message,
> but
> >> >> since
> >> >>   I've never used MQTT you'll need to confirm that.
> >> >>   3. I mentioned this earlier, but your send() method needs to call
> >> >>   super.send() at the end, otherwise the broker's not going to
> process
> >> >> any
> >> >>   messages and you're going to be wondering why the broker "doesn't
> >> >> work."
> >> >>   This doesn't explain why you're not seeing your logging occur, but
> >> >> once
> >> >> we
> >> >>   get past that problem, this is the next issue you're going to hit.
> >> >>
> >> >> Tim
> >> >>
> >> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
> >> bharat.gupta@scania.com
> >> >> <ma...@scania.com>>
> >> >> wrote:
> >> >>
> >> >> Hello,
> >> >>
> >> >> MyBroker.java
> >> >>
> >> >> package jwt.validation;
> >> >>
> >> >> import java.util.HashMap;
> >> >> import java.util.Map;
> >> >>
> >> >> import javax.jms.Destination;
> >> >> import javax.jms.ExceptionListener;
> >> >> import javax.jms.JMSException;
> >> >> import javax.jms.MessageConsumer;
> >> >> import javax.jms.Session;
> >> >> import javax.jms.TextMessage;
> >> >>
> >> >> import org.apache.activemq.ActiveMQConnection;
> >> >> import org.apache.activemq.ActiveMQConnectionFactory;
> >> >> import org.apache.activemq.ActiveMQMessageConsumer;
> >> >> import org.apache.activemq.broker.BrokerFilter;
> >> >> import org.apache.activemq.broker.Connection;
> >> >> import org.apache.activemq.broker.ConnectionContext;
> >> >> import org.apache.activemq.broker.ProducerBrokerExchange;
> >> >> import org.apache.activemq.broker.region.Subscription;
> >> >> import org.apache.activemq.command.ActiveMQDestination;
> >> >> import org.apache.activemq.command.ActiveMQMessage;
> >> >> import org.apache.activemq.command.ConnectionInfo;
> >> >> import org.apache.activemq.command.ConsumerInfo;
> >> >> import org.apache.activemq.command.Message;
> >> >> import org.apache.activemq.command.SessionInfo;
> >> >> import org.apache.log4j.Logger;
> >> >>
> >> >>
> >> >> public class MyBroker extends BrokerFilter {
> >> >>
> >> >>                final static Logger logger =
> Logger.getLogger(MyBroker.
> >> >> class);
> >> >>                private Map<String, String> userMap = new
> >> >> HashMap<String,
> >> >> String>();
> >> >>
> >> >>                public MyBroker(org.apache.activemq.broker.Broker
> >> >> next)
> >> >> {
> >> >>                                super(next);
> >> >>
> >> >>                }
> >> >>
> >> >>
> >> >>
> >> >>                public void send(ProducerBrokerExchange
> >> >> producerExchange,
> >> >> ActiveMQMessage messageSend) throws JMSException
> >> >>                {
> >> >>                                  byte[] messageBytes =
> >> >> messageSend.getContent().data;
> >> >>
> >> >>                                  Message data =
> >> >> messageSend.getMessage();
> >> >>                                  logger.warn("
> >> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
> >> >> + data);
> >> >>                                  String message = new
> >> >> String(messageBytes);
> >> >>                                  logger.warn("messageBody" +
> message);
> >> >>                                  logger.info<http://logger.info
> >> >("messageBody"
> >> >> +
> >> >> message);
> >> >>                                  logger.fatal("messageBody" +
> >> >> message);
> >> >>                                  logger.debug("messageBody" +
> >> >> message);
> >> >>
> >> >>
> >> >>                 }
> >> >>
> >> >>                public void addConnection(ConnectionContext context,
> >> >> ConnectionInfo info)
> >> >>            throws Exception {
> >> >>
> >> >>                                info.getUserName();
> >> >>                                info.toString();
> >> >>
> >> >>
> >> >>                                logger.warn("info1" +
> >> >> info.getUserName());
> >> >>                                logger.fatal("info2" +
> >> >> info.toString());
> >> >>
> >> >>       String token = context.getUserName();
> >> >>       logger.debug("token1" + token);
> >> >>       logger.warn("token2" + token);
> >> >>       logger.fatal("token3" + token);
> >> >>
> >> >>
> >> >>        // Then call your parent
> >> >>        super.addConnection(context, info);
> >> >>    }
> >> >>
> >> >>    public Subscription addConsumer(ConnectionContext context,
> >> >> ConsumerInfo info) throws Exception {
> >> >>
> >> >>
> >> >>
> >> >>        ActiveMQDestination dest = info.getDestination();
> >> >>        Connection conn = context.getConnection();
> >> >>        if (dest != null) {
> >> >>            String destName = info.getDestination().
> getPhysicalName();
> >> >>            String clientId = context.getClientId();
> >> >>            String allowedDest = userMap.get(clientId);
> >> >>
> >> >>            logger.info<http://logger.info>(">>> Got Consumer Add
> >> request
> >> >> { Destination:
> >> >> " +
> >> >> destName
> >> >>                    + ", Remote Address: " + conn.getRemoteAddress()
> >> >>                    + ", ClientID: " + clientId
> >> >>                    + " }");
> >> >>            if (allowedDest != null && (allowedDest.equals("*") ||
> >> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
> >> >>                logger.info<http://logger.info>(">>> Subscription
> >> >> allowed");
> >> >>            } else {
> >> >>                logger.error(">>> Destination not allowed.
> Subscription
> >> >> denied!");
> >> >>                throw new Exception(">>> Subscription denied!");
> >> >>            }
> >> >>        } else {
> >> >>            logger.error("<<< Got Consumer Add request from Remote
> >> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
> >> >>        }
> >> >>        return super.addConsumer(context, info);
> >> >>    }
> >> >> }
> >> >>
> >> >> Sample.java
> >> >>
> >> >> package jwt.validation;
> >> >>
> >> >> import org.apache.activemq.ActiveMQMessageProducer;
> >> >> import org.apache.activemq.broker.Broker;
> >> >> import org.apache.activemq.broker.BrokerPlugin;
> >> >> import org.apache.log4j.Logger;
> >> >>
> >> >> public class Sample  implements BrokerPlugin {
> >> >>
> >> >>                final static Logger logger =
> >> >> Logger.getLogger(Sample.class)
> >> >> ;
> >> >>
> >> >>                public static void main(String[] args) {
> >> >>
> >> >>
> >> >>                }
> >> >>
> >> >>                private void runMe(String parameter){
> >> >>
> >> >>                                if(logger.isDebugEnabled()){
> >> >>                                                logger.debug("This is
> >> >> debug : " + parameter);
> >> >>                                }
> >> >>
> >> >>                                if(logger.isInfoEnabled()){
> >> >>                                                logger.info<
> >> http://logger.
> >> >> info>("This is
> >> >> info
> >> >> : " + parameter);
> >> >>                                }
> >> >>
> >> >>                                logger.warn("This is warn : " +
> >> >> parameter);
> >> >>                                logger.error("This is error : " +
> >> >> parameter);
> >> >>                                logger.fatal("This is fatal : " +
> >> >> parameter);
> >> >>
> >> >>                }
> >> >>
> >> >>                public Broker installPlugin(Broker broker) throws
> >> >> Exception {
> >> >>                                Sample sample = new Sample();
> >> >>                                sample.runMe("ActiveMQ Hello");
> >> >>
> >> >>                                return new MyBroker(broker);
> >> >>                }
> >> >>
> >> >>
> >> >> }
> >> >>
> >> >> The above are two classes I have implemented for my custom plugin.
> >> >>
> >> >> Regards,
> >> >> Bharat Gupta
> >> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> >> Mobile: +46700869007, +91-9718483802
> >> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> >> bharat.gupta@scania.com>
> >> >>
> >> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> >> tbain98@gmail.com] On Behalf Of Tim
> >> >> Bain
> >> >> Sent: Sunday, November 26, 2017 4:31 AM
> >> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> >> users@activemq.apache.org>>
> >> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> >> apache.org>
> >> >> Subject: RE: ActiveMQ custom plugin
> >> >>
> >> >>
> >> >>
> >> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com
> <mailt
> >> o:
> >> >> bharat.gupta@scania.com><
> >> >> mailto:
> >> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
> >> >>
> >> >> hello Tim,
> >> >>
> >> >>
> >> >>
> >> >> My Custom Plugin is getting installed as I am using log4j to print
> >> >> random
> >> >> stuff and its getting printed in logs.
> >> >> Can you please describe in more detail exactly what methods that
> >> >> logging
> >> >> is done in and how it proves that the plugin was actually installed?
> If
> >> >> (for example) your logging is only in your constructor or your
> >> >> initialization method, that just proves that Spring made your bean,
> not
> >> >> that it was installed in the broker as a plugin.
> >> >>
> >> >> I am hereby attaching my codes that you can see.
> >> >> Where? All I see is your activemq.xml snippet below, but no actual
> code
> >> >> for your plugin.
> >> >>
> >> >> activemq.xml configurations:
> >> >>
> >> >> <plugins>
> >> >>
> >> >>                               <bean id="sample"
> >> >>
> >> >>                                class="jwt.validation.Sample"
> >> >>
> >> >>                                xmlns="http://www.
> >> >> springframework.org/schema/beans<http://springframework.org/
> >> schema/beans
> >> >> >"/>
> >> >>
> >> >>                               </plugins>
> >> >>
> >> >>
> >> >>
> >> >> Also I would like to explain you my exact requirement.
> >> >>
> >> >>
> >> >>
> >> >> The diagram below shows what I am trying to do it now.
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> [cid:image001.png@01D3658E.4A6B3E20]
> >> >> That sounds like it should be doable via an interceptor based on
> what I
> >> >> know about them (i.e. the wiki, but no hands-on experience).
> >> >>
> >> >> QUESTIONS:
> >> >>
> >> >>
> >> >>
> >> >> 1.       how can we provide JWT to custom plugin from client?
> >> >> If you have to use MQTT, you'll need to encode it directly into the
> >> >> message body, because that's all MQTT supports. You could for example
> >> >> make
> >> >> a JSON payload with two fields: the JWT and the message body. Or you
> >> >> could
> >> >> switch to OpenWire and put the JWT into a custom header on the
> message
> >> >> the
> >> >> client is sending.
> >> >>
> >> >> 2.       do we need to store jwt in topic first and then consume it
> >> >> from
> >> >> topic to validate it? (not idle case)
> >> >> You need to put the JWT into the message itself so that your plugin
> can
> >> >> evaluate the token and then decide what to do with the message based
> on
> >> >> that evaluation.
> >> >>
> >> >> 3.       can we call restful service from activeMQ broker that can
> >> >> validate token and gives the result back to broker?
> >> >> Yes, as far as I know, you'd be able to do that from within the
> broker.
> >> >> (I've never done that, but I'm not aware of anything that would
> prevent
> >> >> you
> >> >> from doing it.)
> >> >>
> >> >> Tim please let me know if I am clear with my requirements. Else we
> can
> >> >> talk more on call/phone.
> >> >>
> >> >>
> >> >>
> >> >> Thanks in advance
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> Regards,
> >> >>
> >> >> Bharat Gupta
> >> >>
> >> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> >>
> >> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
> >> >> <tel:+91%2097184%2083802>
> >> >>
> >> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> >> bharat.gupta@scania.com>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> -----Original Message-----
> >> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
> >> >> mail.com> [mailto:
> >> >> tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@gmail.com
> >]
> >> >> On Behalf Of Tim Bain
> >> >> Sent: Friday, November 24, 2017 7:19 PM
> >> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> >> users@activemq.apache.org><mailto:
> >> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
> >> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> >> apache.org><mailto:users-owner@
> >> >> activemq.apache.org<http://activemq.apache.org>
> >> >>
> >> >> Subject: RE: ActiveMQ custom plugin
> >> >>
> >> >>
> >> >>
> >> >> 1. Your send() method needs to call super.send() after doing your
> >> >> custom
> >> >>
> >> >> work, otherwise the message will never be sent to the real Broker
> >> >> object.
> >> >>
> >> >> Please review the wiki page I referred to earlier, which covers how
> to
> >> >>
> >> >> implement an interceptor.
> >> >>
> >> >>
> >> >>
> >> >> 2. To me it sounds like your plugin isn't getting installed. Do you
> >> >> have
> >> >>
> >> >> any indication that it is, from logs or some other mechanism? And can
> >> >> you
> >> >>
> >> >> please share the code of the class that implements BrokerPlugin, to
> >> >> confirm
> >> >>
> >> >> that your installPlugin() method looks right, and the XML block where
> >> >> you
> >> >>
> >> >> create the plugin bean?
> >> >>
> >> >>
> >> >>
> >> >> Tim
> >> >>
> >> >>
> >> >>
> >> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com
> <mailt
> >> o:
> >> >> bharat.gupta@scania.com><
> >> >> mailto:
> >> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
> >> >>
> >> >>
> >> >>
> >> >> Hello,
> >> >>
> >> >>
> >> >>
> >> >> I tried implementing the method as below:
> >> >>
> >> >>
> >> >>
> >> >>        public void send(ProducerBrokerExchange producerExchange,
> >> >>
> >> >> ActiveMQMessage messageSend) throws JMSException
> >> >>
> >> >>         {
> >> >>
> >> >>                  byte[] messageBytes =
> >> >> messageSend.getContent().data;
> >> >>
> >> >>                  String message = new String(messageBytes);
> >> >>
> >> >>                  logger.info<http://logger.info><http://logger.info
> >> >("messageBody"
> >> >> +
> >> >> message);
> >> >>
> >> >>        }
> >> >>
> >> >>
> >> >>
> >> >> Also I am publishing a message on a topic even though this send()
> >> >> method
> >> >>
> >> >> is not been called as logger.info<http://logger.info><
> >> http://logger.info>
> >> >> is not getting
> >> >> printed in my Custom
> >> >>
> >> >> Plugin.
> >> >>
> >> >>
> >> >>
> >> >> Could you please help me on this?
> >> >>
> >> >>
> >> >>
> >> >> Regards,
> >> >>
> >> >> Bharat Gupta
> >> >>
> >> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> >>
> >> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
> >> >> <tel:+91%2097184%2083802>
> >> >>
> >> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> >> bharat.gupta@scania.com>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> -----Original Message-----
> >> >>
> >> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
> >> >> mail.com> [mailto:
> >> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
> >> >>
> >> >> Sent: Friday, November 24, 2017 7:15 PM
> >> >>
> >> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> >> users@activemq.apache.org><mailto:
> >> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
> >> >>
> >> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> >> apache.org><mailto:users-owner@
> >> >> activemq.apache.org<http://activemq.apache.org>>
> >> >>
> >> >> Subject: Re: ActiveMQ custom plugin
> >> >>
> >> >>
> >> >>
> >> >> As I said in your other thread, you would do that by implementing
> >> >> code
> >> >> in
> >> >>
> >> >> the send() method of your subclass of BrokerFilter, which you would
> >> >> create
> >> >>
> >> >> and return in your installPlugin() method.
> >> >>
> >> >>
> >> >>
> >> >> Tim
> >> >>
> >> >>
> >> >>
> >> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com
> <mailt
> >> o:
> >> >> bharat.gupta@scania.com><
> >> >> mailto:
> >> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
> >> >>
> >> >>
> >> >>
> >> >> Hello,
> >> >>
> >> >>
> >> >>
> >> >> I have a scenario as follows:
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> 1.       I have Custom Plugins that decrypts the data and validates
> >> >> it.
> >> >>
> >> >>
> >> >>
> >> >> 2.       I am getting Encrypted data (token) from user that need to
> >> >> be
> >> >>
> >> >> decrypted on custom plugin.
> >> >>
> >> >>
> >> >>
> >> >> 3.       Client is accessing the broker using mqtt protocol
> >> >>
> >> >>
> >> >>
> >> >> Need Solution for the following:
> >> >>
> >> >>
> >> >>
> >> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
> >> >>
> >> >> validate the  data(token) in my custom plugin
> >> >>
> >> >>
> >> >>
> >> >> 2.       How to extract a data what customer is sending? So that I
> >> >> can
> >> >>
> >> >> extract the data, decrypt the message and validate.
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> Implementation so far:
> >> >>
> >> >>
> >> >>
> >> >> 1.       Custom Plugin is ready and JAR has been added in
> >> >> <ActiveMQ>/libs
> >> >>
> >> >>
> >> >>
> >> >> 2.       Added the plugin configuration in activemq.xml
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> Could anyone help me with a solution for the same as it's critical
> >> >> case.
> >> >>
> >> >>
> >> >>
> >> >> Thank you In Advance
> >> >>
> >> >>
> >> >>
> >> >> Regards,
> >> >>
> >> >> Bharat Gupta
> >> >>
> >> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> >>
> >> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
> >> <+91%2097184%2083802>
> >> >> <+91%2097184%2083802>
> >> >> <tel:+91%2097184%2083802>
> >> >>
> >> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> >> bharat.gupta@scania.com<mailto:
> >> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
> >> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >>
> >
>



-- 
perl -e 'print
unpack("u30","D0G)U8V4\@4VYY9&5R\"F)R=6-E+G-N>61E<D\!G;6%I;\"YC;VT*" );'

ActiveMQ in Action: http://bit.ly/2je6cQ
Blog: http://bsnyder.org/ <http://bruceblog.org/>
Twitter: http://twitter.com/brucesnyder

RE: ActiveMQ custom plugin

Posted by Tim Bain <tb...@alumni.duke.edu>.
What gave you the impression that the "websphere:" Camel transport would
use a message header to determine the target destination rather than using
the value set in the <to> directive? I've never used that transport, so I
can't say for sure that what you're doing is right or wrong, but since it
doesn't appear to be working, that's where I'd focus if I was you.

Also, that Camel component has nothing to do with ActiveMQ, so if you're
having problems with it, you'll want to ask for help on its mailing list or
forums (or on a general-purpose question site such as StackOverflow), not
here.

Good luck!

Tim

On Mar 5, 2018 2:04 AM, "Gupta Bharat" <bh...@scania.com> wrote:

Hi Tim,

I have made a custom processor and trying to add headers to the message
before routing it to the IBM MQ using Camel.

<bean id="myProcessor" class="CustomProcessor">
</bean>

        <camelContext trace="false" id="wmqToAmqContext"
                xmlns="http://camel.apache.org/schema/blueprint">
                <route id="wmqToAmqBridge">
                        <from uri="activemq:topic:fma/1.0/st5/a1/fla5i3"/>
                        <process ref="myProcessor"/>
                        <log message="The message contains ${body}" />
                        <to uri="websphere:queue:LQ.SCCO3879.ST5" />
                </route>
        </camelContext>
------------------------------------------------------------
--------------------------------------------------------------
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;

public class CustomProcessor implements Processor  {

        @Override
        public void process(Exchange exchange) throws Exception {
                // TODO Auto-generated method stub
                //exchange.getIn().setProperty("JMSDestination1",
"fma/1.0/st5/a1/fla5i3");
        Message m = exchange.getIn();
        m.setHeader("JMSDestination2", "fma/1.0/st5/a2/fla5i3");
        System.out.println("MESSAGE is:  " + m.getHeaders().toString());


        }
}

I have added the Class and xml configuration.

But when message reaches IBM MQ it takes the JMS Destination as the
queue:/// LQ.SCCO3879.ST5 instead of topic:/// fma/1.0/st5/a2/fla5i3 (What
I am setting it up here in camel).

Could you please let me know where I am going wrong or missing something?

Thanks in Advance

Regards,
Bharat Gupta

-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 2 februari 2018 14:29
To: ActiveMQ Users <us...@activemq.apache.org>
Subject: RE: ActiveMQ custom plugin

OK, great. In that case you would probably want to make a custom processor
in Camel that transforms the message however you need it to, and insert the
processor in the route before the <to>.

Tim

On Feb 2, 2018 1:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

Yes I am using 5.x currently.
Using Apache Camel I am routing messages from ActiveMQ to IBM MQ.

        <!-- Configure IBM WebSphere MQ connection factory -->
        <bean id="websphereConnectionFactory" class="com.ibm.mq.jms.
MQConnectionFactory">
                <property name="transportType" value="1" />
                <property name="hostName" value="SC1234MC.sss.se.scania.com"
/>
                <property name="port" value="1414" />
                <property name="queueManager" value="SC1234MC" />
        </bean>

        <bean id="websphereConfig" class="org.apache.camel.component.jms.
JmsConfiguration">
                <property name="connectionFactory"
ref="websphereConnectionFactory"
/>
                <property name="concurrentConsumers" value="1" />
        </bean>

        <bean id="websphere" class="org.apache.camel.
component.jms.JmsComponent">
                <property name="configuration" ref="websphereConfig" />
        </bean>

        <camelContext trace="false" id="wmqToAmqContext"
                xmlns="http://camel.apache.org/schema/blueprint">
                <route id="wmqToAmqBridge">
                        <from uri="activemq:topic:demo" />
                        <log message="The message contains ${body}" />
                        <to uri="websphere:queue:LQ.SCCO3879.ST5" />
                </route>
        </camelContext>

Regards,
Bharat Gupta
Development & Support | Platform Technician, IXCB | Scania IT
Mobile: +46700869007, +91-9718483802
bharat.gupta@scania.com


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 2 februari 2018 07:06
To: ActiveMQ Users <us...@activemq.apache.org>
Subject: RE: ActiveMQ custom plugin

Let's go back to basics.

Are you using 5.x or Artemis?

You say you're routing messages from ActiveMQ to IBM MQ. How is that being
done?

Tim


On Feb 1, 2018 7:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

I don't wish to add headers in the message I pasted. This message I am
getting from user and it is content. Even the tag header is part of
content. But when I route the message from Active MQ to IBM MQ certain
attributes like destination topic name and message id need to be added.

Also I am using MQTT client to publish a message on ActiveMQ specifying the
topic name and message. I need to add that topic name as destination and
also want to remove JWTtoken from message.

Publication:
Topic: Demo
Message: {"header":{"messageId":"fcbef565-18ea-429a-836f-
7e24d9b53743","jwtToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIs
ImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIs
IkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAt
OTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNl
IjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRB
Y2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkx
MDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwi
aXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoi
MmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjox
NTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7Bx
A6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_
0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_
VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_
xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_
LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-
TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd
73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vs
rcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_
Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpI
vI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-
tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47k
flNNwt1_QVo","correlId":"","initialMessageid":"fcbef565-
18ea-429a-836f-7e24d9b53743","environment":"st5","producerUTCTimestamp":
1515677099337,"contractId":"SCCO3822","producerVer":"1.0","messageType":"
SendChatMessageInConversationMessage","appId":"fma","messageTypeVer":"1.0","
receivers":[]},"body":{"conversationId":"2b575462-
97bd-4e9a-8ac4-6fec793c836a","chatMessageId":"098ee4e7-8976-
4c21-8f0a-521873fd6ac5","content":"grte","attachments":[]}}


I need *Demo* to be added in headers and remove jwtToken from message. I
removed it. But what method I can use in ActiveMQ to publish it on Topic
Demo instead of message with jwtToken value.

I Hope I am able to explain you better :)

Regards,
Bharat Gupta


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 1 februari 2018 15:02
To: ActiveMQ Users <us...@activemq.apache.org>
Cc: users-owner@activemq.apache.org
Subject: RE: ActiveMQ custom plugin

Oh, and I missed your second question. I would expect that you could add
headers similar to how the code you posted removed some. Does your question
mean that you tried that and it didn't work? If so, how did it fail?

Tim

On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> Is this in 5.x, or did you switch to Artemis?
>
> Your code is operating on a message, but what called your code? We'd need
> some context on how you got that message to know what you should do with
it
> next.
>
> Tim
>
> On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Hello Tim,
>>
>> I am getting following message from client using MQTT
>>
>> {
>>         "header": {
>>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
>> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
>> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
>> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
>> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
>> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
>> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
>> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
>> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
>> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
>> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
>> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
>> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
>> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
>> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
>> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
>> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
>> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
>> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
>> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
>> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
>> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
>> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>>                 "correlId": "",
>>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
>> 9b53743",
>>                 "environment": "st5",
>>                 "producerUTCTimestamp": 1515677099337,
>>                 "contractId": "SCCO3822",
>>                 "producerVer": "1.0",
>>                 "messageType": "SendChatMessageInConversationMessage",
>>                 "appId": "fma",
>>                 "messageTypeVer": "1.0",
>>                 "receivers": []
>>         },
>>         "body": {
>>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>>                 "content": "grte",
>>                 "attachments": []
>>         }
>> }
>>
>> I am validating the message by validating the jwt token. I don’t want
>> jwtToken field in message once I have validate it and used following to
>> remove it:
>>
>> for (JsonNode jsonNode : jsonNodeRoot) {
>>            if (jsonNode instanceof ObjectNode) {
>>                ObjectNode o = (ObjectNode) jsonNode;
>>                o.remove("jwtToken");
>>
>>            }
>>        }
>>
>> But how to publish a message on topic once I have done the following
>> checks on it? What method I can use here?
>>
>> Also I wish to add certain attributes in the message header and then
>> publish on the topic how I can do that also?
>>
>> Thank You in Advance
>>
>> Regards,
>> Bharat Gupta
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 2 januari 2018 06:27
>> To: ActiveMQ Users <us...@activemq.apache.org>
>> Cc: users-owner@activemq.apache.org
>> Subject: Re: ActiveMQ custom plugin
>>
>> I spent a little time this evening looking through the ActiveMQ 5.x code
>> and didn't find an obvious way to hook into the MQTT-specific pieces, so
>> switching to Artemis may be your best bet.
>>
>> Tim
>>
>> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>>
>> > Bharat,
>> >
>> > I hadn't caught that this question was about making the connection
>> rather
>> > vs. the first question about sending messages across it; thanks for
>> helping
>> > me understand your question.
>> >
>> > As far as I know, the interception capabilities of 5.x apply only to
the
>> > core broker using the interface you used in the earlier messages in
this
>> > thread, but not to the code that translates non-OpenWire protocols such
>> as
>> > MQTT into OpenWire. I'll need to spend some time digging through the
>> code
>> > to make sure there isn't an MQTT plugin capability I don't know about,
>> and
>> > I probably won't get a chance to do that until the weekend. But unless
I
>> > find something unexpected when I do that digging, what you want may not
>> be
>> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
>> > everything you're trying to do, then switching to it may be a good
>> option.
>> >
>> > Tim
>> >
>> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
>> wrote:
>> >
>> >> Yes the question I asked here is not answered earlier. In previous
>> >> threads/mail focus was on when client was publishing a message on
>> topic the
>> >> activemq.send method was called to intercept the message before it
>> actually
>> >> published on topic.
>> >>
>> >> Here I am majorly focusing on intercepting mqtt connections, which
>> means
>> >> intercepting the client request to activemq and Call my plugin there.
>> So
>> >> which method of activemq can be used here?
>> >>
>> >> As I went thru many solutions over internet and see Artemis as an
>> option.
>> >>
>> >> I hope I am able to put my point clear now. :) please let me know if
>> more
>> >> info is needed from my end.
>> >>
>> >>
>> >>
>> >> Sent from my iPhone
>> >>
>> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> >> tbain@alumni.duke.edu>> wrote:
>> >>
>> >> Is there some aspect of your question that's not answered by the first
>> >> 12(!) emails in the thread? I'm not clear why you're asking what
>> appears
>> >> to
>> >> be the same question again. If there's some new aspect of the question
>> or
>> >> something that wasn't previously answered, please highlight what it
is.
>> >>
>> >> And no, I don't believe that Artemis is required to do what you're
>> trying
>> >> to do. It might be equally possible to do in Artemis compared to doing
>> in
>> >> 5.x (I don't know Artemis well enough to comment on whether this can
be
>> >> done in Artemis), but you definitely don't "have to use Artemis here
to
>> >> achieve this."
>> >>
>> >> Tim
>> >>
>> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> hello again,
>> >>
>> >> I am asking my question here again if you can possibly help me with a
>> >> method.
>> >>
>> >> 1. Need to intercept the Incoming connections from MQTT clients.
>> >> User is connecting to activemq broker by hitting on url and sending a
>> >> TOKEN [(hostname:port) + token]
>> >>
>> >> How can we intercept the connections and validate the token sent by
>> mqtt
>> >> client?
>> >>
>> >> I have my own custom plugin that will validate the token. Just Need to
>> >> know method on which we can call that Plugin.
>> >>
>> >> Also do we have to use Artemis here to achieve this?
>> >>
>> >> Thanks In Advance
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: Tuesday, December 5, 2017 7:29 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> I'd suggest that you store your cache of known credentials in your
>> plugin.
>> >> I'm not sure that you'd have access to the web session from a plugin,
>> >> because that's MQTT-specific, so I think your best bet would be to
>> store
>> >> it
>> >> in a Map (better: a Guava cache, so you get free age-off behavior)
>> within
>> >> your plugin.
>> >>
>> >> Tim
>> >>
>> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hi Tim,
>> >>
>> >> I am having a scenario here. Using custom plugin I am validating my
JWT
>> >> tokens and fetching the claims from it.
>> >>
>> >> Claims:
>> >>
>> >> {
>> >>  "unique_name": "gubhpi",
>> >>  "sub": "gubhpi",
>> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>> >>  "AdAccount": "bguvvw",
>> >>  "FunctionalPermissions": "490879",
>> >>  "UserPermissions": [
>> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
>> >>    "1006"
>> >>  ],
>> >>  "iss": "https://xyz/",
>> >>  "aud": "58b99b37-db1c78d7fef5",
>> >>  "exp": 1510240047,
>> >>  "nbf": 1510236447
>> >> }
>> >>
>> >> From this I need to fetch "AdAccount": "bguvvw", and store it
>> >> somewhere(please suggest me-- context or session) and when next time
>> user
>> >> sends me message on activemq using mqtt or web socket I need to check
>> the
>> >> message header with the users stored in contextsession or from some
>> >> object.
>> >> If user is present then we validate else we don’t.
>> >>
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 29 november 2017 04:20
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hello Tim,
>> >>
>> >> Thank you for your help. :)
>> >>
>> >> I have used below method to fetch that text from message when client
>> >> publish on topic and it works.
>> >>
>> >> public void send(ProducerBrokerExchange producerExchange, Message
>> >> messageSend) throws Exception {
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>> >>
>> >>
>> >> ((ActiveMQTextMessage)messageSend).getText()
>> >> It returns the text from web console only.
>> >>
>> >>
>> >> Really appreciate your help here. :)
>> >>
>> >>
>> >>
>> >> Great, I'm glad I've been able to help.
>> >>
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> -----------------------
>> >>
>> >> Apart from this I have a situation here that when I try to execute
>> below
>> >> code:
>> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> >> creating a queue
>> >> 2. TextMessage claims = session.createTextMessage(payload); ---
>> >> converting
>> >> the string to message to send it on above made queue
>> >> 3. producer.send(dest, claims); --- send the message on
>> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> >> JWT_PAYLOAD
>> >> why?
>> >>
>> >>
>> >> What makes you think that this message on an advisory topic was your
>> >> message instead of a standard advisory message that's sent anytime a
>> >> non-anonymous producer sends a message? What makes you think that thos
>> >> message was sent instead of the message you sent to your queue, rather
>> >> than
>> >> sent *in addition to* the message on your queue? Can you share
>> >> before-and-after screenshots of your queue's row on the Queues page of
>> >> the
>> >> web console? And were there any warnings or errors logged in the
>> broker's
>> >> logs when this happened?
>> >>
>> >> 4. Before executing producer.send(dest, claims); ----- it is going on
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> >> returning null as it is again checking for Content and data. So my
ques
>> >> is
>> >> why it is going back again on first line? Why it is not simply putting
>> >> the
>> >> data on queue?
>> >>
>> >>
>> >> I didn't understand what you meant by "it is going back again on first
>> >> line." Are you saying that the broker is putting the original message
>> >> onto
>> >> your topic? If so, that's because by calling super.send(), you're
>> >> allowing
>> >> the publishing of the original message to the original topic to
>> >> continue. I
>> >> advised you to do that because I didn't realize that you wanted to
>> >> transform the message and publish it to a different destination, but
>> >> since
>> >> it seems like you do, I think you don't want to call super.send()
after
>> >> all.
>> >>
>> >> If that's not what you meant, then please help me to better understand
>> >> your
>> >> question.
>> >>
>> >> @Override
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> Message
>> >> messageSend) throws Exception {
>> >> if(messageSend != null)
>> >> {
>> >>        if(messageSend.getContent() != null)
>> >> {
>> >>        =               byte[] msg = ((ActiveMQMessage)
>> >> messageSend).getContent().data;
>> >>
>> >>                String message = new String(msg);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> message);
>> >>
>> >>                DecodedJWT jwt = JWT.decode(message);
>> >>                byte[] contentBytes = String.format("%s.%s",
>> >> jwt.getHeader(), jwt.getPayload())
>> >>                                .getBytes(StandardCharsets.UTF_8);
>> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> >> getSignature());
>> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>> >>                                + "please enter your key"
>> >>                                + "-----END PUBLIC KEY-----";
>> >>
>> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>> >>
>> >>                Security.addProvider(new BouncyCastleProvider());
>> >>                Signature signatureInstance =
>> >> Signature.getInstance("SHA256withRSA",
>> >> "BC");
>> >>                signatureInstance.initVerify(pk);
>> >>                signatureInstance.update(contentBytes);
>> >>                boolean result = signatureInstance.verify(
>> >> signatureBytes);
>> >>
>> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>> >>
>> >>                String payload = new String(pload);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> payload);
>> >>                logger.warn("result::::::::::::::::              " +
>> >> result);
>> >>                if (result = true) {
>> >>
>> >>                        // Create a ConnectionFactory
>> >>            ActiveMQConnectionFactory connectionFactory = new
>> >> ActiveMQConnectionFactory("vm://localhost");
>> >>
>> >>            // Create a Connection
>> >>            javax.jms.Connection jmsConnection = connectionFactory.
>> >> createConnection();
>> >>            jmsConnection.start();
>> >>
>> >>            // Create a Session
>> >>            Session session = jmsConnection.createSession(false,
>> >> Session.AUTO_ACKNOWLEDGE);
>> >>
>> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
>> >>                        MessageProducer producer =
>> >> session.createProducer(dest);
>> >>                        producer.setDeliveryMode(
>> >> DeliveryMode.PERSISTENT);
>> >>
>> >>                        TextMessage claims = session.createTextMessage(
>> >> payload);
>> >>                        claims.setJMSType("TEXT");
>> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>                        producer.send(dest, claims);
>> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>
>> >>
>> >> //
>> >>                        MessageConsumer consumer =
>> >> session.createConsumer(dest);
>> >>                        consumer.setMessageListener(this);
>> >>
>> >>                }
>> >>
>> >>                else {
>> >>
>> >>                        logger.warn("Else Authentication failed. Please
>> >> send Valid Token");
>> >>                }
>> >>
>> >>                super.send(producerExchange, messageSend);
>> >>                // getNext().send(producerExchange, messageSend);
>> >>
>> >>        }
>> >>
>> >>        else
>> >>        {
>> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>> >>        }
>> >>        }
>> >> else
>> >> {
>> >>        logger.fatal("MESSAGE SEND IS NULL");
>> >> }
>> >>        }
>> >>
>> >>        @Override
>> >>        public void onMessage(javax.jms.Message message) {
>> >>                  String messageText = null;
>> >>                try {
>> >>                    if (message instanceof TextMessage) {
>> >>                        TextMessage textMessage = (TextMessage)
message;
>> >>                        messageText = textMessage.getText();
>> >>                        System.out.println("messageText = " +
>> >> messageText);
>> >>                    }
>> >>                } catch (JMSException e) {
>> >>                    //Handle the exception appropriately
>> >>                }
>> >>        }
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
>> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 27 november 2017 08:12
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >> Thank you for providing that code. I spent some time running your
code,
>> >> and
>> >> found the following problems with it, which are causing this to not
>> work
>> >> as
>> >> you intended:
>> >>
>> >>   1. The signature for the send() method is "public void
>> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> >> throws
>> >>   Exception," not the signature you had defined. Because your
signature
>> >>   didn't match the method you were trying to override, you weren't
>> >> actually
>> >>   overriding a method that would be called when a message was sent,
but
>> >>   instead you were simply defining a public method that nothing ever
>> >> called.
>> >>   The compiler would have caught this for you if you'd annotated the
>> >> method
>> >>   as @Override; you should be using that annotation for all overriden
>> >>   methods, for exactly this reason.
>> >>   2. messageSend.getContent() returns null for the test message I sent
>> >> via
>> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> >> returns
>> >>   the body. I think this same code would work for an MQTT message, but
>> >> since
>> >>   I've never used MQTT you'll need to confirm that.
>> >>   3. I mentioned this earlier, but your send() method needs to call
>> >>   super.send() at the end, otherwise the broker's not going to process
>> >> any
>> >>   messages and you're going to be wondering why the broker "doesn't
>> >> work."
>> >>   This doesn't explain why you're not seeing your logging occur, but
>> >> once
>> >> we
>> >>   get past that problem, this is the next issue you're going to hit.
>> >>
>> >> Tim
>> >>
>> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
>> bharat.gupta@scania.com
>> >> <ma...@scania.com>>
>> >> wrote:
>> >>
>> >> Hello,
>> >>
>> >> MyBroker.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import java.util.HashMap;
>> >> import java.util.Map;
>> >>
>> >> import javax.jms.Destination;
>> >> import javax.jms.ExceptionListener;
>> >> import javax.jms.JMSException;
>> >> import javax.jms.MessageConsumer;
>> >> import javax.jms.Session;
>> >> import javax.jms.TextMessage;
>> >>
>> >> import org.apache.activemq.ActiveMQConnection;
>> >> import org.apache.activemq.ActiveMQConnectionFactory;
>> >> import org.apache.activemq.ActiveMQMessageConsumer;
>> >> import org.apache.activemq.broker.BrokerFilter;
>> >> import org.apache.activemq.broker.Connection;
>> >> import org.apache.activemq.broker.ConnectionContext;
>> >> import org.apache.activemq.broker.ProducerBrokerExchange;
>> >> import org.apache.activemq.broker.region.Subscription;
>> >> import org.apache.activemq.command.ActiveMQDestination;
>> >> import org.apache.activemq.command.ActiveMQMessage;
>> >> import org.apache.activemq.command.ConnectionInfo;
>> >> import org.apache.activemq.command.ConsumerInfo;
>> >> import org.apache.activemq.command.Message;
>> >> import org.apache.activemq.command.SessionInfo;
>> >> import org.apache.log4j.Logger;
>> >>
>> >>
>> >> public class MyBroker extends BrokerFilter {
>> >>
>> >>                final static Logger logger = Logger.getLogger(MyBroker.
>> >> class);
>> >>                private Map<String, String> userMap = new
>> >> HashMap<String,
>> >> String>();
>> >>
>> >>                public MyBroker(org.apache.activemq.broker.Broker
>> >> next)
>> >> {
>> >>                                super(next);
>> >>
>> >>                }
>> >>
>> >>
>> >>
>> >>                public void send(ProducerBrokerExchange
>> >> producerExchange,
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>                {
>> >>                                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                                  Message data =
>> >> messageSend.getMessage();
>> >>                                  logger.warn("
>> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> >> + data);
>> >>                                  String message = new
>> >> String(messageBytes);
>> >>                                  logger.warn("messageBody" + message);
>> >>                                  logger.info<http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>                                  logger.fatal("messageBody" +
>> >> message);
>> >>                                  logger.debug("messageBody" +
>> >> message);
>> >>
>> >>
>> >>                 }
>> >>
>> >>                public void addConnection(ConnectionContext context,
>> >> ConnectionInfo info)
>> >>            throws Exception {
>> >>
>> >>                                info.getUserName();
>> >>                                info.toString();
>> >>
>> >>
>> >>                                logger.warn("info1" +
>> >> info.getUserName());
>> >>                                logger.fatal("info2" +
>> >> info.toString());
>> >>
>> >>       String token = context.getUserName();
>> >>       logger.debug("token1" + token);
>> >>       logger.warn("token2" + token);
>> >>       logger.fatal("token3" + token);
>> >>
>> >>
>> >>        // Then call your parent
>> >>        super.addConnection(context, info);
>> >>    }
>> >>
>> >>    public Subscription addConsumer(ConnectionContext context,
>> >> ConsumerInfo info) throws Exception {
>> >>
>> >>
>> >>
>> >>        ActiveMQDestination dest = info.getDestination();
>> >>        Connection conn = context.getConnection();
>> >>        if (dest != null) {
>> >>            String destName = info.getDestination().getPhysicalName();
>> >>            String clientId = context.getClientId();
>> >>            String allowedDest = userMap.get(clientId);
>> >>
>> >>            logger.info<http://logger.info>(">>> Got Consumer Add
>> request
>> >> { Destination:
>> >> " +
>> >> destName
>> >>                    + ", Remote Address: " + conn.getRemoteAddress()
>> >>                    + ", ClientID: " + clientId
>> >>                    + " }");
>> >>            if (allowedDest != null && (allowedDest.equals("*") ||
>> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>> >>                logger.info<http://logger.info>(">>> Subscription
>> >> allowed");
>> >>            } else {
>> >>                logger.error(">>> Destination not allowed. Subscription
>> >> denied!");
>> >>                throw new Exception(">>> Subscription denied!");
>> >>            }
>> >>        } else {
>> >>            logger.error("<<< Got Consumer Add request from Remote
>> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>> >>        }
>> >>        return super.addConsumer(context, info);
>> >>    }
>> >> }
>> >>
>> >> Sample.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import org.apache.activemq.ActiveMQMessageProducer;
>> >> import org.apache.activemq.broker.Broker;
>> >> import org.apache.activemq.broker.BrokerPlugin;
>> >> import org.apache.log4j.Logger;
>> >>
>> >> public class Sample  implements BrokerPlugin {
>> >>
>> >>                final static Logger logger =
>> >> Logger.getLogger(Sample.class)
>> >> ;
>> >>
>> >>                public static void main(String[] args) {
>> >>
>> >>
>> >>                }
>> >>
>> >>                private void runMe(String parameter){
>> >>
>> >>                                if(logger.isDebugEnabled()){
>> >>                                                logger.debug("This is
>> >> debug : " + parameter);
>> >>                                }
>> >>
>> >>                                if(logger.isInfoEnabled()){
>> >>                                                logger.info<
>> http://logger.
>> >> info>("This is
>> >> info
>> >> : " + parameter);
>> >>                                }
>> >>
>> >>                                logger.warn("This is warn : " +
>> >> parameter);
>> >>                                logger.error("This is error : " +
>> >> parameter);
>> >>                                logger.fatal("This is fatal : " +
>> >> parameter);
>> >>
>> >>                }
>> >>
>> >>                public Broker installPlugin(Broker broker) throws
>> >> Exception {
>> >>                                Sample sample = new Sample();
>> >>                                sample.runMe("ActiveMQ Hello");
>> >>
>> >>                                return new MyBroker(broker);
>> >>                }
>> >>
>> >>
>> >> }
>> >>
>> >> The above are two classes I have implemented for my custom plugin.
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim
>> >> Bain
>> >> Sent: Sunday, November 26, 2017 4:31 AM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >> hello Tim,
>> >>
>> >>
>> >>
>> >> My Custom Plugin is getting installed as I am using log4j to print
>> >> random
>> >> stuff and its getting printed in logs.
>> >> Can you please describe in more detail exactly what methods that
>> >> logging
>> >> is done in and how it proves that the plugin was actually installed?
If
>> >> (for example) your logging is only in your constructor or your
>> >> initialization method, that just proves that Spring made your bean,
not
>> >> that it was installed in the broker as a plugin.
>> >>
>> >> I am hereby attaching my codes that you can see.
>> >> Where? All I see is your activemq.xml snippet below, but no actual
code
>> >> for your plugin.
>> >>
>> >> activemq.xml configurations:
>> >>
>> >> <plugins>
>> >>
>> >>                               <bean id="sample"
>> >>
>> >>                                class="jwt.validation.Sample"
>> >>
>> >>                                xmlns="http://www.
>> >> springframework.org/schema/beans<http://springframework.org/
>> schema/beans
>> >> >"/>
>> >>
>> >>                               </plugins>
>> >>
>> >>
>> >>
>> >> Also I would like to explain you my exact requirement.
>> >>
>> >>
>> >>
>> >> The diagram below shows what I am trying to do it now.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> [cid:image001.png@01D3658E.4A6B3E20]
>> >> That sounds like it should be doable via an interceptor based on what
I
>> >> know about them (i.e. the wiki, but no hands-on experience).
>> >>
>> >> QUESTIONS:
>> >>
>> >>
>> >>
>> >> 1.       how can we provide JWT to custom plugin from client?
>> >> If you have to use MQTT, you'll need to encode it directly into the
>> >> message body, because that's all MQTT supports. You could for example
>> >> make
>> >> a JSON payload with two fields: the JWT and the message body. Or you
>> >> could
>> >> switch to OpenWire and put the JWT into a custom header on the message
>> >> the
>> >> client is sending.
>> >>
>> >> 2.       do we need to store jwt in topic first and then consume it
>> >> from
>> >> topic to validate it? (not idle case)
>> >> You need to put the JWT into the message itself so that your plugin
can
>> >> evaluate the token and then decide what to do with the message based
on
>> >> that evaluation.
>> >>
>> >> 3.       can we call restful service from activeMQ broker that can
>> >> validate token and gives the result back to broker?
>> >> Yes, as far as I know, you'd be able to do that from within the
broker.
>> >> (I've never done that, but I'm not aware of anything that would
prevent
>> >> you
>> >> from doing it.)
>> >>
>> >> Tim please let me know if I am clear with my requirements. Else we can
>> >> talk more on call/phone.
>> >>
>> >>
>> >>
>> >> Thanks in advance
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>]
>> >> On Behalf Of Tim Bain
>> >> Sent: Friday, November 24, 2017 7:19 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>
>> >>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> 1. Your send() method needs to call super.send() after doing your
>> >> custom
>> >>
>> >> work, otherwise the message will never be sent to the real Broker
>> >> object.
>> >>
>> >> Please review the wiki page I referred to earlier, which covers how to
>> >>
>> >> implement an interceptor.
>> >>
>> >>
>> >>
>> >> 2. To me it sounds like your plugin isn't getting installed. Do you
>> >> have
>> >>
>> >> any indication that it is, from logs or some other mechanism? And can
>> >> you
>> >>
>> >> please share the code of the class that implements BrokerPlugin, to
>> >> confirm
>> >>
>> >> that your installPlugin() method looks right, and the XML block where
>> >> you
>> >>
>> >> create the plugin bean?
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I tried implementing the method as below:
>> >>
>> >>
>> >>
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> >>
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>
>> >>         {
>> >>
>> >>                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                  String message = new String(messageBytes);
>> >>
>> >>                  logger.info<http://logger.info><http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>
>> >>        }
>> >>
>> >>
>> >>
>> >> Also I am publishing a message on a topic even though this send()
>> >> method
>> >>
>> >> is not been called as logger.info<http://logger.info><
>> http://logger.info>
>> >> is not getting
>> >> printed in my Custom
>> >>
>> >> Plugin.
>> >>
>> >>
>> >>
>> >> Could you please help me on this?
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>> >>
>> >> Sent: Friday, November 24, 2017 7:15 PM
>> >>
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>>
>> >>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> As I said in your other thread, you would do that by implementing
>> >> code
>> >> in
>> >>
>> >> the send() method of your subclass of BrokerFilter, which you would
>> >> create
>> >>
>> >> and return in your installPlugin() method.
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I have a scenario as follows:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 1.       I have Custom Plugins that decrypts the data and validates
>> >> it.
>> >>
>> >>
>> >>
>> >> 2.       I am getting Encrypted data (token) from user that need to
>> >> be
>> >>
>> >> decrypted on custom plugin.
>> >>
>> >>
>> >>
>> >> 3.       Client is accessing the broker using mqtt protocol
>> >>
>> >>
>> >>
>> >> Need Solution for the following:
>> >>
>> >>
>> >>
>> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>> >>
>> >> validate the  data(token) in my custom plugin
>> >>
>> >>
>> >>
>> >> 2.       How to extract a data what customer is sending? So that I
>> >> can
>> >>
>> >> extract the data, decrypt the message and validate.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Implementation so far:
>> >>
>> >>
>> >>
>> >> 1.       Custom Plugin is ready and JAR has been added in
>> >> <ActiveMQ>/libs
>> >>
>> >>
>> >>
>> >> 2.       Added the plugin configuration in activemq.xml
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Could anyone help me with a solution for the same as it's critical
>> >> case.
>> >>
>> >>
>> >>
>> >> Thank you In Advance
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com<mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>

RE: ActiveMQ custom plugin

Posted by Gupta Bharat <bh...@scania.com>.
Hi Tim,

I have made a custom processor and trying to add headers to the message before routing it to the IBM MQ using Camel.

<bean id="myProcessor" class="CustomProcessor">
</bean>

	<camelContext trace="false" id="wmqToAmqContext"
		xmlns="http://camel.apache.org/schema/blueprint">
		<route id="wmqToAmqBridge">
			<from uri="activemq:topic:fma/1.0/st5/a1/fla5i3"/>
			<process ref="myProcessor"/>
			<log message="The message contains ${body}" />
			<to uri="websphere:queue:LQ.SCCO3879.ST5" />
		</route>
	</camelContext>
--------------------------------------------------------------------------------------------------------------------------
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;

public class CustomProcessor implements Processor  {

	@Override
	public void process(Exchange exchange) throws Exception {
		// TODO Auto-generated method stub
		//exchange.getIn().setProperty("JMSDestination1", "fma/1.0/st5/a1/fla5i3");
	Message m = exchange.getIn();
	m.setHeader("JMSDestination2", "fma/1.0/st5/a2/fla5i3");
	System.out.println("MESSAGE is:  " + m.getHeaders().toString());


	}
}

I have added the Class and xml configuration.

But when message reaches IBM MQ it takes the JMS Destination as the queue:/// LQ.SCCO3879.ST5 instead of topic:/// fma/1.0/st5/a2/fla5i3 (What I am setting it up here in camel).

Could you please let me know where I am going wrong or missing something?

Thanks in Advance

Regards,
Bharat Gupta

-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 2 februari 2018 14:29
To: ActiveMQ Users <us...@activemq.apache.org>
Subject: RE: ActiveMQ custom plugin

OK, great. In that case you would probably want to make a custom processor
in Camel that transforms the message however you need it to, and insert the
processor in the route before the <to>.

Tim

On Feb 2, 2018 1:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

Yes I am using 5.x currently.
Using Apache Camel I am routing messages from ActiveMQ to IBM MQ.

        <!-- Configure IBM WebSphere MQ connection factory -->
        <bean id="websphereConnectionFactory" class="com.ibm.mq.jms.
MQConnectionFactory">
                <property name="transportType" value="1" />
                <property name="hostName" value="SC1234MC.sss.se.scania.com"
/>
                <property name="port" value="1414" />
                <property name="queueManager" value="SC1234MC" />
        </bean>

        <bean id="websphereConfig" class="org.apache.camel.component.jms.
JmsConfiguration">
                <property name="connectionFactory"
ref="websphereConnectionFactory"
/>
                <property name="concurrentConsumers" value="1" />
        </bean>

        <bean id="websphere" class="org.apache.camel.
component.jms.JmsComponent">
                <property name="configuration" ref="websphereConfig" />
        </bean>

        <camelContext trace="false" id="wmqToAmqContext"
                xmlns="http://camel.apache.org/schema/blueprint">
                <route id="wmqToAmqBridge">
                        <from uri="activemq:topic:demo" />
                        <log message="The message contains ${body}" />
                        <to uri="websphere:queue:LQ.SCCO3879.ST5" />
                </route>
        </camelContext>

Regards,
Bharat Gupta
Development & Support | Platform Technician, IXCB | Scania IT
Mobile: +46700869007, +91-9718483802
bharat.gupta@scania.com


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 2 februari 2018 07:06
To: ActiveMQ Users <us...@activemq.apache.org>
Subject: RE: ActiveMQ custom plugin

Let's go back to basics.

Are you using 5.x or Artemis?

You say you're routing messages from ActiveMQ to IBM MQ. How is that being
done?

Tim


On Feb 1, 2018 7:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

I don't wish to add headers in the message I pasted. This message I am
getting from user and it is content. Even the tag header is part of
content. But when I route the message from Active MQ to IBM MQ certain
attributes like destination topic name and message id need to be added.

Also I am using MQTT client to publish a message on ActiveMQ specifying the
topic name and message. I need to add that topic name as destination and
also want to remove JWTtoken from message.

Publication:
Topic: Demo
Message: {"header":{"messageId":"fcbef565-18ea-429a-836f-
7e24d9b53743","jwtToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIs
ImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIs
IkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAt
OTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNl
IjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRB
Y2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkx
MDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwi
aXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoi
MmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjox
NTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7Bx
A6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_
0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_
VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_
xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_
LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-
TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd
73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vs
rcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_
Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpI
vI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-
tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47k
flNNwt1_QVo","correlId":"","initialMessageid":"fcbef565-
18ea-429a-836f-7e24d9b53743","environment":"st5","producerUTCTimestamp":
1515677099337,"contractId":"SCCO3822","producerVer":"1.0","messageType":"
SendChatMessageInConversationMessage","appId":"fma","messageTypeVer":"1.0","
receivers":[]},"body":{"conversationId":"2b575462-
97bd-4e9a-8ac4-6fec793c836a","chatMessageId":"098ee4e7-8976-
4c21-8f0a-521873fd6ac5","content":"grte","attachments":[]}}


I need *Demo* to be added in headers and remove jwtToken from message. I
removed it. But what method I can use in ActiveMQ to publish it on Topic
Demo instead of message with jwtToken value.

I Hope I am able to explain you better :)

Regards,
Bharat Gupta


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 1 februari 2018 15:02
To: ActiveMQ Users <us...@activemq.apache.org>
Cc: users-owner@activemq.apache.org
Subject: RE: ActiveMQ custom plugin

Oh, and I missed your second question. I would expect that you could add
headers similar to how the code you posted removed some. Does your question
mean that you tried that and it didn't work? If so, how did it fail?

Tim

On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> Is this in 5.x, or did you switch to Artemis?
>
> Your code is operating on a message, but what called your code? We'd need
> some context on how you got that message to know what you should do with
it
> next.
>
> Tim
>
> On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Hello Tim,
>>
>> I am getting following message from client using MQTT
>>
>> {
>>         "header": {
>>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
>> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
>> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
>> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
>> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
>> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
>> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
>> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
>> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
>> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
>> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
>> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
>> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
>> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
>> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
>> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
>> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
>> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
>> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
>> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
>> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
>> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
>> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>>                 "correlId": "",
>>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
>> 9b53743",
>>                 "environment": "st5",
>>                 "producerUTCTimestamp": 1515677099337,
>>                 "contractId": "SCCO3822",
>>                 "producerVer": "1.0",
>>                 "messageType": "SendChatMessageInConversationMessage",
>>                 "appId": "fma",
>>                 "messageTypeVer": "1.0",
>>                 "receivers": []
>>         },
>>         "body": {
>>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>>                 "content": "grte",
>>                 "attachments": []
>>         }
>> }
>>
>> I am validating the message by validating the jwt token. I don’t want
>> jwtToken field in message once I have validate it and used following to
>> remove it:
>>
>> for (JsonNode jsonNode : jsonNodeRoot) {
>>            if (jsonNode instanceof ObjectNode) {
>>                ObjectNode o = (ObjectNode) jsonNode;
>>                o.remove("jwtToken");
>>
>>            }
>>        }
>>
>> But how to publish a message on topic once I have done the following
>> checks on it? What method I can use here?
>>
>> Also I wish to add certain attributes in the message header and then
>> publish on the topic how I can do that also?
>>
>> Thank You in Advance
>>
>> Regards,
>> Bharat Gupta
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 2 januari 2018 06:27
>> To: ActiveMQ Users <us...@activemq.apache.org>
>> Cc: users-owner@activemq.apache.org
>> Subject: Re: ActiveMQ custom plugin
>>
>> I spent a little time this evening looking through the ActiveMQ 5.x code
>> and didn't find an obvious way to hook into the MQTT-specific pieces, so
>> switching to Artemis may be your best bet.
>>
>> Tim
>>
>> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>>
>> > Bharat,
>> >
>> > I hadn't caught that this question was about making the connection
>> rather
>> > vs. the first question about sending messages across it; thanks for
>> helping
>> > me understand your question.
>> >
>> > As far as I know, the interception capabilities of 5.x apply only to
the
>> > core broker using the interface you used in the earlier messages in
this
>> > thread, but not to the code that translates non-OpenWire protocols such
>> as
>> > MQTT into OpenWire. I'll need to spend some time digging through the
>> code
>> > to make sure there isn't an MQTT plugin capability I don't know about,
>> and
>> > I probably won't get a chance to do that until the weekend. But unless
I
>> > find something unexpected when I do that digging, what you want may not
>> be
>> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
>> > everything you're trying to do, then switching to it may be a good
>> option.
>> >
>> > Tim
>> >
>> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
>> wrote:
>> >
>> >> Yes the question I asked here is not answered earlier. In previous
>> >> threads/mail focus was on when client was publishing a message on
>> topic the
>> >> activemq.send method was called to intercept the message before it
>> actually
>> >> published on topic.
>> >>
>> >> Here I am majorly focusing on intercepting mqtt connections, which
>> means
>> >> intercepting the client request to activemq and Call my plugin there.
>> So
>> >> which method of activemq can be used here?
>> >>
>> >> As I went thru many solutions over internet and see Artemis as an
>> option.
>> >>
>> >> I hope I am able to put my point clear now. :) please let me know if
>> more
>> >> info is needed from my end.
>> >>
>> >>
>> >>
>> >> Sent from my iPhone
>> >>
>> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> >> tbain@alumni.duke.edu>> wrote:
>> >>
>> >> Is there some aspect of your question that's not answered by the first
>> >> 12(!) emails in the thread? I'm not clear why you're asking what
>> appears
>> >> to
>> >> be the same question again. If there's some new aspect of the question
>> or
>> >> something that wasn't previously answered, please highlight what it
is.
>> >>
>> >> And no, I don't believe that Artemis is required to do what you're
>> trying
>> >> to do. It might be equally possible to do in Artemis compared to doing
>> in
>> >> 5.x (I don't know Artemis well enough to comment on whether this can
be
>> >> done in Artemis), but you definitely don't "have to use Artemis here
to
>> >> achieve this."
>> >>
>> >> Tim
>> >>
>> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> hello again,
>> >>
>> >> I am asking my question here again if you can possibly help me with a
>> >> method.
>> >>
>> >> 1. Need to intercept the Incoming connections from MQTT clients.
>> >> User is connecting to activemq broker by hitting on url and sending a
>> >> TOKEN [(hostname:port) + token]
>> >>
>> >> How can we intercept the connections and validate the token sent by
>> mqtt
>> >> client?
>> >>
>> >> I have my own custom plugin that will validate the token. Just Need to
>> >> know method on which we can call that Plugin.
>> >>
>> >> Also do we have to use Artemis here to achieve this?
>> >>
>> >> Thanks In Advance
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: Tuesday, December 5, 2017 7:29 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> I'd suggest that you store your cache of known credentials in your
>> plugin.
>> >> I'm not sure that you'd have access to the web session from a plugin,
>> >> because that's MQTT-specific, so I think your best bet would be to
>> store
>> >> it
>> >> in a Map (better: a Guava cache, so you get free age-off behavior)
>> within
>> >> your plugin.
>> >>
>> >> Tim
>> >>
>> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hi Tim,
>> >>
>> >> I am having a scenario here. Using custom plugin I am validating my
JWT
>> >> tokens and fetching the claims from it.
>> >>
>> >> Claims:
>> >>
>> >> {
>> >>  "unique_name": "gubhpi",
>> >>  "sub": "gubhpi",
>> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>> >>  "AdAccount": "bguvvw",
>> >>  "FunctionalPermissions": "490879",
>> >>  "UserPermissions": [
>> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
>> >>    "1006"
>> >>  ],
>> >>  "iss": "https://xyz/",
>> >>  "aud": "58b99b37-db1c78d7fef5",
>> >>  "exp": 1510240047,
>> >>  "nbf": 1510236447
>> >> }
>> >>
>> >> From this I need to fetch "AdAccount": "bguvvw", and store it
>> >> somewhere(please suggest me-- context or session) and when next time
>> user
>> >> sends me message on activemq using mqtt or web socket I need to check
>> the
>> >> message header with the users stored in contextsession or from some
>> >> object.
>> >> If user is present then we validate else we don’t.
>> >>
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 29 november 2017 04:20
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hello Tim,
>> >>
>> >> Thank you for your help. :)
>> >>
>> >> I have used below method to fetch that text from message when client
>> >> publish on topic and it works.
>> >>
>> >> public void send(ProducerBrokerExchange producerExchange, Message
>> >> messageSend) throws Exception {
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>> >>
>> >>
>> >> ((ActiveMQTextMessage)messageSend).getText()
>> >> It returns the text from web console only.
>> >>
>> >>
>> >> Really appreciate your help here. :)
>> >>
>> >>
>> >>
>> >> Great, I'm glad I've been able to help.
>> >>
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> -----------------------
>> >>
>> >> Apart from this I have a situation here that when I try to execute
>> below
>> >> code:
>> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> >> creating a queue
>> >> 2. TextMessage claims = session.createTextMessage(payload); ---
>> >> converting
>> >> the string to message to send it on above made queue
>> >> 3. producer.send(dest, claims); --- send the message on
>> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> >> JWT_PAYLOAD
>> >> why?
>> >>
>> >>
>> >> What makes you think that this message on an advisory topic was your
>> >> message instead of a standard advisory message that's sent anytime a
>> >> non-anonymous producer sends a message? What makes you think that thos
>> >> message was sent instead of the message you sent to your queue, rather
>> >> than
>> >> sent *in addition to* the message on your queue? Can you share
>> >> before-and-after screenshots of your queue's row on the Queues page of
>> >> the
>> >> web console? And were there any warnings or errors logged in the
>> broker's
>> >> logs when this happened?
>> >>
>> >> 4. Before executing producer.send(dest, claims); ----- it is going on
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> >> returning null as it is again checking for Content and data. So my
ques
>> >> is
>> >> why it is going back again on first line? Why it is not simply putting
>> >> the
>> >> data on queue?
>> >>
>> >>
>> >> I didn't understand what you meant by "it is going back again on first
>> >> line." Are you saying that the broker is putting the original message
>> >> onto
>> >> your topic? If so, that's because by calling super.send(), you're
>> >> allowing
>> >> the publishing of the original message to the original topic to
>> >> continue. I
>> >> advised you to do that because I didn't realize that you wanted to
>> >> transform the message and publish it to a different destination, but
>> >> since
>> >> it seems like you do, I think you don't want to call super.send()
after
>> >> all.
>> >>
>> >> If that's not what you meant, then please help me to better understand
>> >> your
>> >> question.
>> >>
>> >> @Override
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> Message
>> >> messageSend) throws Exception {
>> >> if(messageSend != null)
>> >> {
>> >>        if(messageSend.getContent() != null)
>> >> {
>> >>        =               byte[] msg = ((ActiveMQMessage)
>> >> messageSend).getContent().data;
>> >>
>> >>                String message = new String(msg);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> message);
>> >>
>> >>                DecodedJWT jwt = JWT.decode(message);
>> >>                byte[] contentBytes = String.format("%s.%s",
>> >> jwt.getHeader(), jwt.getPayload())
>> >>                                .getBytes(StandardCharsets.UTF_8);
>> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> >> getSignature());
>> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>> >>                                + "please enter your key"
>> >>                                + "-----END PUBLIC KEY-----";
>> >>
>> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>> >>
>> >>                Security.addProvider(new BouncyCastleProvider());
>> >>                Signature signatureInstance =
>> >> Signature.getInstance("SHA256withRSA",
>> >> "BC");
>> >>                signatureInstance.initVerify(pk);
>> >>                signatureInstance.update(contentBytes);
>> >>                boolean result = signatureInstance.verify(
>> >> signatureBytes);
>> >>
>> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>> >>
>> >>                String payload = new String(pload);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> payload);
>> >>                logger.warn("result::::::::::::::::              " +
>> >> result);
>> >>                if (result = true) {
>> >>
>> >>                        // Create a ConnectionFactory
>> >>            ActiveMQConnectionFactory connectionFactory = new
>> >> ActiveMQConnectionFactory("vm://localhost");
>> >>
>> >>            // Create a Connection
>> >>            javax.jms.Connection jmsConnection = connectionFactory.
>> >> createConnection();
>> >>            jmsConnection.start();
>> >>
>> >>            // Create a Session
>> >>            Session session = jmsConnection.createSession(false,
>> >> Session.AUTO_ACKNOWLEDGE);
>> >>
>> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
>> >>                        MessageProducer producer =
>> >> session.createProducer(dest);
>> >>                        producer.setDeliveryMode(
>> >> DeliveryMode.PERSISTENT);
>> >>
>> >>                        TextMessage claims = session.createTextMessage(
>> >> payload);
>> >>                        claims.setJMSType("TEXT");
>> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>                        producer.send(dest, claims);
>> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>
>> >>
>> >> //
>> >>                        MessageConsumer consumer =
>> >> session.createConsumer(dest);
>> >>                        consumer.setMessageListener(this);
>> >>
>> >>                }
>> >>
>> >>                else {
>> >>
>> >>                        logger.warn("Else Authentication failed. Please
>> >> send Valid Token");
>> >>                }
>> >>
>> >>                super.send(producerExchange, messageSend);
>> >>                // getNext().send(producerExchange, messageSend);
>> >>
>> >>        }
>> >>
>> >>        else
>> >>        {
>> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>> >>        }
>> >>        }
>> >> else
>> >> {
>> >>        logger.fatal("MESSAGE SEND IS NULL");
>> >> }
>> >>        }
>> >>
>> >>        @Override
>> >>        public void onMessage(javax.jms.Message message) {
>> >>                  String messageText = null;
>> >>                try {
>> >>                    if (message instanceof TextMessage) {
>> >>                        TextMessage textMessage = (TextMessage)
message;
>> >>                        messageText = textMessage.getText();
>> >>                        System.out.println("messageText = " +
>> >> messageText);
>> >>                    }
>> >>                } catch (JMSException e) {
>> >>                    //Handle the exception appropriately
>> >>                }
>> >>        }
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
>> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 27 november 2017 08:12
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >> Thank you for providing that code. I spent some time running your
code,
>> >> and
>> >> found the following problems with it, which are causing this to not
>> work
>> >> as
>> >> you intended:
>> >>
>> >>   1. The signature for the send() method is "public void
>> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> >> throws
>> >>   Exception," not the signature you had defined. Because your
signature
>> >>   didn't match the method you were trying to override, you weren't
>> >> actually
>> >>   overriding a method that would be called when a message was sent,
but
>> >>   instead you were simply defining a public method that nothing ever
>> >> called.
>> >>   The compiler would have caught this for you if you'd annotated the
>> >> method
>> >>   as @Override; you should be using that annotation for all overriden
>> >>   methods, for exactly this reason.
>> >>   2. messageSend.getContent() returns null for the test message I sent
>> >> via
>> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> >> returns
>> >>   the body. I think this same code would work for an MQTT message, but
>> >> since
>> >>   I've never used MQTT you'll need to confirm that.
>> >>   3. I mentioned this earlier, but your send() method needs to call
>> >>   super.send() at the end, otherwise the broker's not going to process
>> >> any
>> >>   messages and you're going to be wondering why the broker "doesn't
>> >> work."
>> >>   This doesn't explain why you're not seeing your logging occur, but
>> >> once
>> >> we
>> >>   get past that problem, this is the next issue you're going to hit.
>> >>
>> >> Tim
>> >>
>> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
>> bharat.gupta@scania.com
>> >> <ma...@scania.com>>
>> >> wrote:
>> >>
>> >> Hello,
>> >>
>> >> MyBroker.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import java.util.HashMap;
>> >> import java.util.Map;
>> >>
>> >> import javax.jms.Destination;
>> >> import javax.jms.ExceptionListener;
>> >> import javax.jms.JMSException;
>> >> import javax.jms.MessageConsumer;
>> >> import javax.jms.Session;
>> >> import javax.jms.TextMessage;
>> >>
>> >> import org.apache.activemq.ActiveMQConnection;
>> >> import org.apache.activemq.ActiveMQConnectionFactory;
>> >> import org.apache.activemq.ActiveMQMessageConsumer;
>> >> import org.apache.activemq.broker.BrokerFilter;
>> >> import org.apache.activemq.broker.Connection;
>> >> import org.apache.activemq.broker.ConnectionContext;
>> >> import org.apache.activemq.broker.ProducerBrokerExchange;
>> >> import org.apache.activemq.broker.region.Subscription;
>> >> import org.apache.activemq.command.ActiveMQDestination;
>> >> import org.apache.activemq.command.ActiveMQMessage;
>> >> import org.apache.activemq.command.ConnectionInfo;
>> >> import org.apache.activemq.command.ConsumerInfo;
>> >> import org.apache.activemq.command.Message;
>> >> import org.apache.activemq.command.SessionInfo;
>> >> import org.apache.log4j.Logger;
>> >>
>> >>
>> >> public class MyBroker extends BrokerFilter {
>> >>
>> >>                final static Logger logger = Logger.getLogger(MyBroker.
>> >> class);
>> >>                private Map<String, String> userMap = new
>> >> HashMap<String,
>> >> String>();
>> >>
>> >>                public MyBroker(org.apache.activemq.broker.Broker
>> >> next)
>> >> {
>> >>                                super(next);
>> >>
>> >>                }
>> >>
>> >>
>> >>
>> >>                public void send(ProducerBrokerExchange
>> >> producerExchange,
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>                {
>> >>                                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                                  Message data =
>> >> messageSend.getMessage();
>> >>                                  logger.warn("
>> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> >> + data);
>> >>                                  String message = new
>> >> String(messageBytes);
>> >>                                  logger.warn("messageBody" + message);
>> >>                                  logger.info<http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>                                  logger.fatal("messageBody" +
>> >> message);
>> >>                                  logger.debug("messageBody" +
>> >> message);
>> >>
>> >>
>> >>                 }
>> >>
>> >>                public void addConnection(ConnectionContext context,
>> >> ConnectionInfo info)
>> >>            throws Exception {
>> >>
>> >>                                info.getUserName();
>> >>                                info.toString();
>> >>
>> >>
>> >>                                logger.warn("info1" +
>> >> info.getUserName());
>> >>                                logger.fatal("info2" +
>> >> info.toString());
>> >>
>> >>       String token = context.getUserName();
>> >>       logger.debug("token1" + token);
>> >>       logger.warn("token2" + token);
>> >>       logger.fatal("token3" + token);
>> >>
>> >>
>> >>        // Then call your parent
>> >>        super.addConnection(context, info);
>> >>    }
>> >>
>> >>    public Subscription addConsumer(ConnectionContext context,
>> >> ConsumerInfo info) throws Exception {
>> >>
>> >>
>> >>
>> >>        ActiveMQDestination dest = info.getDestination();
>> >>        Connection conn = context.getConnection();
>> >>        if (dest != null) {
>> >>            String destName = info.getDestination().getPhysicalName();
>> >>            String clientId = context.getClientId();
>> >>            String allowedDest = userMap.get(clientId);
>> >>
>> >>            logger.info<http://logger.info>(">>> Got Consumer Add
>> request
>> >> { Destination:
>> >> " +
>> >> destName
>> >>                    + ", Remote Address: " + conn.getRemoteAddress()
>> >>                    + ", ClientID: " + clientId
>> >>                    + " }");
>> >>            if (allowedDest != null && (allowedDest.equals("*") ||
>> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>> >>                logger.info<http://logger.info>(">>> Subscription
>> >> allowed");
>> >>            } else {
>> >>                logger.error(">>> Destination not allowed. Subscription
>> >> denied!");
>> >>                throw new Exception(">>> Subscription denied!");
>> >>            }
>> >>        } else {
>> >>            logger.error("<<< Got Consumer Add request from Remote
>> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>> >>        }
>> >>        return super.addConsumer(context, info);
>> >>    }
>> >> }
>> >>
>> >> Sample.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import org.apache.activemq.ActiveMQMessageProducer;
>> >> import org.apache.activemq.broker.Broker;
>> >> import org.apache.activemq.broker.BrokerPlugin;
>> >> import org.apache.log4j.Logger;
>> >>
>> >> public class Sample  implements BrokerPlugin {
>> >>
>> >>                final static Logger logger =
>> >> Logger.getLogger(Sample.class)
>> >> ;
>> >>
>> >>                public static void main(String[] args) {
>> >>
>> >>
>> >>                }
>> >>
>> >>                private void runMe(String parameter){
>> >>
>> >>                                if(logger.isDebugEnabled()){
>> >>                                                logger.debug("This is
>> >> debug : " + parameter);
>> >>                                }
>> >>
>> >>                                if(logger.isInfoEnabled()){
>> >>                                                logger.info<
>> http://logger.
>> >> info>("This is
>> >> info
>> >> : " + parameter);
>> >>                                }
>> >>
>> >>                                logger.warn("This is warn : " +
>> >> parameter);
>> >>                                logger.error("This is error : " +
>> >> parameter);
>> >>                                logger.fatal("This is fatal : " +
>> >> parameter);
>> >>
>> >>                }
>> >>
>> >>                public Broker installPlugin(Broker broker) throws
>> >> Exception {
>> >>                                Sample sample = new Sample();
>> >>                                sample.runMe("ActiveMQ Hello");
>> >>
>> >>                                return new MyBroker(broker);
>> >>                }
>> >>
>> >>
>> >> }
>> >>
>> >> The above are two classes I have implemented for my custom plugin.
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim
>> >> Bain
>> >> Sent: Sunday, November 26, 2017 4:31 AM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >> hello Tim,
>> >>
>> >>
>> >>
>> >> My Custom Plugin is getting installed as I am using log4j to print
>> >> random
>> >> stuff and its getting printed in logs.
>> >> Can you please describe in more detail exactly what methods that
>> >> logging
>> >> is done in and how it proves that the plugin was actually installed?
If
>> >> (for example) your logging is only in your constructor or your
>> >> initialization method, that just proves that Spring made your bean,
not
>> >> that it was installed in the broker as a plugin.
>> >>
>> >> I am hereby attaching my codes that you can see.
>> >> Where? All I see is your activemq.xml snippet below, but no actual
code
>> >> for your plugin.
>> >>
>> >> activemq.xml configurations:
>> >>
>> >> <plugins>
>> >>
>> >>                               <bean id="sample"
>> >>
>> >>                                class="jwt.validation.Sample"
>> >>
>> >>                                xmlns="http://www.
>> >> springframework.org/schema/beans<http://springframework.org/
>> schema/beans
>> >> >"/>
>> >>
>> >>                               </plugins>
>> >>
>> >>
>> >>
>> >> Also I would like to explain you my exact requirement.
>> >>
>> >>
>> >>
>> >> The diagram below shows what I am trying to do it now.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> [cid:image001.png@01D3658E.4A6B3E20]
>> >> That sounds like it should be doable via an interceptor based on what
I
>> >> know about them (i.e. the wiki, but no hands-on experience).
>> >>
>> >> QUESTIONS:
>> >>
>> >>
>> >>
>> >> 1.       how can we provide JWT to custom plugin from client?
>> >> If you have to use MQTT, you'll need to encode it directly into the
>> >> message body, because that's all MQTT supports. You could for example
>> >> make
>> >> a JSON payload with two fields: the JWT and the message body. Or you
>> >> could
>> >> switch to OpenWire and put the JWT into a custom header on the message
>> >> the
>> >> client is sending.
>> >>
>> >> 2.       do we need to store jwt in topic first and then consume it
>> >> from
>> >> topic to validate it? (not idle case)
>> >> You need to put the JWT into the message itself so that your plugin
can
>> >> evaluate the token and then decide what to do with the message based
on
>> >> that evaluation.
>> >>
>> >> 3.       can we call restful service from activeMQ broker that can
>> >> validate token and gives the result back to broker?
>> >> Yes, as far as I know, you'd be able to do that from within the
broker.
>> >> (I've never done that, but I'm not aware of anything that would
prevent
>> >> you
>> >> from doing it.)
>> >>
>> >> Tim please let me know if I am clear with my requirements. Else we can
>> >> talk more on call/phone.
>> >>
>> >>
>> >>
>> >> Thanks in advance
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>]
>> >> On Behalf Of Tim Bain
>> >> Sent: Friday, November 24, 2017 7:19 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>
>> >>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> 1. Your send() method needs to call super.send() after doing your
>> >> custom
>> >>
>> >> work, otherwise the message will never be sent to the real Broker
>> >> object.
>> >>
>> >> Please review the wiki page I referred to earlier, which covers how to
>> >>
>> >> implement an interceptor.
>> >>
>> >>
>> >>
>> >> 2. To me it sounds like your plugin isn't getting installed. Do you
>> >> have
>> >>
>> >> any indication that it is, from logs or some other mechanism? And can
>> >> you
>> >>
>> >> please share the code of the class that implements BrokerPlugin, to
>> >> confirm
>> >>
>> >> that your installPlugin() method looks right, and the XML block where
>> >> you
>> >>
>> >> create the plugin bean?
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I tried implementing the method as below:
>> >>
>> >>
>> >>
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> >>
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>
>> >>         {
>> >>
>> >>                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                  String message = new String(messageBytes);
>> >>
>> >>                  logger.info<http://logger.info><http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>
>> >>        }
>> >>
>> >>
>> >>
>> >> Also I am publishing a message on a topic even though this send()
>> >> method
>> >>
>> >> is not been called as logger.info<http://logger.info><
>> http://logger.info>
>> >> is not getting
>> >> printed in my Custom
>> >>
>> >> Plugin.
>> >>
>> >>
>> >>
>> >> Could you please help me on this?
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>> >>
>> >> Sent: Friday, November 24, 2017 7:15 PM
>> >>
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>>
>> >>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> As I said in your other thread, you would do that by implementing
>> >> code
>> >> in
>> >>
>> >> the send() method of your subclass of BrokerFilter, which you would
>> >> create
>> >>
>> >> and return in your installPlugin() method.
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I have a scenario as follows:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 1.       I have Custom Plugins that decrypts the data and validates
>> >> it.
>> >>
>> >>
>> >>
>> >> 2.       I am getting Encrypted data (token) from user that need to
>> >> be
>> >>
>> >> decrypted on custom plugin.
>> >>
>> >>
>> >>
>> >> 3.       Client is accessing the broker using mqtt protocol
>> >>
>> >>
>> >>
>> >> Need Solution for the following:
>> >>
>> >>
>> >>
>> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>> >>
>> >> validate the  data(token) in my custom plugin
>> >>
>> >>
>> >>
>> >> 2.       How to extract a data what customer is sending? So that I
>> >> can
>> >>
>> >> extract the data, decrypt the message and validate.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Implementation so far:
>> >>
>> >>
>> >>
>> >> 1.       Custom Plugin is ready and JAR has been added in
>> >> <ActiveMQ>/libs
>> >>
>> >>
>> >>
>> >> 2.       Added the plugin configuration in activemq.xml
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Could anyone help me with a solution for the same as it's critical
>> >> case.
>> >>
>> >>
>> >>
>> >> Thank you In Advance
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com<mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>

RE: ActiveMQ custom plugin

Posted by Tim Bain <tb...@alumni.duke.edu>.
OK, great. In that case you would probably want to make a custom processor
in Camel that transforms the message however you need it to, and insert the
processor in the route before the <to>.

Tim

On Feb 2, 2018 1:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

Yes I am using 5.x currently.
Using Apache Camel I am routing messages from ActiveMQ to IBM MQ.

        <!-- Configure IBM WebSphere MQ connection factory -->
        <bean id="websphereConnectionFactory" class="com.ibm.mq.jms.
MQConnectionFactory">
                <property name="transportType" value="1" />
                <property name="hostName" value="SC1234MC.sss.se.scania.com"
/>
                <property name="port" value="1414" />
                <property name="queueManager" value="SC1234MC" />
        </bean>

        <bean id="websphereConfig" class="org.apache.camel.component.jms.
JmsConfiguration">
                <property name="connectionFactory"
ref="websphereConnectionFactory"
/>
                <property name="concurrentConsumers" value="1" />
        </bean>

        <bean id="websphere" class="org.apache.camel.
component.jms.JmsComponent">
                <property name="configuration" ref="websphereConfig" />
        </bean>

        <camelContext trace="false" id="wmqToAmqContext"
                xmlns="http://camel.apache.org/schema/blueprint">
                <route id="wmqToAmqBridge">
                        <from uri="activemq:topic:demo" />
                        <log message="The message contains ${body}" />
                        <to uri="websphere:queue:LQ.SCCO3879.ST5" />
                </route>
        </camelContext>

Regards,
Bharat Gupta
Development & Support | Platform Technician, IXCB | Scania IT
Mobile: +46700869007, +91-9718483802
bharat.gupta@scania.com


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 2 februari 2018 07:06
To: ActiveMQ Users <us...@activemq.apache.org>
Subject: RE: ActiveMQ custom plugin

Let's go back to basics.

Are you using 5.x or Artemis?

You say you're routing messages from ActiveMQ to IBM MQ. How is that being
done?

Tim


On Feb 1, 2018 7:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

I don't wish to add headers in the message I pasted. This message I am
getting from user and it is content. Even the tag header is part of
content. But when I route the message from Active MQ to IBM MQ certain
attributes like destination topic name and message id need to be added.

Also I am using MQTT client to publish a message on ActiveMQ specifying the
topic name and message. I need to add that topic name as destination and
also want to remove JWTtoken from message.

Publication:
Topic: Demo
Message: {"header":{"messageId":"fcbef565-18ea-429a-836f-
7e24d9b53743","jwtToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIs
ImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIs
IkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAt
OTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNl
IjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRB
Y2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkx
MDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwi
aXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoi
MmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjox
NTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7Bx
A6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_
0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_
VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_
xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_
LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-
TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd
73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vs
rcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_
Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpI
vI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-
tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47k
flNNwt1_QVo","correlId":"","initialMessageid":"fcbef565-
18ea-429a-836f-7e24d9b53743","environment":"st5","producerUTCTimestamp":
1515677099337,"contractId":"SCCO3822","producerVer":"1.0","messageType":"
SendChatMessageInConversationMessage","appId":"fma","messageTypeVer":"1.0","
receivers":[]},"body":{"conversationId":"2b575462-
97bd-4e9a-8ac4-6fec793c836a","chatMessageId":"098ee4e7-8976-
4c21-8f0a-521873fd6ac5","content":"grte","attachments":[]}}


I need *Demo* to be added in headers and remove jwtToken from message. I
removed it. But what method I can use in ActiveMQ to publish it on Topic
Demo instead of message with jwtToken value.

I Hope I am able to explain you better :)

Regards,
Bharat Gupta


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 1 februari 2018 15:02
To: ActiveMQ Users <us...@activemq.apache.org>
Cc: users-owner@activemq.apache.org
Subject: RE: ActiveMQ custom plugin

Oh, and I missed your second question. I would expect that you could add
headers similar to how the code you posted removed some. Does your question
mean that you tried that and it didn't work? If so, how did it fail?

Tim

On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> Is this in 5.x, or did you switch to Artemis?
>
> Your code is operating on a message, but what called your code? We'd need
> some context on how you got that message to know what you should do with
it
> next.
>
> Tim
>
> On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Hello Tim,
>>
>> I am getting following message from client using MQTT
>>
>> {
>>         "header": {
>>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
>> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
>> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
>> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
>> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
>> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
>> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
>> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
>> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
>> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
>> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
>> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
>> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
>> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
>> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
>> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
>> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
>> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
>> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
>> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
>> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
>> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
>> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>>                 "correlId": "",
>>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
>> 9b53743",
>>                 "environment": "st5",
>>                 "producerUTCTimestamp": 1515677099337,
>>                 "contractId": "SCCO3822",
>>                 "producerVer": "1.0",
>>                 "messageType": "SendChatMessageInConversationMessage",
>>                 "appId": "fma",
>>                 "messageTypeVer": "1.0",
>>                 "receivers": []
>>         },
>>         "body": {
>>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>>                 "content": "grte",
>>                 "attachments": []
>>         }
>> }
>>
>> I am validating the message by validating the jwt token. I don’t want
>> jwtToken field in message once I have validate it and used following to
>> remove it:
>>
>> for (JsonNode jsonNode : jsonNodeRoot) {
>>            if (jsonNode instanceof ObjectNode) {
>>                ObjectNode o = (ObjectNode) jsonNode;
>>                o.remove("jwtToken");
>>
>>            }
>>        }
>>
>> But how to publish a message on topic once I have done the following
>> checks on it? What method I can use here?
>>
>> Also I wish to add certain attributes in the message header and then
>> publish on the topic how I can do that also?
>>
>> Thank You in Advance
>>
>> Regards,
>> Bharat Gupta
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 2 januari 2018 06:27
>> To: ActiveMQ Users <us...@activemq.apache.org>
>> Cc: users-owner@activemq.apache.org
>> Subject: Re: ActiveMQ custom plugin
>>
>> I spent a little time this evening looking through the ActiveMQ 5.x code
>> and didn't find an obvious way to hook into the MQTT-specific pieces, so
>> switching to Artemis may be your best bet.
>>
>> Tim
>>
>> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>>
>> > Bharat,
>> >
>> > I hadn't caught that this question was about making the connection
>> rather
>> > vs. the first question about sending messages across it; thanks for
>> helping
>> > me understand your question.
>> >
>> > As far as I know, the interception capabilities of 5.x apply only to
the
>> > core broker using the interface you used in the earlier messages in
this
>> > thread, but not to the code that translates non-OpenWire protocols such
>> as
>> > MQTT into OpenWire. I'll need to spend some time digging through the
>> code
>> > to make sure there isn't an MQTT plugin capability I don't know about,
>> and
>> > I probably won't get a chance to do that until the weekend. But unless
I
>> > find something unexpected when I do that digging, what you want may not
>> be
>> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
>> > everything you're trying to do, then switching to it may be a good
>> option.
>> >
>> > Tim
>> >
>> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
>> wrote:
>> >
>> >> Yes the question I asked here is not answered earlier. In previous
>> >> threads/mail focus was on when client was publishing a message on
>> topic the
>> >> activemq.send method was called to intercept the message before it
>> actually
>> >> published on topic.
>> >>
>> >> Here I am majorly focusing on intercepting mqtt connections, which
>> means
>> >> intercepting the client request to activemq and Call my plugin there.
>> So
>> >> which method of activemq can be used here?
>> >>
>> >> As I went thru many solutions over internet and see Artemis as an
>> option.
>> >>
>> >> I hope I am able to put my point clear now. :) please let me know if
>> more
>> >> info is needed from my end.
>> >>
>> >>
>> >>
>> >> Sent from my iPhone
>> >>
>> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> >> tbain@alumni.duke.edu>> wrote:
>> >>
>> >> Is there some aspect of your question that's not answered by the first
>> >> 12(!) emails in the thread? I'm not clear why you're asking what
>> appears
>> >> to
>> >> be the same question again. If there's some new aspect of the question
>> or
>> >> something that wasn't previously answered, please highlight what it
is.
>> >>
>> >> And no, I don't believe that Artemis is required to do what you're
>> trying
>> >> to do. It might be equally possible to do in Artemis compared to doing
>> in
>> >> 5.x (I don't know Artemis well enough to comment on whether this can
be
>> >> done in Artemis), but you definitely don't "have to use Artemis here
to
>> >> achieve this."
>> >>
>> >> Tim
>> >>
>> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> hello again,
>> >>
>> >> I am asking my question here again if you can possibly help me with a
>> >> method.
>> >>
>> >> 1. Need to intercept the Incoming connections from MQTT clients.
>> >> User is connecting to activemq broker by hitting on url and sending a
>> >> TOKEN [(hostname:port) + token]
>> >>
>> >> How can we intercept the connections and validate the token sent by
>> mqtt
>> >> client?
>> >>
>> >> I have my own custom plugin that will validate the token. Just Need to
>> >> know method on which we can call that Plugin.
>> >>
>> >> Also do we have to use Artemis here to achieve this?
>> >>
>> >> Thanks In Advance
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: Tuesday, December 5, 2017 7:29 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> I'd suggest that you store your cache of known credentials in your
>> plugin.
>> >> I'm not sure that you'd have access to the web session from a plugin,
>> >> because that's MQTT-specific, so I think your best bet would be to
>> store
>> >> it
>> >> in a Map (better: a Guava cache, so you get free age-off behavior)
>> within
>> >> your plugin.
>> >>
>> >> Tim
>> >>
>> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hi Tim,
>> >>
>> >> I am having a scenario here. Using custom plugin I am validating my
JWT
>> >> tokens and fetching the claims from it.
>> >>
>> >> Claims:
>> >>
>> >> {
>> >>  "unique_name": "gubhpi",
>> >>  "sub": "gubhpi",
>> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>> >>  "AdAccount": "bguvvw",
>> >>  "FunctionalPermissions": "490879",
>> >>  "UserPermissions": [
>> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
>> >>    "1006"
>> >>  ],
>> >>  "iss": "https://xyz/",
>> >>  "aud": "58b99b37-db1c78d7fef5",
>> >>  "exp": 1510240047,
>> >>  "nbf": 1510236447
>> >> }
>> >>
>> >> From this I need to fetch "AdAccount": "bguvvw", and store it
>> >> somewhere(please suggest me-- context or session) and when next time
>> user
>> >> sends me message on activemq using mqtt or web socket I need to check
>> the
>> >> message header with the users stored in contextsession or from some
>> >> object.
>> >> If user is present then we validate else we don’t.
>> >>
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 29 november 2017 04:20
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hello Tim,
>> >>
>> >> Thank you for your help. :)
>> >>
>> >> I have used below method to fetch that text from message when client
>> >> publish on topic and it works.
>> >>
>> >> public void send(ProducerBrokerExchange producerExchange, Message
>> >> messageSend) throws Exception {
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>> >>
>> >>
>> >> ((ActiveMQTextMessage)messageSend).getText()
>> >> It returns the text from web console only.
>> >>
>> >>
>> >> Really appreciate your help here. :)
>> >>
>> >>
>> >>
>> >> Great, I'm glad I've been able to help.
>> >>
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> -----------------------
>> >>
>> >> Apart from this I have a situation here that when I try to execute
>> below
>> >> code:
>> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> >> creating a queue
>> >> 2. TextMessage claims = session.createTextMessage(payload); ---
>> >> converting
>> >> the string to message to send it on above made queue
>> >> 3. producer.send(dest, claims); --- send the message on
>> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> >> JWT_PAYLOAD
>> >> why?
>> >>
>> >>
>> >> What makes you think that this message on an advisory topic was your
>> >> message instead of a standard advisory message that's sent anytime a
>> >> non-anonymous producer sends a message? What makes you think that thos
>> >> message was sent instead of the message you sent to your queue, rather
>> >> than
>> >> sent *in addition to* the message on your queue? Can you share
>> >> before-and-after screenshots of your queue's row on the Queues page of
>> >> the
>> >> web console? And were there any warnings or errors logged in the
>> broker's
>> >> logs when this happened?
>> >>
>> >> 4. Before executing producer.send(dest, claims); ----- it is going on
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> >> returning null as it is again checking for Content and data. So my
ques
>> >> is
>> >> why it is going back again on first line? Why it is not simply putting
>> >> the
>> >> data on queue?
>> >>
>> >>
>> >> I didn't understand what you meant by "it is going back again on first
>> >> line." Are you saying that the broker is putting the original message
>> >> onto
>> >> your topic? If so, that's because by calling super.send(), you're
>> >> allowing
>> >> the publishing of the original message to the original topic to
>> >> continue. I
>> >> advised you to do that because I didn't realize that you wanted to
>> >> transform the message and publish it to a different destination, but
>> >> since
>> >> it seems like you do, I think you don't want to call super.send()
after
>> >> all.
>> >>
>> >> If that's not what you meant, then please help me to better understand
>> >> your
>> >> question.
>> >>
>> >> @Override
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> Message
>> >> messageSend) throws Exception {
>> >> if(messageSend != null)
>> >> {
>> >>        if(messageSend.getContent() != null)
>> >> {
>> >>        =               byte[] msg = ((ActiveMQMessage)
>> >> messageSend).getContent().data;
>> >>
>> >>                String message = new String(msg);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> message);
>> >>
>> >>                DecodedJWT jwt = JWT.decode(message);
>> >>                byte[] contentBytes = String.format("%s.%s",
>> >> jwt.getHeader(), jwt.getPayload())
>> >>                                .getBytes(StandardCharsets.UTF_8);
>> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> >> getSignature());
>> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>> >>                                + "please enter your key"
>> >>                                + "-----END PUBLIC KEY-----";
>> >>
>> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>> >>
>> >>                Security.addProvider(new BouncyCastleProvider());
>> >>                Signature signatureInstance =
>> >> Signature.getInstance("SHA256withRSA",
>> >> "BC");
>> >>                signatureInstance.initVerify(pk);
>> >>                signatureInstance.update(contentBytes);
>> >>                boolean result = signatureInstance.verify(
>> >> signatureBytes);
>> >>
>> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>> >>
>> >>                String payload = new String(pload);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> payload);
>> >>                logger.warn("result::::::::::::::::              " +
>> >> result);
>> >>                if (result = true) {
>> >>
>> >>                        // Create a ConnectionFactory
>> >>            ActiveMQConnectionFactory connectionFactory = new
>> >> ActiveMQConnectionFactory("vm://localhost");
>> >>
>> >>            // Create a Connection
>> >>            javax.jms.Connection jmsConnection = connectionFactory.
>> >> createConnection();
>> >>            jmsConnection.start();
>> >>
>> >>            // Create a Session
>> >>            Session session = jmsConnection.createSession(false,
>> >> Session.AUTO_ACKNOWLEDGE);
>> >>
>> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
>> >>                        MessageProducer producer =
>> >> session.createProducer(dest);
>> >>                        producer.setDeliveryMode(
>> >> DeliveryMode.PERSISTENT);
>> >>
>> >>                        TextMessage claims = session.createTextMessage(
>> >> payload);
>> >>                        claims.setJMSType("TEXT");
>> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>                        producer.send(dest, claims);
>> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>
>> >>
>> >> //
>> >>                        MessageConsumer consumer =
>> >> session.createConsumer(dest);
>> >>                        consumer.setMessageListener(this);
>> >>
>> >>                }
>> >>
>> >>                else {
>> >>
>> >>                        logger.warn("Else Authentication failed. Please
>> >> send Valid Token");
>> >>                }
>> >>
>> >>                super.send(producerExchange, messageSend);
>> >>                // getNext().send(producerExchange, messageSend);
>> >>
>> >>        }
>> >>
>> >>        else
>> >>        {
>> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>> >>        }
>> >>        }
>> >> else
>> >> {
>> >>        logger.fatal("MESSAGE SEND IS NULL");
>> >> }
>> >>        }
>> >>
>> >>        @Override
>> >>        public void onMessage(javax.jms.Message message) {
>> >>                  String messageText = null;
>> >>                try {
>> >>                    if (message instanceof TextMessage) {
>> >>                        TextMessage textMessage = (TextMessage)
message;
>> >>                        messageText = textMessage.getText();
>> >>                        System.out.println("messageText = " +
>> >> messageText);
>> >>                    }
>> >>                } catch (JMSException e) {
>> >>                    //Handle the exception appropriately
>> >>                }
>> >>        }
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
>> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 27 november 2017 08:12
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >> Thank you for providing that code. I spent some time running your
code,
>> >> and
>> >> found the following problems with it, which are causing this to not
>> work
>> >> as
>> >> you intended:
>> >>
>> >>   1. The signature for the send() method is "public void
>> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> >> throws
>> >>   Exception," not the signature you had defined. Because your
signature
>> >>   didn't match the method you were trying to override, you weren't
>> >> actually
>> >>   overriding a method that would be called when a message was sent,
but
>> >>   instead you were simply defining a public method that nothing ever
>> >> called.
>> >>   The compiler would have caught this for you if you'd annotated the
>> >> method
>> >>   as @Override; you should be using that annotation for all overriden
>> >>   methods, for exactly this reason.
>> >>   2. messageSend.getContent() returns null for the test message I sent
>> >> via
>> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> >> returns
>> >>   the body. I think this same code would work for an MQTT message, but
>> >> since
>> >>   I've never used MQTT you'll need to confirm that.
>> >>   3. I mentioned this earlier, but your send() method needs to call
>> >>   super.send() at the end, otherwise the broker's not going to process
>> >> any
>> >>   messages and you're going to be wondering why the broker "doesn't
>> >> work."
>> >>   This doesn't explain why you're not seeing your logging occur, but
>> >> once
>> >> we
>> >>   get past that problem, this is the next issue you're going to hit.
>> >>
>> >> Tim
>> >>
>> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
>> bharat.gupta@scania.com
>> >> <ma...@scania.com>>
>> >> wrote:
>> >>
>> >> Hello,
>> >>
>> >> MyBroker.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import java.util.HashMap;
>> >> import java.util.Map;
>> >>
>> >> import javax.jms.Destination;
>> >> import javax.jms.ExceptionListener;
>> >> import javax.jms.JMSException;
>> >> import javax.jms.MessageConsumer;
>> >> import javax.jms.Session;
>> >> import javax.jms.TextMessage;
>> >>
>> >> import org.apache.activemq.ActiveMQConnection;
>> >> import org.apache.activemq.ActiveMQConnectionFactory;
>> >> import org.apache.activemq.ActiveMQMessageConsumer;
>> >> import org.apache.activemq.broker.BrokerFilter;
>> >> import org.apache.activemq.broker.Connection;
>> >> import org.apache.activemq.broker.ConnectionContext;
>> >> import org.apache.activemq.broker.ProducerBrokerExchange;
>> >> import org.apache.activemq.broker.region.Subscription;
>> >> import org.apache.activemq.command.ActiveMQDestination;
>> >> import org.apache.activemq.command.ActiveMQMessage;
>> >> import org.apache.activemq.command.ConnectionInfo;
>> >> import org.apache.activemq.command.ConsumerInfo;
>> >> import org.apache.activemq.command.Message;
>> >> import org.apache.activemq.command.SessionInfo;
>> >> import org.apache.log4j.Logger;
>> >>
>> >>
>> >> public class MyBroker extends BrokerFilter {
>> >>
>> >>                final static Logger logger = Logger.getLogger(MyBroker.
>> >> class);
>> >>                private Map<String, String> userMap = new
>> >> HashMap<String,
>> >> String>();
>> >>
>> >>                public MyBroker(org.apache.activemq.broker.Broker
>> >> next)
>> >> {
>> >>                                super(next);
>> >>
>> >>                }
>> >>
>> >>
>> >>
>> >>                public void send(ProducerBrokerExchange
>> >> producerExchange,
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>                {
>> >>                                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                                  Message data =
>> >> messageSend.getMessage();
>> >>                                  logger.warn("
>> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> >> + data);
>> >>                                  String message = new
>> >> String(messageBytes);
>> >>                                  logger.warn("messageBody" + message);
>> >>                                  logger.info<http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>                                  logger.fatal("messageBody" +
>> >> message);
>> >>                                  logger.debug("messageBody" +
>> >> message);
>> >>
>> >>
>> >>                 }
>> >>
>> >>                public void addConnection(ConnectionContext context,
>> >> ConnectionInfo info)
>> >>            throws Exception {
>> >>
>> >>                                info.getUserName();
>> >>                                info.toString();
>> >>
>> >>
>> >>                                logger.warn("info1" +
>> >> info.getUserName());
>> >>                                logger.fatal("info2" +
>> >> info.toString());
>> >>
>> >>       String token = context.getUserName();
>> >>       logger.debug("token1" + token);
>> >>       logger.warn("token2" + token);
>> >>       logger.fatal("token3" + token);
>> >>
>> >>
>> >>        // Then call your parent
>> >>        super.addConnection(context, info);
>> >>    }
>> >>
>> >>    public Subscription addConsumer(ConnectionContext context,
>> >> ConsumerInfo info) throws Exception {
>> >>
>> >>
>> >>
>> >>        ActiveMQDestination dest = info.getDestination();
>> >>        Connection conn = context.getConnection();
>> >>        if (dest != null) {
>> >>            String destName = info.getDestination().getPhysicalName();
>> >>            String clientId = context.getClientId();
>> >>            String allowedDest = userMap.get(clientId);
>> >>
>> >>            logger.info<http://logger.info>(">>> Got Consumer Add
>> request
>> >> { Destination:
>> >> " +
>> >> destName
>> >>                    + ", Remote Address: " + conn.getRemoteAddress()
>> >>                    + ", ClientID: " + clientId
>> >>                    + " }");
>> >>            if (allowedDest != null && (allowedDest.equals("*") ||
>> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>> >>                logger.info<http://logger.info>(">>> Subscription
>> >> allowed");
>> >>            } else {
>> >>                logger.error(">>> Destination not allowed. Subscription
>> >> denied!");
>> >>                throw new Exception(">>> Subscription denied!");
>> >>            }
>> >>        } else {
>> >>            logger.error("<<< Got Consumer Add request from Remote
>> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>> >>        }
>> >>        return super.addConsumer(context, info);
>> >>    }
>> >> }
>> >>
>> >> Sample.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import org.apache.activemq.ActiveMQMessageProducer;
>> >> import org.apache.activemq.broker.Broker;
>> >> import org.apache.activemq.broker.BrokerPlugin;
>> >> import org.apache.log4j.Logger;
>> >>
>> >> public class Sample  implements BrokerPlugin {
>> >>
>> >>                final static Logger logger =
>> >> Logger.getLogger(Sample.class)
>> >> ;
>> >>
>> >>                public static void main(String[] args) {
>> >>
>> >>
>> >>                }
>> >>
>> >>                private void runMe(String parameter){
>> >>
>> >>                                if(logger.isDebugEnabled()){
>> >>                                                logger.debug("This is
>> >> debug : " + parameter);
>> >>                                }
>> >>
>> >>                                if(logger.isInfoEnabled()){
>> >>                                                logger.info<
>> http://logger.
>> >> info>("This is
>> >> info
>> >> : " + parameter);
>> >>                                }
>> >>
>> >>                                logger.warn("This is warn : " +
>> >> parameter);
>> >>                                logger.error("This is error : " +
>> >> parameter);
>> >>                                logger.fatal("This is fatal : " +
>> >> parameter);
>> >>
>> >>                }
>> >>
>> >>                public Broker installPlugin(Broker broker) throws
>> >> Exception {
>> >>                                Sample sample = new Sample();
>> >>                                sample.runMe("ActiveMQ Hello");
>> >>
>> >>                                return new MyBroker(broker);
>> >>                }
>> >>
>> >>
>> >> }
>> >>
>> >> The above are two classes I have implemented for my custom plugin.
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim
>> >> Bain
>> >> Sent: Sunday, November 26, 2017 4:31 AM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >> hello Tim,
>> >>
>> >>
>> >>
>> >> My Custom Plugin is getting installed as I am using log4j to print
>> >> random
>> >> stuff and its getting printed in logs.
>> >> Can you please describe in more detail exactly what methods that
>> >> logging
>> >> is done in and how it proves that the plugin was actually installed?
If
>> >> (for example) your logging is only in your constructor or your
>> >> initialization method, that just proves that Spring made your bean,
not
>> >> that it was installed in the broker as a plugin.
>> >>
>> >> I am hereby attaching my codes that you can see.
>> >> Where? All I see is your activemq.xml snippet below, but no actual
code
>> >> for your plugin.
>> >>
>> >> activemq.xml configurations:
>> >>
>> >> <plugins>
>> >>
>> >>                               <bean id="sample"
>> >>
>> >>                                class="jwt.validation.Sample"
>> >>
>> >>                                xmlns="http://www.
>> >> springframework.org/schema/beans<http://springframework.org/
>> schema/beans
>> >> >"/>
>> >>
>> >>                               </plugins>
>> >>
>> >>
>> >>
>> >> Also I would like to explain you my exact requirement.
>> >>
>> >>
>> >>
>> >> The diagram below shows what I am trying to do it now.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> [cid:image001.png@01D3658E.4A6B3E20]
>> >> That sounds like it should be doable via an interceptor based on what
I
>> >> know about them (i.e. the wiki, but no hands-on experience).
>> >>
>> >> QUESTIONS:
>> >>
>> >>
>> >>
>> >> 1.       how can we provide JWT to custom plugin from client?
>> >> If you have to use MQTT, you'll need to encode it directly into the
>> >> message body, because that's all MQTT supports. You could for example
>> >> make
>> >> a JSON payload with two fields: the JWT and the message body. Or you
>> >> could
>> >> switch to OpenWire and put the JWT into a custom header on the message
>> >> the
>> >> client is sending.
>> >>
>> >> 2.       do we need to store jwt in topic first and then consume it
>> >> from
>> >> topic to validate it? (not idle case)
>> >> You need to put the JWT into the message itself so that your plugin
can
>> >> evaluate the token and then decide what to do with the message based
on
>> >> that evaluation.
>> >>
>> >> 3.       can we call restful service from activeMQ broker that can
>> >> validate token and gives the result back to broker?
>> >> Yes, as far as I know, you'd be able to do that from within the
broker.
>> >> (I've never done that, but I'm not aware of anything that would
prevent
>> >> you
>> >> from doing it.)
>> >>
>> >> Tim please let me know if I am clear with my requirements. Else we can
>> >> talk more on call/phone.
>> >>
>> >>
>> >>
>> >> Thanks in advance
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>]
>> >> On Behalf Of Tim Bain
>> >> Sent: Friday, November 24, 2017 7:19 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>
>> >>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> 1. Your send() method needs to call super.send() after doing your
>> >> custom
>> >>
>> >> work, otherwise the message will never be sent to the real Broker
>> >> object.
>> >>
>> >> Please review the wiki page I referred to earlier, which covers how to
>> >>
>> >> implement an interceptor.
>> >>
>> >>
>> >>
>> >> 2. To me it sounds like your plugin isn't getting installed. Do you
>> >> have
>> >>
>> >> any indication that it is, from logs or some other mechanism? And can
>> >> you
>> >>
>> >> please share the code of the class that implements BrokerPlugin, to
>> >> confirm
>> >>
>> >> that your installPlugin() method looks right, and the XML block where
>> >> you
>> >>
>> >> create the plugin bean?
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I tried implementing the method as below:
>> >>
>> >>
>> >>
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> >>
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>
>> >>         {
>> >>
>> >>                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                  String message = new String(messageBytes);
>> >>
>> >>                  logger.info<http://logger.info><http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>
>> >>        }
>> >>
>> >>
>> >>
>> >> Also I am publishing a message on a topic even though this send()
>> >> method
>> >>
>> >> is not been called as logger.info<http://logger.info><
>> http://logger.info>
>> >> is not getting
>> >> printed in my Custom
>> >>
>> >> Plugin.
>> >>
>> >>
>> >>
>> >> Could you please help me on this?
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>> >>
>> >> Sent: Friday, November 24, 2017 7:15 PM
>> >>
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>>
>> >>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> As I said in your other thread, you would do that by implementing
>> >> code
>> >> in
>> >>
>> >> the send() method of your subclass of BrokerFilter, which you would
>> >> create
>> >>
>> >> and return in your installPlugin() method.
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I have a scenario as follows:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 1.       I have Custom Plugins that decrypts the data and validates
>> >> it.
>> >>
>> >>
>> >>
>> >> 2.       I am getting Encrypted data (token) from user that need to
>> >> be
>> >>
>> >> decrypted on custom plugin.
>> >>
>> >>
>> >>
>> >> 3.       Client is accessing the broker using mqtt protocol
>> >>
>> >>
>> >>
>> >> Need Solution for the following:
>> >>
>> >>
>> >>
>> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>> >>
>> >> validate the  data(token) in my custom plugin
>> >>
>> >>
>> >>
>> >> 2.       How to extract a data what customer is sending? So that I
>> >> can
>> >>
>> >> extract the data, decrypt the message and validate.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Implementation so far:
>> >>
>> >>
>> >>
>> >> 1.       Custom Plugin is ready and JAR has been added in
>> >> <ActiveMQ>/libs
>> >>
>> >>
>> >>
>> >> 2.       Added the plugin configuration in activemq.xml
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Could anyone help me with a solution for the same as it's critical
>> >> case.
>> >>
>> >>
>> >>
>> >> Thank you In Advance
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com<mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>

RE: ActiveMQ custom plugin

Posted by Gupta Bharat <bh...@scania.com>.
Yes I am using 5.x currently.
Using Apache Camel I am routing messages from ActiveMQ to IBM MQ.

	<!-- Configure IBM WebSphere MQ connection factory -->
	<bean id="websphereConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
		<property name="transportType" value="1" />
		<property name="hostName" value="SC1234MC.sss.se.scania.com" />
		<property name="port" value="1414" />
		<property name="queueManager" value="SC1234MC" />
	</bean>

	<bean id="websphereConfig" class="org.apache.camel.component.jms.JmsConfiguration">
		<property name="connectionFactory" ref="websphereConnectionFactory" />
		<property name="concurrentConsumers" value="1" />
	</bean>

	<bean id="websphere" class="org.apache.camel.component.jms.JmsComponent">
		<property name="configuration" ref="websphereConfig" />
	</bean>

	<camelContext trace="false" id="wmqToAmqContext"
		xmlns="http://camel.apache.org/schema/blueprint">
		<route id="wmqToAmqBridge">
			<from uri="activemq:topic:demo" />
			<log message="The message contains ${body}" />
			<to uri="websphere:queue:LQ.SCCO3879.ST5" />
		</route>
	</camelContext>

Regards,
Bharat Gupta
Development & Support | Platform Technician, IXCB | Scania IT
Mobile: +46700869007, +91-9718483802
bharat.gupta@scania.com


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 2 februari 2018 07:06
To: ActiveMQ Users <us...@activemq.apache.org>
Subject: RE: ActiveMQ custom plugin

Let's go back to basics.

Are you using 5.x or Artemis?

You say you're routing messages from ActiveMQ to IBM MQ. How is that being
done?

Tim


On Feb 1, 2018 7:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

I don't wish to add headers in the message I pasted. This message I am
getting from user and it is content. Even the tag header is part of
content. But when I route the message from Active MQ to IBM MQ certain
attributes like destination topic name and message id need to be added.

Also I am using MQTT client to publish a message on ActiveMQ specifying the
topic name and message. I need to add that topic name as destination and
also want to remove JWTtoken from message.

Publication:
Topic: Demo
Message: {"header":{"messageId":"fcbef565-18ea-429a-836f-
7e24d9b53743","jwtToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIs
ImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIs
IkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAt
OTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNl
IjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRB
Y2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkx
MDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwi
aXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoi
MmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjox
NTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7Bx
A6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_
0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_
VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_
xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_
LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-
TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd
73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vs
rcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_
Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpI
vI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-
tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47k
flNNwt1_QVo","correlId":"","initialMessageid":"fcbef565-
18ea-429a-836f-7e24d9b53743","environment":"st5","producerUTCTimestamp":
1515677099337,"contractId":"SCCO3822","producerVer":"1.0","messageType":"
SendChatMessageInConversationMessage","appId":"fma","messageTypeVer":"1.0","
receivers":[]},"body":{"conversationId":"2b575462-
97bd-4e9a-8ac4-6fec793c836a","chatMessageId":"098ee4e7-8976-
4c21-8f0a-521873fd6ac5","content":"grte","attachments":[]}}


I need *Demo* to be added in headers and remove jwtToken from message. I
removed it. But what method I can use in ActiveMQ to publish it on Topic
Demo instead of message with jwtToken value.

I Hope I am able to explain you better :)

Regards,
Bharat Gupta


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 1 februari 2018 15:02
To: ActiveMQ Users <us...@activemq.apache.org>
Cc: users-owner@activemq.apache.org
Subject: RE: ActiveMQ custom plugin

Oh, and I missed your second question. I would expect that you could add
headers similar to how the code you posted removed some. Does your question
mean that you tried that and it didn't work? If so, how did it fail?

Tim

On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> Is this in 5.x, or did you switch to Artemis?
>
> Your code is operating on a message, but what called your code? We'd need
> some context on how you got that message to know what you should do with
it
> next.
>
> Tim
>
> On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Hello Tim,
>>
>> I am getting following message from client using MQTT
>>
>> {
>>         "header": {
>>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
>> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
>> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
>> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
>> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
>> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
>> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
>> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
>> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
>> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
>> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
>> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
>> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
>> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
>> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
>> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
>> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
>> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
>> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
>> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
>> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
>> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
>> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>>                 "correlId": "",
>>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
>> 9b53743",
>>                 "environment": "st5",
>>                 "producerUTCTimestamp": 1515677099337,
>>                 "contractId": "SCCO3822",
>>                 "producerVer": "1.0",
>>                 "messageType": "SendChatMessageInConversationMessage",
>>                 "appId": "fma",
>>                 "messageTypeVer": "1.0",
>>                 "receivers": []
>>         },
>>         "body": {
>>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>>                 "content": "grte",
>>                 "attachments": []
>>         }
>> }
>>
>> I am validating the message by validating the jwt token. I don’t want
>> jwtToken field in message once I have validate it and used following to
>> remove it:
>>
>> for (JsonNode jsonNode : jsonNodeRoot) {
>>            if (jsonNode instanceof ObjectNode) {
>>                ObjectNode o = (ObjectNode) jsonNode;
>>                o.remove("jwtToken");
>>
>>            }
>>        }
>>
>> But how to publish a message on topic once I have done the following
>> checks on it? What method I can use here?
>>
>> Also I wish to add certain attributes in the message header and then
>> publish on the topic how I can do that also?
>>
>> Thank You in Advance
>>
>> Regards,
>> Bharat Gupta
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 2 januari 2018 06:27
>> To: ActiveMQ Users <us...@activemq.apache.org>
>> Cc: users-owner@activemq.apache.org
>> Subject: Re: ActiveMQ custom plugin
>>
>> I spent a little time this evening looking through the ActiveMQ 5.x code
>> and didn't find an obvious way to hook into the MQTT-specific pieces, so
>> switching to Artemis may be your best bet.
>>
>> Tim
>>
>> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>>
>> > Bharat,
>> >
>> > I hadn't caught that this question was about making the connection
>> rather
>> > vs. the first question about sending messages across it; thanks for
>> helping
>> > me understand your question.
>> >
>> > As far as I know, the interception capabilities of 5.x apply only to
the
>> > core broker using the interface you used in the earlier messages in
this
>> > thread, but not to the code that translates non-OpenWire protocols such
>> as
>> > MQTT into OpenWire. I'll need to spend some time digging through the
>> code
>> > to make sure there isn't an MQTT plugin capability I don't know about,
>> and
>> > I probably won't get a chance to do that until the weekend. But unless
I
>> > find something unexpected when I do that digging, what you want may not
>> be
>> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
>> > everything you're trying to do, then switching to it may be a good
>> option.
>> >
>> > Tim
>> >
>> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
>> wrote:
>> >
>> >> Yes the question I asked here is not answered earlier. In previous
>> >> threads/mail focus was on when client was publishing a message on
>> topic the
>> >> activemq.send method was called to intercept the message before it
>> actually
>> >> published on topic.
>> >>
>> >> Here I am majorly focusing on intercepting mqtt connections, which
>> means
>> >> intercepting the client request to activemq and Call my plugin there.
>> So
>> >> which method of activemq can be used here?
>> >>
>> >> As I went thru many solutions over internet and see Artemis as an
>> option.
>> >>
>> >> I hope I am able to put my point clear now. :) please let me know if
>> more
>> >> info is needed from my end.
>> >>
>> >>
>> >>
>> >> Sent from my iPhone
>> >>
>> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> >> tbain@alumni.duke.edu>> wrote:
>> >>
>> >> Is there some aspect of your question that's not answered by the first
>> >> 12(!) emails in the thread? I'm not clear why you're asking what
>> appears
>> >> to
>> >> be the same question again. If there's some new aspect of the question
>> or
>> >> something that wasn't previously answered, please highlight what it
is.
>> >>
>> >> And no, I don't believe that Artemis is required to do what you're
>> trying
>> >> to do. It might be equally possible to do in Artemis compared to doing
>> in
>> >> 5.x (I don't know Artemis well enough to comment on whether this can
be
>> >> done in Artemis), but you definitely don't "have to use Artemis here
to
>> >> achieve this."
>> >>
>> >> Tim
>> >>
>> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> hello again,
>> >>
>> >> I am asking my question here again if you can possibly help me with a
>> >> method.
>> >>
>> >> 1. Need to intercept the Incoming connections from MQTT clients.
>> >> User is connecting to activemq broker by hitting on url and sending a
>> >> TOKEN [(hostname:port) + token]
>> >>
>> >> How can we intercept the connections and validate the token sent by
>> mqtt
>> >> client?
>> >>
>> >> I have my own custom plugin that will validate the token. Just Need to
>> >> know method on which we can call that Plugin.
>> >>
>> >> Also do we have to use Artemis here to achieve this?
>> >>
>> >> Thanks In Advance
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: Tuesday, December 5, 2017 7:29 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> I'd suggest that you store your cache of known credentials in your
>> plugin.
>> >> I'm not sure that you'd have access to the web session from a plugin,
>> >> because that's MQTT-specific, so I think your best bet would be to
>> store
>> >> it
>> >> in a Map (better: a Guava cache, so you get free age-off behavior)
>> within
>> >> your plugin.
>> >>
>> >> Tim
>> >>
>> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hi Tim,
>> >>
>> >> I am having a scenario here. Using custom plugin I am validating my
JWT
>> >> tokens and fetching the claims from it.
>> >>
>> >> Claims:
>> >>
>> >> {
>> >>  "unique_name": "gubhpi",
>> >>  "sub": "gubhpi",
>> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>> >>  "AdAccount": "bguvvw",
>> >>  "FunctionalPermissions": "490879",
>> >>  "UserPermissions": [
>> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
>> >>    "1006"
>> >>  ],
>> >>  "iss": "https://xyz/",
>> >>  "aud": "58b99b37-db1c78d7fef5",
>> >>  "exp": 1510240047,
>> >>  "nbf": 1510236447
>> >> }
>> >>
>> >> From this I need to fetch "AdAccount": "bguvvw", and store it
>> >> somewhere(please suggest me-- context or session) and when next time
>> user
>> >> sends me message on activemq using mqtt or web socket I need to check
>> the
>> >> message header with the users stored in contextsession or from some
>> >> object.
>> >> If user is present then we validate else we don’t.
>> >>
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 29 november 2017 04:20
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hello Tim,
>> >>
>> >> Thank you for your help. :)
>> >>
>> >> I have used below method to fetch that text from message when client
>> >> publish on topic and it works.
>> >>
>> >> public void send(ProducerBrokerExchange producerExchange, Message
>> >> messageSend) throws Exception {
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>> >>
>> >>
>> >> ((ActiveMQTextMessage)messageSend).getText()
>> >> It returns the text from web console only.
>> >>
>> >>
>> >> Really appreciate your help here. :)
>> >>
>> >>
>> >>
>> >> Great, I'm glad I've been able to help.
>> >>
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> -----------------------
>> >>
>> >> Apart from this I have a situation here that when I try to execute
>> below
>> >> code:
>> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> >> creating a queue
>> >> 2. TextMessage claims = session.createTextMessage(payload); ---
>> >> converting
>> >> the string to message to send it on above made queue
>> >> 3. producer.send(dest, claims); --- send the message on
>> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> >> JWT_PAYLOAD
>> >> why?
>> >>
>> >>
>> >> What makes you think that this message on an advisory topic was your
>> >> message instead of a standard advisory message that's sent anytime a
>> >> non-anonymous producer sends a message? What makes you think that thos
>> >> message was sent instead of the message you sent to your queue, rather
>> >> than
>> >> sent *in addition to* the message on your queue? Can you share
>> >> before-and-after screenshots of your queue's row on the Queues page of
>> >> the
>> >> web console? And were there any warnings or errors logged in the
>> broker's
>> >> logs when this happened?
>> >>
>> >> 4. Before executing producer.send(dest, claims); ----- it is going on
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> >> returning null as it is again checking for Content and data. So my
ques
>> >> is
>> >> why it is going back again on first line? Why it is not simply putting
>> >> the
>> >> data on queue?
>> >>
>> >>
>> >> I didn't understand what you meant by "it is going back again on first
>> >> line." Are you saying that the broker is putting the original message
>> >> onto
>> >> your topic? If so, that's because by calling super.send(), you're
>> >> allowing
>> >> the publishing of the original message to the original topic to
>> >> continue. I
>> >> advised you to do that because I didn't realize that you wanted to
>> >> transform the message and publish it to a different destination, but
>> >> since
>> >> it seems like you do, I think you don't want to call super.send()
after
>> >> all.
>> >>
>> >> If that's not what you meant, then please help me to better understand
>> >> your
>> >> question.
>> >>
>> >> @Override
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> Message
>> >> messageSend) throws Exception {
>> >> if(messageSend != null)
>> >> {
>> >>        if(messageSend.getContent() != null)
>> >> {
>> >>        =               byte[] msg = ((ActiveMQMessage)
>> >> messageSend).getContent().data;
>> >>
>> >>                String message = new String(msg);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> message);
>> >>
>> >>                DecodedJWT jwt = JWT.decode(message);
>> >>                byte[] contentBytes = String.format("%s.%s",
>> >> jwt.getHeader(), jwt.getPayload())
>> >>                                .getBytes(StandardCharsets.UTF_8);
>> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> >> getSignature());
>> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>> >>                                + "please enter your key"
>> >>                                + "-----END PUBLIC KEY-----";
>> >>
>> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>> >>
>> >>                Security.addProvider(new BouncyCastleProvider());
>> >>                Signature signatureInstance =
>> >> Signature.getInstance("SHA256withRSA",
>> >> "BC");
>> >>                signatureInstance.initVerify(pk);
>> >>                signatureInstance.update(contentBytes);
>> >>                boolean result = signatureInstance.verify(
>> >> signatureBytes);
>> >>
>> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>> >>
>> >>                String payload = new String(pload);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> payload);
>> >>                logger.warn("result::::::::::::::::              " +
>> >> result);
>> >>                if (result = true) {
>> >>
>> >>                        // Create a ConnectionFactory
>> >>            ActiveMQConnectionFactory connectionFactory = new
>> >> ActiveMQConnectionFactory("vm://localhost");
>> >>
>> >>            // Create a Connection
>> >>            javax.jms.Connection jmsConnection = connectionFactory.
>> >> createConnection();
>> >>            jmsConnection.start();
>> >>
>> >>            // Create a Session
>> >>            Session session = jmsConnection.createSession(false,
>> >> Session.AUTO_ACKNOWLEDGE);
>> >>
>> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
>> >>                        MessageProducer producer =
>> >> session.createProducer(dest);
>> >>                        producer.setDeliveryMode(
>> >> DeliveryMode.PERSISTENT);
>> >>
>> >>                        TextMessage claims = session.createTextMessage(
>> >> payload);
>> >>                        claims.setJMSType("TEXT");
>> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>                        producer.send(dest, claims);
>> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>
>> >>
>> >> //
>> >>                        MessageConsumer consumer =
>> >> session.createConsumer(dest);
>> >>                        consumer.setMessageListener(this);
>> >>
>> >>                }
>> >>
>> >>                else {
>> >>
>> >>                        logger.warn("Else Authentication failed. Please
>> >> send Valid Token");
>> >>                }
>> >>
>> >>                super.send(producerExchange, messageSend);
>> >>                // getNext().send(producerExchange, messageSend);
>> >>
>> >>        }
>> >>
>> >>        else
>> >>        {
>> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>> >>        }
>> >>        }
>> >> else
>> >> {
>> >>        logger.fatal("MESSAGE SEND IS NULL");
>> >> }
>> >>        }
>> >>
>> >>        @Override
>> >>        public void onMessage(javax.jms.Message message) {
>> >>                  String messageText = null;
>> >>                try {
>> >>                    if (message instanceof TextMessage) {
>> >>                        TextMessage textMessage = (TextMessage)
message;
>> >>                        messageText = textMessage.getText();
>> >>                        System.out.println("messageText = " +
>> >> messageText);
>> >>                    }
>> >>                } catch (JMSException e) {
>> >>                    //Handle the exception appropriately
>> >>                }
>> >>        }
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
>> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 27 november 2017 08:12
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >> Thank you for providing that code. I spent some time running your
code,
>> >> and
>> >> found the following problems with it, which are causing this to not
>> work
>> >> as
>> >> you intended:
>> >>
>> >>   1. The signature for the send() method is "public void
>> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> >> throws
>> >>   Exception," not the signature you had defined. Because your
signature
>> >>   didn't match the method you were trying to override, you weren't
>> >> actually
>> >>   overriding a method that would be called when a message was sent,
but
>> >>   instead you were simply defining a public method that nothing ever
>> >> called.
>> >>   The compiler would have caught this for you if you'd annotated the
>> >> method
>> >>   as @Override; you should be using that annotation for all overriden
>> >>   methods, for exactly this reason.
>> >>   2. messageSend.getContent() returns null for the test message I sent
>> >> via
>> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> >> returns
>> >>   the body. I think this same code would work for an MQTT message, but
>> >> since
>> >>   I've never used MQTT you'll need to confirm that.
>> >>   3. I mentioned this earlier, but your send() method needs to call
>> >>   super.send() at the end, otherwise the broker's not going to process
>> >> any
>> >>   messages and you're going to be wondering why the broker "doesn't
>> >> work."
>> >>   This doesn't explain why you're not seeing your logging occur, but
>> >> once
>> >> we
>> >>   get past that problem, this is the next issue you're going to hit.
>> >>
>> >> Tim
>> >>
>> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
>> bharat.gupta@scania.com
>> >> <ma...@scania.com>>
>> >> wrote:
>> >>
>> >> Hello,
>> >>
>> >> MyBroker.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import java.util.HashMap;
>> >> import java.util.Map;
>> >>
>> >> import javax.jms.Destination;
>> >> import javax.jms.ExceptionListener;
>> >> import javax.jms.JMSException;
>> >> import javax.jms.MessageConsumer;
>> >> import javax.jms.Session;
>> >> import javax.jms.TextMessage;
>> >>
>> >> import org.apache.activemq.ActiveMQConnection;
>> >> import org.apache.activemq.ActiveMQConnectionFactory;
>> >> import org.apache.activemq.ActiveMQMessageConsumer;
>> >> import org.apache.activemq.broker.BrokerFilter;
>> >> import org.apache.activemq.broker.Connection;
>> >> import org.apache.activemq.broker.ConnectionContext;
>> >> import org.apache.activemq.broker.ProducerBrokerExchange;
>> >> import org.apache.activemq.broker.region.Subscription;
>> >> import org.apache.activemq.command.ActiveMQDestination;
>> >> import org.apache.activemq.command.ActiveMQMessage;
>> >> import org.apache.activemq.command.ConnectionInfo;
>> >> import org.apache.activemq.command.ConsumerInfo;
>> >> import org.apache.activemq.command.Message;
>> >> import org.apache.activemq.command.SessionInfo;
>> >> import org.apache.log4j.Logger;
>> >>
>> >>
>> >> public class MyBroker extends BrokerFilter {
>> >>
>> >>                final static Logger logger = Logger.getLogger(MyBroker.
>> >> class);
>> >>                private Map<String, String> userMap = new
>> >> HashMap<String,
>> >> String>();
>> >>
>> >>                public MyBroker(org.apache.activemq.broker.Broker
>> >> next)
>> >> {
>> >>                                super(next);
>> >>
>> >>                }
>> >>
>> >>
>> >>
>> >>                public void send(ProducerBrokerExchange
>> >> producerExchange,
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>                {
>> >>                                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                                  Message data =
>> >> messageSend.getMessage();
>> >>                                  logger.warn("
>> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> >> + data);
>> >>                                  String message = new
>> >> String(messageBytes);
>> >>                                  logger.warn("messageBody" + message);
>> >>                                  logger.info<http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>                                  logger.fatal("messageBody" +
>> >> message);
>> >>                                  logger.debug("messageBody" +
>> >> message);
>> >>
>> >>
>> >>                 }
>> >>
>> >>                public void addConnection(ConnectionContext context,
>> >> ConnectionInfo info)
>> >>            throws Exception {
>> >>
>> >>                                info.getUserName();
>> >>                                info.toString();
>> >>
>> >>
>> >>                                logger.warn("info1" +
>> >> info.getUserName());
>> >>                                logger.fatal("info2" +
>> >> info.toString());
>> >>
>> >>       String token = context.getUserName();
>> >>       logger.debug("token1" + token);
>> >>       logger.warn("token2" + token);
>> >>       logger.fatal("token3" + token);
>> >>
>> >>
>> >>        // Then call your parent
>> >>        super.addConnection(context, info);
>> >>    }
>> >>
>> >>    public Subscription addConsumer(ConnectionContext context,
>> >> ConsumerInfo info) throws Exception {
>> >>
>> >>
>> >>
>> >>        ActiveMQDestination dest = info.getDestination();
>> >>        Connection conn = context.getConnection();
>> >>        if (dest != null) {
>> >>            String destName = info.getDestination().getPhysicalName();
>> >>            String clientId = context.getClientId();
>> >>            String allowedDest = userMap.get(clientId);
>> >>
>> >>            logger.info<http://logger.info>(">>> Got Consumer Add
>> request
>> >> { Destination:
>> >> " +
>> >> destName
>> >>                    + ", Remote Address: " + conn.getRemoteAddress()
>> >>                    + ", ClientID: " + clientId
>> >>                    + " }");
>> >>            if (allowedDest != null && (allowedDest.equals("*") ||
>> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>> >>                logger.info<http://logger.info>(">>> Subscription
>> >> allowed");
>> >>            } else {
>> >>                logger.error(">>> Destination not allowed. Subscription
>> >> denied!");
>> >>                throw new Exception(">>> Subscription denied!");
>> >>            }
>> >>        } else {
>> >>            logger.error("<<< Got Consumer Add request from Remote
>> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>> >>        }
>> >>        return super.addConsumer(context, info);
>> >>    }
>> >> }
>> >>
>> >> Sample.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import org.apache.activemq.ActiveMQMessageProducer;
>> >> import org.apache.activemq.broker.Broker;
>> >> import org.apache.activemq.broker.BrokerPlugin;
>> >> import org.apache.log4j.Logger;
>> >>
>> >> public class Sample  implements BrokerPlugin {
>> >>
>> >>                final static Logger logger =
>> >> Logger.getLogger(Sample.class)
>> >> ;
>> >>
>> >>                public static void main(String[] args) {
>> >>
>> >>
>> >>                }
>> >>
>> >>                private void runMe(String parameter){
>> >>
>> >>                                if(logger.isDebugEnabled()){
>> >>                                                logger.debug("This is
>> >> debug : " + parameter);
>> >>                                }
>> >>
>> >>                                if(logger.isInfoEnabled()){
>> >>                                                logger.info<
>> http://logger.
>> >> info>("This is
>> >> info
>> >> : " + parameter);
>> >>                                }
>> >>
>> >>                                logger.warn("This is warn : " +
>> >> parameter);
>> >>                                logger.error("This is error : " +
>> >> parameter);
>> >>                                logger.fatal("This is fatal : " +
>> >> parameter);
>> >>
>> >>                }
>> >>
>> >>                public Broker installPlugin(Broker broker) throws
>> >> Exception {
>> >>                                Sample sample = new Sample();
>> >>                                sample.runMe("ActiveMQ Hello");
>> >>
>> >>                                return new MyBroker(broker);
>> >>                }
>> >>
>> >>
>> >> }
>> >>
>> >> The above are two classes I have implemented for my custom plugin.
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim
>> >> Bain
>> >> Sent: Sunday, November 26, 2017 4:31 AM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >> hello Tim,
>> >>
>> >>
>> >>
>> >> My Custom Plugin is getting installed as I am using log4j to print
>> >> random
>> >> stuff and its getting printed in logs.
>> >> Can you please describe in more detail exactly what methods that
>> >> logging
>> >> is done in and how it proves that the plugin was actually installed?
If
>> >> (for example) your logging is only in your constructor or your
>> >> initialization method, that just proves that Spring made your bean,
not
>> >> that it was installed in the broker as a plugin.
>> >>
>> >> I am hereby attaching my codes that you can see.
>> >> Where? All I see is your activemq.xml snippet below, but no actual
code
>> >> for your plugin.
>> >>
>> >> activemq.xml configurations:
>> >>
>> >> <plugins>
>> >>
>> >>                               <bean id="sample"
>> >>
>> >>                                class="jwt.validation.Sample"
>> >>
>> >>                                xmlns="http://www.
>> >> springframework.org/schema/beans<http://springframework.org/
>> schema/beans
>> >> >"/>
>> >>
>> >>                               </plugins>
>> >>
>> >>
>> >>
>> >> Also I would like to explain you my exact requirement.
>> >>
>> >>
>> >>
>> >> The diagram below shows what I am trying to do it now.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> [cid:image001.png@01D3658E.4A6B3E20]
>> >> That sounds like it should be doable via an interceptor based on what
I
>> >> know about them (i.e. the wiki, but no hands-on experience).
>> >>
>> >> QUESTIONS:
>> >>
>> >>
>> >>
>> >> 1.       how can we provide JWT to custom plugin from client?
>> >> If you have to use MQTT, you'll need to encode it directly into the
>> >> message body, because that's all MQTT supports. You could for example
>> >> make
>> >> a JSON payload with two fields: the JWT and the message body. Or you
>> >> could
>> >> switch to OpenWire and put the JWT into a custom header on the message
>> >> the
>> >> client is sending.
>> >>
>> >> 2.       do we need to store jwt in topic first and then consume it
>> >> from
>> >> topic to validate it? (not idle case)
>> >> You need to put the JWT into the message itself so that your plugin
can
>> >> evaluate the token and then decide what to do with the message based
on
>> >> that evaluation.
>> >>
>> >> 3.       can we call restful service from activeMQ broker that can
>> >> validate token and gives the result back to broker?
>> >> Yes, as far as I know, you'd be able to do that from within the
broker.
>> >> (I've never done that, but I'm not aware of anything that would
prevent
>> >> you
>> >> from doing it.)
>> >>
>> >> Tim please let me know if I am clear with my requirements. Else we can
>> >> talk more on call/phone.
>> >>
>> >>
>> >>
>> >> Thanks in advance
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>]
>> >> On Behalf Of Tim Bain
>> >> Sent: Friday, November 24, 2017 7:19 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>
>> >>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> 1. Your send() method needs to call super.send() after doing your
>> >> custom
>> >>
>> >> work, otherwise the message will never be sent to the real Broker
>> >> object.
>> >>
>> >> Please review the wiki page I referred to earlier, which covers how to
>> >>
>> >> implement an interceptor.
>> >>
>> >>
>> >>
>> >> 2. To me it sounds like your plugin isn't getting installed. Do you
>> >> have
>> >>
>> >> any indication that it is, from logs or some other mechanism? And can
>> >> you
>> >>
>> >> please share the code of the class that implements BrokerPlugin, to
>> >> confirm
>> >>
>> >> that your installPlugin() method looks right, and the XML block where
>> >> you
>> >>
>> >> create the plugin bean?
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I tried implementing the method as below:
>> >>
>> >>
>> >>
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> >>
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>
>> >>         {
>> >>
>> >>                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                  String message = new String(messageBytes);
>> >>
>> >>                  logger.info<http://logger.info><http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>
>> >>        }
>> >>
>> >>
>> >>
>> >> Also I am publishing a message on a topic even though this send()
>> >> method
>> >>
>> >> is not been called as logger.info<http://logger.info><
>> http://logger.info>
>> >> is not getting
>> >> printed in my Custom
>> >>
>> >> Plugin.
>> >>
>> >>
>> >>
>> >> Could you please help me on this?
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>> >>
>> >> Sent: Friday, November 24, 2017 7:15 PM
>> >>
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>>
>> >>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> As I said in your other thread, you would do that by implementing
>> >> code
>> >> in
>> >>
>> >> the send() method of your subclass of BrokerFilter, which you would
>> >> create
>> >>
>> >> and return in your installPlugin() method.
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I have a scenario as follows:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 1.       I have Custom Plugins that decrypts the data and validates
>> >> it.
>> >>
>> >>
>> >>
>> >> 2.       I am getting Encrypted data (token) from user that need to
>> >> be
>> >>
>> >> decrypted on custom plugin.
>> >>
>> >>
>> >>
>> >> 3.       Client is accessing the broker using mqtt protocol
>> >>
>> >>
>> >>
>> >> Need Solution for the following:
>> >>
>> >>
>> >>
>> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>> >>
>> >> validate the  data(token) in my custom plugin
>> >>
>> >>
>> >>
>> >> 2.       How to extract a data what customer is sending? So that I
>> >> can
>> >>
>> >> extract the data, decrypt the message and validate.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Implementation so far:
>> >>
>> >>
>> >>
>> >> 1.       Custom Plugin is ready and JAR has been added in
>> >> <ActiveMQ>/libs
>> >>
>> >>
>> >>
>> >> 2.       Added the plugin configuration in activemq.xml
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Could anyone help me with a solution for the same as it's critical
>> >> case.
>> >>
>> >>
>> >>
>> >> Thank you In Advance
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com<mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>

RE: ActiveMQ custom plugin

Posted by Tim Bain <tb...@alumni.duke.edu>.
Let's go back to basics.

Are you using 5.x or Artemis?

You say you're routing messages from ActiveMQ to IBM MQ. How is that being
done?

Tim


On Feb 1, 2018 7:23 AM, "Gupta Bharat" <bh...@scania.com> wrote:

I don't wish to add headers in the message I pasted. This message I am
getting from user and it is content. Even the tag header is part of
content. But when I route the message from Active MQ to IBM MQ certain
attributes like destination topic name and message id need to be added.

Also I am using MQTT client to publish a message on ActiveMQ specifying the
topic name and message. I need to add that topic name as destination and
also want to remove JWTtoken from message.

Publication:
Topic: Demo
Message: {"header":{"messageId":"fcbef565-18ea-429a-836f-
7e24d9b53743","jwtToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIs
ImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIs
IkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAt
OTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNl
IjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRB
Y2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkx
MDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwi
aXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoi
MmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjox
NTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7Bx
A6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_
0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_
VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_
xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_
LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-
TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd
73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vs
rcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_
Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpI
vI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-
tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47k
flNNwt1_QVo","correlId":"","initialMessageid":"fcbef565-
18ea-429a-836f-7e24d9b53743","environment":"st5","producerUTCTimestamp":
1515677099337,"contractId":"SCCO3822","producerVer":"1.0","messageType":"
SendChatMessageInConversationMessage","appId":"fma","messageTypeVer":"1.0","
receivers":[]},"body":{"conversationId":"2b575462-
97bd-4e9a-8ac4-6fec793c836a","chatMessageId":"098ee4e7-8976-
4c21-8f0a-521873fd6ac5","content":"grte","attachments":[]}}


I need *Demo* to be added in headers and remove jwtToken from message. I
removed it. But what method I can use in ActiveMQ to publish it on Topic
Demo instead of message with jwtToken value.

I Hope I am able to explain you better :)

Regards,
Bharat Gupta


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 1 februari 2018 15:02
To: ActiveMQ Users <us...@activemq.apache.org>
Cc: users-owner@activemq.apache.org
Subject: RE: ActiveMQ custom plugin

Oh, and I missed your second question. I would expect that you could add
headers similar to how the code you posted removed some. Does your question
mean that you tried that and it didn't work? If so, how did it fail?

Tim

On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> Is this in 5.x, or did you switch to Artemis?
>
> Your code is operating on a message, but what called your code? We'd need
> some context on how you got that message to know what you should do with
it
> next.
>
> Tim
>
> On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Hello Tim,
>>
>> I am getting following message from client using MQTT
>>
>> {
>>         "header": {
>>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
>> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
>> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
>> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
>> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
>> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
>> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
>> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
>> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
>> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
>> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
>> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
>> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
>> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
>> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
>> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
>> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
>> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
>> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
>> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
>> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
>> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
>> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>>                 "correlId": "",
>>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
>> 9b53743",
>>                 "environment": "st5",
>>                 "producerUTCTimestamp": 1515677099337,
>>                 "contractId": "SCCO3822",
>>                 "producerVer": "1.0",
>>                 "messageType": "SendChatMessageInConversationMessage",
>>                 "appId": "fma",
>>                 "messageTypeVer": "1.0",
>>                 "receivers": []
>>         },
>>         "body": {
>>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>>                 "content": "grte",
>>                 "attachments": []
>>         }
>> }
>>
>> I am validating the message by validating the jwt token. I don’t want
>> jwtToken field in message once I have validate it and used following to
>> remove it:
>>
>> for (JsonNode jsonNode : jsonNodeRoot) {
>>            if (jsonNode instanceof ObjectNode) {
>>                ObjectNode o = (ObjectNode) jsonNode;
>>                o.remove("jwtToken");
>>
>>            }
>>        }
>>
>> But how to publish a message on topic once I have done the following
>> checks on it? What method I can use here?
>>
>> Also I wish to add certain attributes in the message header and then
>> publish on the topic how I can do that also?
>>
>> Thank You in Advance
>>
>> Regards,
>> Bharat Gupta
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 2 januari 2018 06:27
>> To: ActiveMQ Users <us...@activemq.apache.org>
>> Cc: users-owner@activemq.apache.org
>> Subject: Re: ActiveMQ custom plugin
>>
>> I spent a little time this evening looking through the ActiveMQ 5.x code
>> and didn't find an obvious way to hook into the MQTT-specific pieces, so
>> switching to Artemis may be your best bet.
>>
>> Tim
>>
>> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>>
>> > Bharat,
>> >
>> > I hadn't caught that this question was about making the connection
>> rather
>> > vs. the first question about sending messages across it; thanks for
>> helping
>> > me understand your question.
>> >
>> > As far as I know, the interception capabilities of 5.x apply only to
the
>> > core broker using the interface you used in the earlier messages in
this
>> > thread, but not to the code that translates non-OpenWire protocols such
>> as
>> > MQTT into OpenWire. I'll need to spend some time digging through the
>> code
>> > to make sure there isn't an MQTT plugin capability I don't know about,
>> and
>> > I probably won't get a chance to do that until the weekend. But unless
I
>> > find something unexpected when I do that digging, what you want may not
>> be
>> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
>> > everything you're trying to do, then switching to it may be a good
>> option.
>> >
>> > Tim
>> >
>> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
>> wrote:
>> >
>> >> Yes the question I asked here is not answered earlier. In previous
>> >> threads/mail focus was on when client was publishing a message on
>> topic the
>> >> activemq.send method was called to intercept the message before it
>> actually
>> >> published on topic.
>> >>
>> >> Here I am majorly focusing on intercepting mqtt connections, which
>> means
>> >> intercepting the client request to activemq and Call my plugin there.
>> So
>> >> which method of activemq can be used here?
>> >>
>> >> As I went thru many solutions over internet and see Artemis as an
>> option.
>> >>
>> >> I hope I am able to put my point clear now. :) please let me know if
>> more
>> >> info is needed from my end.
>> >>
>> >>
>> >>
>> >> Sent from my iPhone
>> >>
>> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> >> tbain@alumni.duke.edu>> wrote:
>> >>
>> >> Is there some aspect of your question that's not answered by the first
>> >> 12(!) emails in the thread? I'm not clear why you're asking what
>> appears
>> >> to
>> >> be the same question again. If there's some new aspect of the question
>> or
>> >> something that wasn't previously answered, please highlight what it
is.
>> >>
>> >> And no, I don't believe that Artemis is required to do what you're
>> trying
>> >> to do. It might be equally possible to do in Artemis compared to doing
>> in
>> >> 5.x (I don't know Artemis well enough to comment on whether this can
be
>> >> done in Artemis), but you definitely don't "have to use Artemis here
to
>> >> achieve this."
>> >>
>> >> Tim
>> >>
>> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> hello again,
>> >>
>> >> I am asking my question here again if you can possibly help me with a
>> >> method.
>> >>
>> >> 1. Need to intercept the Incoming connections from MQTT clients.
>> >> User is connecting to activemq broker by hitting on url and sending a
>> >> TOKEN [(hostname:port) + token]
>> >>
>> >> How can we intercept the connections and validate the token sent by
>> mqtt
>> >> client?
>> >>
>> >> I have my own custom plugin that will validate the token. Just Need to
>> >> know method on which we can call that Plugin.
>> >>
>> >> Also do we have to use Artemis here to achieve this?
>> >>
>> >> Thanks In Advance
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: Tuesday, December 5, 2017 7:29 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> I'd suggest that you store your cache of known credentials in your
>> plugin.
>> >> I'm not sure that you'd have access to the web session from a plugin,
>> >> because that's MQTT-specific, so I think your best bet would be to
>> store
>> >> it
>> >> in a Map (better: a Guava cache, so you get free age-off behavior)
>> within
>> >> your plugin.
>> >>
>> >> Tim
>> >>
>> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hi Tim,
>> >>
>> >> I am having a scenario here. Using custom plugin I am validating my
JWT
>> >> tokens and fetching the claims from it.
>> >>
>> >> Claims:
>> >>
>> >> {
>> >>  "unique_name": "gubhpi",
>> >>  "sub": "gubhpi",
>> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>> >>  "AdAccount": "bguvvw",
>> >>  "FunctionalPermissions": "490879",
>> >>  "UserPermissions": [
>> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
>> >>    "1006"
>> >>  ],
>> >>  "iss": "https://xyz/",
>> >>  "aud": "58b99b37-db1c78d7fef5",
>> >>  "exp": 1510240047,
>> >>  "nbf": 1510236447
>> >> }
>> >>
>> >> From this I need to fetch "AdAccount": "bguvvw", and store it
>> >> somewhere(please suggest me-- context or session) and when next time
>> user
>> >> sends me message on activemq using mqtt or web socket I need to check
>> the
>> >> message header with the users stored in contextsession or from some
>> >> object.
>> >> If user is present then we validate else we don’t.
>> >>
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 29 november 2017 04:20
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hello Tim,
>> >>
>> >> Thank you for your help. :)
>> >>
>> >> I have used below method to fetch that text from message when client
>> >> publish on topic and it works.
>> >>
>> >> public void send(ProducerBrokerExchange producerExchange, Message
>> >> messageSend) throws Exception {
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>> >>
>> >>
>> >> ((ActiveMQTextMessage)messageSend).getText()
>> >> It returns the text from web console only.
>> >>
>> >>
>> >> Really appreciate your help here. :)
>> >>
>> >>
>> >>
>> >> Great, I'm glad I've been able to help.
>> >>
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> -----------------------
>> >>
>> >> Apart from this I have a situation here that when I try to execute
>> below
>> >> code:
>> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> >> creating a queue
>> >> 2. TextMessage claims = session.createTextMessage(payload); ---
>> >> converting
>> >> the string to message to send it on above made queue
>> >> 3. producer.send(dest, claims); --- send the message on
>> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> >> JWT_PAYLOAD
>> >> why?
>> >>
>> >>
>> >> What makes you think that this message on an advisory topic was your
>> >> message instead of a standard advisory message that's sent anytime a
>> >> non-anonymous producer sends a message? What makes you think that thos
>> >> message was sent instead of the message you sent to your queue, rather
>> >> than
>> >> sent *in addition to* the message on your queue? Can you share
>> >> before-and-after screenshots of your queue's row on the Queues page of
>> >> the
>> >> web console? And were there any warnings or errors logged in the
>> broker's
>> >> logs when this happened?
>> >>
>> >> 4. Before executing producer.send(dest, claims); ----- it is going on
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> >> returning null as it is again checking for Content and data. So my
ques
>> >> is
>> >> why it is going back again on first line? Why it is not simply putting
>> >> the
>> >> data on queue?
>> >>
>> >>
>> >> I didn't understand what you meant by "it is going back again on first
>> >> line." Are you saying that the broker is putting the original message
>> >> onto
>> >> your topic? If so, that's because by calling super.send(), you're
>> >> allowing
>> >> the publishing of the original message to the original topic to
>> >> continue. I
>> >> advised you to do that because I didn't realize that you wanted to
>> >> transform the message and publish it to a different destination, but
>> >> since
>> >> it seems like you do, I think you don't want to call super.send()
after
>> >> all.
>> >>
>> >> If that's not what you meant, then please help me to better understand
>> >> your
>> >> question.
>> >>
>> >> @Override
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> Message
>> >> messageSend) throws Exception {
>> >> if(messageSend != null)
>> >> {
>> >>        if(messageSend.getContent() != null)
>> >> {
>> >>        =               byte[] msg = ((ActiveMQMessage)
>> >> messageSend).getContent().data;
>> >>
>> >>                String message = new String(msg);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> message);
>> >>
>> >>                DecodedJWT jwt = JWT.decode(message);
>> >>                byte[] contentBytes = String.format("%s.%s",
>> >> jwt.getHeader(), jwt.getPayload())
>> >>                                .getBytes(StandardCharsets.UTF_8);
>> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> >> getSignature());
>> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>> >>                                + "please enter your key"
>> >>                                + "-----END PUBLIC KEY-----";
>> >>
>> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>> >>
>> >>                Security.addProvider(new BouncyCastleProvider());
>> >>                Signature signatureInstance =
>> >> Signature.getInstance("SHA256withRSA",
>> >> "BC");
>> >>                signatureInstance.initVerify(pk);
>> >>                signatureInstance.update(contentBytes);
>> >>                boolean result = signatureInstance.verify(
>> >> signatureBytes);
>> >>
>> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>> >>
>> >>                String payload = new String(pload);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> payload);
>> >>                logger.warn("result::::::::::::::::              " +
>> >> result);
>> >>                if (result = true) {
>> >>
>> >>                        // Create a ConnectionFactory
>> >>            ActiveMQConnectionFactory connectionFactory = new
>> >> ActiveMQConnectionFactory("vm://localhost");
>> >>
>> >>            // Create a Connection
>> >>            javax.jms.Connection jmsConnection = connectionFactory.
>> >> createConnection();
>> >>            jmsConnection.start();
>> >>
>> >>            // Create a Session
>> >>            Session session = jmsConnection.createSession(false,
>> >> Session.AUTO_ACKNOWLEDGE);
>> >>
>> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
>> >>                        MessageProducer producer =
>> >> session.createProducer(dest);
>> >>                        producer.setDeliveryMode(
>> >> DeliveryMode.PERSISTENT);
>> >>
>> >>                        TextMessage claims = session.createTextMessage(
>> >> payload);
>> >>                        claims.setJMSType("TEXT");
>> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>                        producer.send(dest, claims);
>> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>
>> >>
>> >> //
>> >>                        MessageConsumer consumer =
>> >> session.createConsumer(dest);
>> >>                        consumer.setMessageListener(this);
>> >>
>> >>                }
>> >>
>> >>                else {
>> >>
>> >>                        logger.warn("Else Authentication failed. Please
>> >> send Valid Token");
>> >>                }
>> >>
>> >>                super.send(producerExchange, messageSend);
>> >>                // getNext().send(producerExchange, messageSend);
>> >>
>> >>        }
>> >>
>> >>        else
>> >>        {
>> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>> >>        }
>> >>        }
>> >> else
>> >> {
>> >>        logger.fatal("MESSAGE SEND IS NULL");
>> >> }
>> >>        }
>> >>
>> >>        @Override
>> >>        public void onMessage(javax.jms.Message message) {
>> >>                  String messageText = null;
>> >>                try {
>> >>                    if (message instanceof TextMessage) {
>> >>                        TextMessage textMessage = (TextMessage)
message;
>> >>                        messageText = textMessage.getText();
>> >>                        System.out.println("messageText = " +
>> >> messageText);
>> >>                    }
>> >>                } catch (JMSException e) {
>> >>                    //Handle the exception appropriately
>> >>                }
>> >>        }
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
>> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 27 november 2017 08:12
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >> Thank you for providing that code. I spent some time running your
code,
>> >> and
>> >> found the following problems with it, which are causing this to not
>> work
>> >> as
>> >> you intended:
>> >>
>> >>   1. The signature for the send() method is "public void
>> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> >> throws
>> >>   Exception," not the signature you had defined. Because your
signature
>> >>   didn't match the method you were trying to override, you weren't
>> >> actually
>> >>   overriding a method that would be called when a message was sent,
but
>> >>   instead you were simply defining a public method that nothing ever
>> >> called.
>> >>   The compiler would have caught this for you if you'd annotated the
>> >> method
>> >>   as @Override; you should be using that annotation for all overriden
>> >>   methods, for exactly this reason.
>> >>   2. messageSend.getContent() returns null for the test message I sent
>> >> via
>> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> >> returns
>> >>   the body. I think this same code would work for an MQTT message, but
>> >> since
>> >>   I've never used MQTT you'll need to confirm that.
>> >>   3. I mentioned this earlier, but your send() method needs to call
>> >>   super.send() at the end, otherwise the broker's not going to process
>> >> any
>> >>   messages and you're going to be wondering why the broker "doesn't
>> >> work."
>> >>   This doesn't explain why you're not seeing your logging occur, but
>> >> once
>> >> we
>> >>   get past that problem, this is the next issue you're going to hit.
>> >>
>> >> Tim
>> >>
>> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
>> bharat.gupta@scania.com
>> >> <ma...@scania.com>>
>> >> wrote:
>> >>
>> >> Hello,
>> >>
>> >> MyBroker.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import java.util.HashMap;
>> >> import java.util.Map;
>> >>
>> >> import javax.jms.Destination;
>> >> import javax.jms.ExceptionListener;
>> >> import javax.jms.JMSException;
>> >> import javax.jms.MessageConsumer;
>> >> import javax.jms.Session;
>> >> import javax.jms.TextMessage;
>> >>
>> >> import org.apache.activemq.ActiveMQConnection;
>> >> import org.apache.activemq.ActiveMQConnectionFactory;
>> >> import org.apache.activemq.ActiveMQMessageConsumer;
>> >> import org.apache.activemq.broker.BrokerFilter;
>> >> import org.apache.activemq.broker.Connection;
>> >> import org.apache.activemq.broker.ConnectionContext;
>> >> import org.apache.activemq.broker.ProducerBrokerExchange;
>> >> import org.apache.activemq.broker.region.Subscription;
>> >> import org.apache.activemq.command.ActiveMQDestination;
>> >> import org.apache.activemq.command.ActiveMQMessage;
>> >> import org.apache.activemq.command.ConnectionInfo;
>> >> import org.apache.activemq.command.ConsumerInfo;
>> >> import org.apache.activemq.command.Message;
>> >> import org.apache.activemq.command.SessionInfo;
>> >> import org.apache.log4j.Logger;
>> >>
>> >>
>> >> public class MyBroker extends BrokerFilter {
>> >>
>> >>                final static Logger logger = Logger.getLogger(MyBroker.
>> >> class);
>> >>                private Map<String, String> userMap = new
>> >> HashMap<String,
>> >> String>();
>> >>
>> >>                public MyBroker(org.apache.activemq.broker.Broker
>> >> next)
>> >> {
>> >>                                super(next);
>> >>
>> >>                }
>> >>
>> >>
>> >>
>> >>                public void send(ProducerBrokerExchange
>> >> producerExchange,
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>                {
>> >>                                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                                  Message data =
>> >> messageSend.getMessage();
>> >>                                  logger.warn("
>> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> >> + data);
>> >>                                  String message = new
>> >> String(messageBytes);
>> >>                                  logger.warn("messageBody" + message);
>> >>                                  logger.info<http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>                                  logger.fatal("messageBody" +
>> >> message);
>> >>                                  logger.debug("messageBody" +
>> >> message);
>> >>
>> >>
>> >>                 }
>> >>
>> >>                public void addConnection(ConnectionContext context,
>> >> ConnectionInfo info)
>> >>            throws Exception {
>> >>
>> >>                                info.getUserName();
>> >>                                info.toString();
>> >>
>> >>
>> >>                                logger.warn("info1" +
>> >> info.getUserName());
>> >>                                logger.fatal("info2" +
>> >> info.toString());
>> >>
>> >>       String token = context.getUserName();
>> >>       logger.debug("token1" + token);
>> >>       logger.warn("token2" + token);
>> >>       logger.fatal("token3" + token);
>> >>
>> >>
>> >>        // Then call your parent
>> >>        super.addConnection(context, info);
>> >>    }
>> >>
>> >>    public Subscription addConsumer(ConnectionContext context,
>> >> ConsumerInfo info) throws Exception {
>> >>
>> >>
>> >>
>> >>        ActiveMQDestination dest = info.getDestination();
>> >>        Connection conn = context.getConnection();
>> >>        if (dest != null) {
>> >>            String destName = info.getDestination().getPhysicalName();
>> >>            String clientId = context.getClientId();
>> >>            String allowedDest = userMap.get(clientId);
>> >>
>> >>            logger.info<http://logger.info>(">>> Got Consumer Add
>> request
>> >> { Destination:
>> >> " +
>> >> destName
>> >>                    + ", Remote Address: " + conn.getRemoteAddress()
>> >>                    + ", ClientID: " + clientId
>> >>                    + " }");
>> >>            if (allowedDest != null && (allowedDest.equals("*") ||
>> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>> >>                logger.info<http://logger.info>(">>> Subscription
>> >> allowed");
>> >>            } else {
>> >>                logger.error(">>> Destination not allowed. Subscription
>> >> denied!");
>> >>                throw new Exception(">>> Subscription denied!");
>> >>            }
>> >>        } else {
>> >>            logger.error("<<< Got Consumer Add request from Remote
>> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>> >>        }
>> >>        return super.addConsumer(context, info);
>> >>    }
>> >> }
>> >>
>> >> Sample.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import org.apache.activemq.ActiveMQMessageProducer;
>> >> import org.apache.activemq.broker.Broker;
>> >> import org.apache.activemq.broker.BrokerPlugin;
>> >> import org.apache.log4j.Logger;
>> >>
>> >> public class Sample  implements BrokerPlugin {
>> >>
>> >>                final static Logger logger =
>> >> Logger.getLogger(Sample.class)
>> >> ;
>> >>
>> >>                public static void main(String[] args) {
>> >>
>> >>
>> >>                }
>> >>
>> >>                private void runMe(String parameter){
>> >>
>> >>                                if(logger.isDebugEnabled()){
>> >>                                                logger.debug("This is
>> >> debug : " + parameter);
>> >>                                }
>> >>
>> >>                                if(logger.isInfoEnabled()){
>> >>                                                logger.info<
>> http://logger.
>> >> info>("This is
>> >> info
>> >> : " + parameter);
>> >>                                }
>> >>
>> >>                                logger.warn("This is warn : " +
>> >> parameter);
>> >>                                logger.error("This is error : " +
>> >> parameter);
>> >>                                logger.fatal("This is fatal : " +
>> >> parameter);
>> >>
>> >>                }
>> >>
>> >>                public Broker installPlugin(Broker broker) throws
>> >> Exception {
>> >>                                Sample sample = new Sample();
>> >>                                sample.runMe("ActiveMQ Hello");
>> >>
>> >>                                return new MyBroker(broker);
>> >>                }
>> >>
>> >>
>> >> }
>> >>
>> >> The above are two classes I have implemented for my custom plugin.
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim
>> >> Bain
>> >> Sent: Sunday, November 26, 2017 4:31 AM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >> hello Tim,
>> >>
>> >>
>> >>
>> >> My Custom Plugin is getting installed as I am using log4j to print
>> >> random
>> >> stuff and its getting printed in logs.
>> >> Can you please describe in more detail exactly what methods that
>> >> logging
>> >> is done in and how it proves that the plugin was actually installed?
If
>> >> (for example) your logging is only in your constructor or your
>> >> initialization method, that just proves that Spring made your bean,
not
>> >> that it was installed in the broker as a plugin.
>> >>
>> >> I am hereby attaching my codes that you can see.
>> >> Where? All I see is your activemq.xml snippet below, but no actual
code
>> >> for your plugin.
>> >>
>> >> activemq.xml configurations:
>> >>
>> >> <plugins>
>> >>
>> >>                               <bean id="sample"
>> >>
>> >>                                class="jwt.validation.Sample"
>> >>
>> >>                                xmlns="http://www.
>> >> springframework.org/schema/beans<http://springframework.org/
>> schema/beans
>> >> >"/>
>> >>
>> >>                               </plugins>
>> >>
>> >>
>> >>
>> >> Also I would like to explain you my exact requirement.
>> >>
>> >>
>> >>
>> >> The diagram below shows what I am trying to do it now.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> [cid:image001.png@01D3658E.4A6B3E20]
>> >> That sounds like it should be doable via an interceptor based on what
I
>> >> know about them (i.e. the wiki, but no hands-on experience).
>> >>
>> >> QUESTIONS:
>> >>
>> >>
>> >>
>> >> 1.       how can we provide JWT to custom plugin from client?
>> >> If you have to use MQTT, you'll need to encode it directly into the
>> >> message body, because that's all MQTT supports. You could for example
>> >> make
>> >> a JSON payload with two fields: the JWT and the message body. Or you
>> >> could
>> >> switch to OpenWire and put the JWT into a custom header on the message
>> >> the
>> >> client is sending.
>> >>
>> >> 2.       do we need to store jwt in topic first and then consume it
>> >> from
>> >> topic to validate it? (not idle case)
>> >> You need to put the JWT into the message itself so that your plugin
can
>> >> evaluate the token and then decide what to do with the message based
on
>> >> that evaluation.
>> >>
>> >> 3.       can we call restful service from activeMQ broker that can
>> >> validate token and gives the result back to broker?
>> >> Yes, as far as I know, you'd be able to do that from within the
broker.
>> >> (I've never done that, but I'm not aware of anything that would
prevent
>> >> you
>> >> from doing it.)
>> >>
>> >> Tim please let me know if I am clear with my requirements. Else we can
>> >> talk more on call/phone.
>> >>
>> >>
>> >>
>> >> Thanks in advance
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>]
>> >> On Behalf Of Tim Bain
>> >> Sent: Friday, November 24, 2017 7:19 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>
>> >>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> 1. Your send() method needs to call super.send() after doing your
>> >> custom
>> >>
>> >> work, otherwise the message will never be sent to the real Broker
>> >> object.
>> >>
>> >> Please review the wiki page I referred to earlier, which covers how to
>> >>
>> >> implement an interceptor.
>> >>
>> >>
>> >>
>> >> 2. To me it sounds like your plugin isn't getting installed. Do you
>> >> have
>> >>
>> >> any indication that it is, from logs or some other mechanism? And can
>> >> you
>> >>
>> >> please share the code of the class that implements BrokerPlugin, to
>> >> confirm
>> >>
>> >> that your installPlugin() method looks right, and the XML block where
>> >> you
>> >>
>> >> create the plugin bean?
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I tried implementing the method as below:
>> >>
>> >>
>> >>
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> >>
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>
>> >>         {
>> >>
>> >>                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                  String message = new String(messageBytes);
>> >>
>> >>                  logger.info<http://logger.info><http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>
>> >>        }
>> >>
>> >>
>> >>
>> >> Also I am publishing a message on a topic even though this send()
>> >> method
>> >>
>> >> is not been called as logger.info<http://logger.info><
>> http://logger.info>
>> >> is not getting
>> >> printed in my Custom
>> >>
>> >> Plugin.
>> >>
>> >>
>> >>
>> >> Could you please help me on this?
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>> >>
>> >> Sent: Friday, November 24, 2017 7:15 PM
>> >>
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>>
>> >>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> As I said in your other thread, you would do that by implementing
>> >> code
>> >> in
>> >>
>> >> the send() method of your subclass of BrokerFilter, which you would
>> >> create
>> >>
>> >> and return in your installPlugin() method.
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I have a scenario as follows:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 1.       I have Custom Plugins that decrypts the data and validates
>> >> it.
>> >>
>> >>
>> >>
>> >> 2.       I am getting Encrypted data (token) from user that need to
>> >> be
>> >>
>> >> decrypted on custom plugin.
>> >>
>> >>
>> >>
>> >> 3.       Client is accessing the broker using mqtt protocol
>> >>
>> >>
>> >>
>> >> Need Solution for the following:
>> >>
>> >>
>> >>
>> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>> >>
>> >> validate the  data(token) in my custom plugin
>> >>
>> >>
>> >>
>> >> 2.       How to extract a data what customer is sending? So that I
>> >> can
>> >>
>> >> extract the data, decrypt the message and validate.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Implementation so far:
>> >>
>> >>
>> >>
>> >> 1.       Custom Plugin is ready and JAR has been added in
>> >> <ActiveMQ>/libs
>> >>
>> >>
>> >>
>> >> 2.       Added the plugin configuration in activemq.xml
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Could anyone help me with a solution for the same as it's critical
>> >> case.
>> >>
>> >>
>> >>
>> >> Thank you In Advance
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com<mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>

RE: ActiveMQ custom plugin

Posted by Gupta Bharat <bh...@scania.com>.
I don't wish to add headers in the message I pasted. This message I am getting from user and it is content. Even the tag header is part of content. But when I route the message from Active MQ to IBM MQ certain attributes like destination topic name and message id need to be added. 

Also I am using MQTT client to publish a message on ActiveMQ specifying the topic name and message. I need to add that topic name as destination and also want to remove JWTtoken from message.

Publication:
Topic: Demo
Message: {"header":{"messageId":"fcbef565-18ea-429a-836f-7e24d9b53743","jwtToken":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo","correlId":"","initialMessageid":"fcbef565-18ea-429a-836f-7e24d9b53743","environment":"st5","producerUTCTimestamp":1515677099337,"contractId":"SCCO3822","producerVer":"1.0","messageType":"SendChatMessageInConversationMessage","appId":"fma","messageTypeVer":"1.0","receivers":[]},"body":{"conversationId":"2b575462-97bd-4e9a-8ac4-6fec793c836a","chatMessageId":"098ee4e7-8976-4c21-8f0a-521873fd6ac5","content":"grte","attachments":[]}}


I need *Demo* to be added in headers and remove jwtToken from message. I removed it. But what method I can use in ActiveMQ to publish it on Topic Demo instead of message with jwtToken value.

I Hope I am able to explain you better :)

Regards,
Bharat Gupta


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 1 februari 2018 15:02
To: ActiveMQ Users <us...@activemq.apache.org>
Cc: users-owner@activemq.apache.org
Subject: RE: ActiveMQ custom plugin

Oh, and I missed your second question. I would expect that you could add
headers similar to how the code you posted removed some. Does your question
mean that you tried that and it didn't work? If so, how did it fail?

Tim

On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> Is this in 5.x, or did you switch to Artemis?
>
> Your code is operating on a message, but what called your code? We'd need
> some context on how you got that message to know what you should do with it
> next.
>
> Tim
>
> On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Hello Tim,
>>
>> I am getting following message from client using MQTT
>>
>> {
>>         "header": {
>>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
>> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
>> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
>> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
>> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
>> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
>> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
>> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
>> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
>> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
>> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
>> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
>> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
>> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
>> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
>> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
>> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
>> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
>> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
>> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
>> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
>> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
>> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>>                 "correlId": "",
>>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
>> 9b53743",
>>                 "environment": "st5",
>>                 "producerUTCTimestamp": 1515677099337,
>>                 "contractId": "SCCO3822",
>>                 "producerVer": "1.0",
>>                 "messageType": "SendChatMessageInConversationMessage",
>>                 "appId": "fma",
>>                 "messageTypeVer": "1.0",
>>                 "receivers": []
>>         },
>>         "body": {
>>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>>                 "content": "grte",
>>                 "attachments": []
>>         }
>> }
>>
>> I am validating the message by validating the jwt token. I don’t want
>> jwtToken field in message once I have validate it and used following to
>> remove it:
>>
>> for (JsonNode jsonNode : jsonNodeRoot) {
>>            if (jsonNode instanceof ObjectNode) {
>>                ObjectNode o = (ObjectNode) jsonNode;
>>                o.remove("jwtToken");
>>
>>            }
>>        }
>>
>> But how to publish a message on topic once I have done the following
>> checks on it? What method I can use here?
>>
>> Also I wish to add certain attributes in the message header and then
>> publish on the topic how I can do that also?
>>
>> Thank You in Advance
>>
>> Regards,
>> Bharat Gupta
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 2 januari 2018 06:27
>> To: ActiveMQ Users <us...@activemq.apache.org>
>> Cc: users-owner@activemq.apache.org
>> Subject: Re: ActiveMQ custom plugin
>>
>> I spent a little time this evening looking through the ActiveMQ 5.x code
>> and didn't find an obvious way to hook into the MQTT-specific pieces, so
>> switching to Artemis may be your best bet.
>>
>> Tim
>>
>> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>>
>> > Bharat,
>> >
>> > I hadn't caught that this question was about making the connection
>> rather
>> > vs. the first question about sending messages across it; thanks for
>> helping
>> > me understand your question.
>> >
>> > As far as I know, the interception capabilities of 5.x apply only to the
>> > core broker using the interface you used in the earlier messages in this
>> > thread, but not to the code that translates non-OpenWire protocols such
>> as
>> > MQTT into OpenWire. I'll need to spend some time digging through the
>> code
>> > to make sure there isn't an MQTT plugin capability I don't know about,
>> and
>> > I probably won't get a chance to do that until the weekend. But unless I
>> > find something unexpected when I do that digging, what you want may not
>> be
>> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
>> > everything you're trying to do, then switching to it may be a good
>> option.
>> >
>> > Tim
>> >
>> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
>> wrote:
>> >
>> >> Yes the question I asked here is not answered earlier. In previous
>> >> threads/mail focus was on when client was publishing a message on
>> topic the
>> >> activemq.send method was called to intercept the message before it
>> actually
>> >> published on topic.
>> >>
>> >> Here I am majorly focusing on intercepting mqtt connections, which
>> means
>> >> intercepting the client request to activemq and Call my plugin there.
>> So
>> >> which method of activemq can be used here?
>> >>
>> >> As I went thru many solutions over internet and see Artemis as an
>> option.
>> >>
>> >> I hope I am able to put my point clear now. :) please let me know if
>> more
>> >> info is needed from my end.
>> >>
>> >>
>> >>
>> >> Sent from my iPhone
>> >>
>> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> >> tbain@alumni.duke.edu>> wrote:
>> >>
>> >> Is there some aspect of your question that's not answered by the first
>> >> 12(!) emails in the thread? I'm not clear why you're asking what
>> appears
>> >> to
>> >> be the same question again. If there's some new aspect of the question
>> or
>> >> something that wasn't previously answered, please highlight what it is.
>> >>
>> >> And no, I don't believe that Artemis is required to do what you're
>> trying
>> >> to do. It might be equally possible to do in Artemis compared to doing
>> in
>> >> 5.x (I don't know Artemis well enough to comment on whether this can be
>> >> done in Artemis), but you definitely don't "have to use Artemis here to
>> >> achieve this."
>> >>
>> >> Tim
>> >>
>> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> hello again,
>> >>
>> >> I am asking my question here again if you can possibly help me with a
>> >> method.
>> >>
>> >> 1. Need to intercept the Incoming connections from MQTT clients.
>> >> User is connecting to activemq broker by hitting on url and sending a
>> >> TOKEN [(hostname:port) + token]
>> >>
>> >> How can we intercept the connections and validate the token sent by
>> mqtt
>> >> client?
>> >>
>> >> I have my own custom plugin that will validate the token. Just Need to
>> >> know method on which we can call that Plugin.
>> >>
>> >> Also do we have to use Artemis here to achieve this?
>> >>
>> >> Thanks In Advance
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: Tuesday, December 5, 2017 7:29 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> I'd suggest that you store your cache of known credentials in your
>> plugin.
>> >> I'm not sure that you'd have access to the web session from a plugin,
>> >> because that's MQTT-specific, so I think your best bet would be to
>> store
>> >> it
>> >> in a Map (better: a Guava cache, so you get free age-off behavior)
>> within
>> >> your plugin.
>> >>
>> >> Tim
>> >>
>> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hi Tim,
>> >>
>> >> I am having a scenario here. Using custom plugin I am validating my JWT
>> >> tokens and fetching the claims from it.
>> >>
>> >> Claims:
>> >>
>> >> {
>> >>  "unique_name": "gubhpi",
>> >>  "sub": "gubhpi",
>> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>> >>  "AdAccount": "bguvvw",
>> >>  "FunctionalPermissions": "490879",
>> >>  "UserPermissions": [
>> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
>> >>    "1006"
>> >>  ],
>> >>  "iss": "https://xyz/",
>> >>  "aud": "58b99b37-db1c78d7fef5",
>> >>  "exp": 1510240047,
>> >>  "nbf": 1510236447
>> >> }
>> >>
>> >> From this I need to fetch "AdAccount": "bguvvw", and store it
>> >> somewhere(please suggest me-- context or session) and when next time
>> user
>> >> sends me message on activemq using mqtt or web socket I need to check
>> the
>> >> message header with the users stored in contextsession or from some
>> >> object.
>> >> If user is present then we validate else we don’t.
>> >>
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 29 november 2017 04:20
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hello Tim,
>> >>
>> >> Thank you for your help. :)
>> >>
>> >> I have used below method to fetch that text from message when client
>> >> publish on topic and it works.
>> >>
>> >> public void send(ProducerBrokerExchange producerExchange, Message
>> >> messageSend) throws Exception {
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>> >>
>> >>
>> >> ((ActiveMQTextMessage)messageSend).getText()
>> >> It returns the text from web console only.
>> >>
>> >>
>> >> Really appreciate your help here. :)
>> >>
>> >>
>> >>
>> >> Great, I'm glad I've been able to help.
>> >>
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> -----------------------
>> >>
>> >> Apart from this I have a situation here that when I try to execute
>> below
>> >> code:
>> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> >> creating a queue
>> >> 2. TextMessage claims = session.createTextMessage(payload); ---
>> >> converting
>> >> the string to message to send it on above made queue
>> >> 3. producer.send(dest, claims); --- send the message on
>> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> >> JWT_PAYLOAD
>> >> why?
>> >>
>> >>
>> >> What makes you think that this message on an advisory topic was your
>> >> message instead of a standard advisory message that's sent anytime a
>> >> non-anonymous producer sends a message? What makes you think that thos
>> >> message was sent instead of the message you sent to your queue, rather
>> >> than
>> >> sent *in addition to* the message on your queue? Can you share
>> >> before-and-after screenshots of your queue's row on the Queues page of
>> >> the
>> >> web console? And were there any warnings or errors logged in the
>> broker's
>> >> logs when this happened?
>> >>
>> >> 4. Before executing producer.send(dest, claims); ----- it is going on
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> >> returning null as it is again checking for Content and data. So my ques
>> >> is
>> >> why it is going back again on first line? Why it is not simply putting
>> >> the
>> >> data on queue?
>> >>
>> >>
>> >> I didn't understand what you meant by "it is going back again on first
>> >> line." Are you saying that the broker is putting the original message
>> >> onto
>> >> your topic? If so, that's because by calling super.send(), you're
>> >> allowing
>> >> the publishing of the original message to the original topic to
>> >> continue. I
>> >> advised you to do that because I didn't realize that you wanted to
>> >> transform the message and publish it to a different destination, but
>> >> since
>> >> it seems like you do, I think you don't want to call super.send() after
>> >> all.
>> >>
>> >> If that's not what you meant, then please help me to better understand
>> >> your
>> >> question.
>> >>
>> >> @Override
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> Message
>> >> messageSend) throws Exception {
>> >> if(messageSend != null)
>> >> {
>> >>        if(messageSend.getContent() != null)
>> >> {
>> >>        =               byte[] msg = ((ActiveMQMessage)
>> >> messageSend).getContent().data;
>> >>
>> >>                String message = new String(msg);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> message);
>> >>
>> >>                DecodedJWT jwt = JWT.decode(message);
>> >>                byte[] contentBytes = String.format("%s.%s",
>> >> jwt.getHeader(), jwt.getPayload())
>> >>                                .getBytes(StandardCharsets.UTF_8);
>> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> >> getSignature());
>> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>> >>                                + "please enter your key"
>> >>                                + "-----END PUBLIC KEY-----";
>> >>
>> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>> >>
>> >>                Security.addProvider(new BouncyCastleProvider());
>> >>                Signature signatureInstance =
>> >> Signature.getInstance("SHA256withRSA",
>> >> "BC");
>> >>                signatureInstance.initVerify(pk);
>> >>                signatureInstance.update(contentBytes);
>> >>                boolean result = signatureInstance.verify(
>> >> signatureBytes);
>> >>
>> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>> >>
>> >>                String payload = new String(pload);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> payload);
>> >>                logger.warn("result::::::::::::::::              " +
>> >> result);
>> >>                if (result = true) {
>> >>
>> >>                        // Create a ConnectionFactory
>> >>            ActiveMQConnectionFactory connectionFactory = new
>> >> ActiveMQConnectionFactory("vm://localhost");
>> >>
>> >>            // Create a Connection
>> >>            javax.jms.Connection jmsConnection = connectionFactory.
>> >> createConnection();
>> >>            jmsConnection.start();
>> >>
>> >>            // Create a Session
>> >>            Session session = jmsConnection.createSession(false,
>> >> Session.AUTO_ACKNOWLEDGE);
>> >>
>> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
>> >>                        MessageProducer producer =
>> >> session.createProducer(dest);
>> >>                        producer.setDeliveryMode(
>> >> DeliveryMode.PERSISTENT);
>> >>
>> >>                        TextMessage claims = session.createTextMessage(
>> >> payload);
>> >>                        claims.setJMSType("TEXT");
>> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>                        producer.send(dest, claims);
>> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>
>> >>
>> >> //
>> >>                        MessageConsumer consumer =
>> >> session.createConsumer(dest);
>> >>                        consumer.setMessageListener(this);
>> >>
>> >>                }
>> >>
>> >>                else {
>> >>
>> >>                        logger.warn("Else Authentication failed. Please
>> >> send Valid Token");
>> >>                }
>> >>
>> >>                super.send(producerExchange, messageSend);
>> >>                // getNext().send(producerExchange, messageSend);
>> >>
>> >>        }
>> >>
>> >>        else
>> >>        {
>> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>> >>        }
>> >>        }
>> >> else
>> >> {
>> >>        logger.fatal("MESSAGE SEND IS NULL");
>> >> }
>> >>        }
>> >>
>> >>        @Override
>> >>        public void onMessage(javax.jms.Message message) {
>> >>                  String messageText = null;
>> >>                try {
>> >>                    if (message instanceof TextMessage) {
>> >>                        TextMessage textMessage = (TextMessage) message;
>> >>                        messageText = textMessage.getText();
>> >>                        System.out.println("messageText = " +
>> >> messageText);
>> >>                    }
>> >>                } catch (JMSException e) {
>> >>                    //Handle the exception appropriately
>> >>                }
>> >>        }
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
>> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 27 november 2017 08:12
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >> Thank you for providing that code. I spent some time running your code,
>> >> and
>> >> found the following problems with it, which are causing this to not
>> work
>> >> as
>> >> you intended:
>> >>
>> >>   1. The signature for the send() method is "public void
>> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> >> throws
>> >>   Exception," not the signature you had defined. Because your signature
>> >>   didn't match the method you were trying to override, you weren't
>> >> actually
>> >>   overriding a method that would be called when a message was sent, but
>> >>   instead you were simply defining a public method that nothing ever
>> >> called.
>> >>   The compiler would have caught this for you if you'd annotated the
>> >> method
>> >>   as @Override; you should be using that annotation for all overriden
>> >>   methods, for exactly this reason.
>> >>   2. messageSend.getContent() returns null for the test message I sent
>> >> via
>> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> >> returns
>> >>   the body. I think this same code would work for an MQTT message, but
>> >> since
>> >>   I've never used MQTT you'll need to confirm that.
>> >>   3. I mentioned this earlier, but your send() method needs to call
>> >>   super.send() at the end, otherwise the broker's not going to process
>> >> any
>> >>   messages and you're going to be wondering why the broker "doesn't
>> >> work."
>> >>   This doesn't explain why you're not seeing your logging occur, but
>> >> once
>> >> we
>> >>   get past that problem, this is the next issue you're going to hit.
>> >>
>> >> Tim
>> >>
>> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
>> bharat.gupta@scania.com
>> >> <ma...@scania.com>>
>> >> wrote:
>> >>
>> >> Hello,
>> >>
>> >> MyBroker.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import java.util.HashMap;
>> >> import java.util.Map;
>> >>
>> >> import javax.jms.Destination;
>> >> import javax.jms.ExceptionListener;
>> >> import javax.jms.JMSException;
>> >> import javax.jms.MessageConsumer;
>> >> import javax.jms.Session;
>> >> import javax.jms.TextMessage;
>> >>
>> >> import org.apache.activemq.ActiveMQConnection;
>> >> import org.apache.activemq.ActiveMQConnectionFactory;
>> >> import org.apache.activemq.ActiveMQMessageConsumer;
>> >> import org.apache.activemq.broker.BrokerFilter;
>> >> import org.apache.activemq.broker.Connection;
>> >> import org.apache.activemq.broker.ConnectionContext;
>> >> import org.apache.activemq.broker.ProducerBrokerExchange;
>> >> import org.apache.activemq.broker.region.Subscription;
>> >> import org.apache.activemq.command.ActiveMQDestination;
>> >> import org.apache.activemq.command.ActiveMQMessage;
>> >> import org.apache.activemq.command.ConnectionInfo;
>> >> import org.apache.activemq.command.ConsumerInfo;
>> >> import org.apache.activemq.command.Message;
>> >> import org.apache.activemq.command.SessionInfo;
>> >> import org.apache.log4j.Logger;
>> >>
>> >>
>> >> public class MyBroker extends BrokerFilter {
>> >>
>> >>                final static Logger logger = Logger.getLogger(MyBroker.
>> >> class);
>> >>                private Map<String, String> userMap = new
>> >> HashMap<String,
>> >> String>();
>> >>
>> >>                public MyBroker(org.apache.activemq.broker.Broker
>> >> next)
>> >> {
>> >>                                super(next);
>> >>
>> >>                }
>> >>
>> >>
>> >>
>> >>                public void send(ProducerBrokerExchange
>> >> producerExchange,
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>                {
>> >>                                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                                  Message data =
>> >> messageSend.getMessage();
>> >>                                  logger.warn("
>> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> >> + data);
>> >>                                  String message = new
>> >> String(messageBytes);
>> >>                                  logger.warn("messageBody" + message);
>> >>                                  logger.info<http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>                                  logger.fatal("messageBody" +
>> >> message);
>> >>                                  logger.debug("messageBody" +
>> >> message);
>> >>
>> >>
>> >>                 }
>> >>
>> >>                public void addConnection(ConnectionContext context,
>> >> ConnectionInfo info)
>> >>            throws Exception {
>> >>
>> >>                                info.getUserName();
>> >>                                info.toString();
>> >>
>> >>
>> >>                                logger.warn("info1" +
>> >> info.getUserName());
>> >>                                logger.fatal("info2" +
>> >> info.toString());
>> >>
>> >>       String token = context.getUserName();
>> >>       logger.debug("token1" + token);
>> >>       logger.warn("token2" + token);
>> >>       logger.fatal("token3" + token);
>> >>
>> >>
>> >>        // Then call your parent
>> >>        super.addConnection(context, info);
>> >>    }
>> >>
>> >>    public Subscription addConsumer(ConnectionContext context,
>> >> ConsumerInfo info) throws Exception {
>> >>
>> >>
>> >>
>> >>        ActiveMQDestination dest = info.getDestination();
>> >>        Connection conn = context.getConnection();
>> >>        if (dest != null) {
>> >>            String destName = info.getDestination().getPhysicalName();
>> >>            String clientId = context.getClientId();
>> >>            String allowedDest = userMap.get(clientId);
>> >>
>> >>            logger.info<http://logger.info>(">>> Got Consumer Add
>> request
>> >> { Destination:
>> >> " +
>> >> destName
>> >>                    + ", Remote Address: " + conn.getRemoteAddress()
>> >>                    + ", ClientID: " + clientId
>> >>                    + " }");
>> >>            if (allowedDest != null && (allowedDest.equals("*") ||
>> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>> >>                logger.info<http://logger.info>(">>> Subscription
>> >> allowed");
>> >>            } else {
>> >>                logger.error(">>> Destination not allowed. Subscription
>> >> denied!");
>> >>                throw new Exception(">>> Subscription denied!");
>> >>            }
>> >>        } else {
>> >>            logger.error("<<< Got Consumer Add request from Remote
>> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>> >>        }
>> >>        return super.addConsumer(context, info);
>> >>    }
>> >> }
>> >>
>> >> Sample.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import org.apache.activemq.ActiveMQMessageProducer;
>> >> import org.apache.activemq.broker.Broker;
>> >> import org.apache.activemq.broker.BrokerPlugin;
>> >> import org.apache.log4j.Logger;
>> >>
>> >> public class Sample  implements BrokerPlugin {
>> >>
>> >>                final static Logger logger =
>> >> Logger.getLogger(Sample.class)
>> >> ;
>> >>
>> >>                public static void main(String[] args) {
>> >>
>> >>
>> >>                }
>> >>
>> >>                private void runMe(String parameter){
>> >>
>> >>                                if(logger.isDebugEnabled()){
>> >>                                                logger.debug("This is
>> >> debug : " + parameter);
>> >>                                }
>> >>
>> >>                                if(logger.isInfoEnabled()){
>> >>                                                logger.info<
>> http://logger.
>> >> info>("This is
>> >> info
>> >> : " + parameter);
>> >>                                }
>> >>
>> >>                                logger.warn("This is warn : " +
>> >> parameter);
>> >>                                logger.error("This is error : " +
>> >> parameter);
>> >>                                logger.fatal("This is fatal : " +
>> >> parameter);
>> >>
>> >>                }
>> >>
>> >>                public Broker installPlugin(Broker broker) throws
>> >> Exception {
>> >>                                Sample sample = new Sample();
>> >>                                sample.runMe("ActiveMQ Hello");
>> >>
>> >>                                return new MyBroker(broker);
>> >>                }
>> >>
>> >>
>> >> }
>> >>
>> >> The above are two classes I have implemented for my custom plugin.
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim
>> >> Bain
>> >> Sent: Sunday, November 26, 2017 4:31 AM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >> hello Tim,
>> >>
>> >>
>> >>
>> >> My Custom Plugin is getting installed as I am using log4j to print
>> >> random
>> >> stuff and its getting printed in logs.
>> >> Can you please describe in more detail exactly what methods that
>> >> logging
>> >> is done in and how it proves that the plugin was actually installed? If
>> >> (for example) your logging is only in your constructor or your
>> >> initialization method, that just proves that Spring made your bean, not
>> >> that it was installed in the broker as a plugin.
>> >>
>> >> I am hereby attaching my codes that you can see.
>> >> Where? All I see is your activemq.xml snippet below, but no actual code
>> >> for your plugin.
>> >>
>> >> activemq.xml configurations:
>> >>
>> >> <plugins>
>> >>
>> >>                               <bean id="sample"
>> >>
>> >>                                class="jwt.validation.Sample"
>> >>
>> >>                                xmlns="http://www.
>> >> springframework.org/schema/beans<http://springframework.org/
>> schema/beans
>> >> >"/>
>> >>
>> >>                               </plugins>
>> >>
>> >>
>> >>
>> >> Also I would like to explain you my exact requirement.
>> >>
>> >>
>> >>
>> >> The diagram below shows what I am trying to do it now.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> [cid:image001.png@01D3658E.4A6B3E20]
>> >> That sounds like it should be doable via an interceptor based on what I
>> >> know about them (i.e. the wiki, but no hands-on experience).
>> >>
>> >> QUESTIONS:
>> >>
>> >>
>> >>
>> >> 1.       how can we provide JWT to custom plugin from client?
>> >> If you have to use MQTT, you'll need to encode it directly into the
>> >> message body, because that's all MQTT supports. You could for example
>> >> make
>> >> a JSON payload with two fields: the JWT and the message body. Or you
>> >> could
>> >> switch to OpenWire and put the JWT into a custom header on the message
>> >> the
>> >> client is sending.
>> >>
>> >> 2.       do we need to store jwt in topic first and then consume it
>> >> from
>> >> topic to validate it? (not idle case)
>> >> You need to put the JWT into the message itself so that your plugin can
>> >> evaluate the token and then decide what to do with the message based on
>> >> that evaluation.
>> >>
>> >> 3.       can we call restful service from activeMQ broker that can
>> >> validate token and gives the result back to broker?
>> >> Yes, as far as I know, you'd be able to do that from within the broker.
>> >> (I've never done that, but I'm not aware of anything that would prevent
>> >> you
>> >> from doing it.)
>> >>
>> >> Tim please let me know if I am clear with my requirements. Else we can
>> >> talk more on call/phone.
>> >>
>> >>
>> >>
>> >> Thanks in advance
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>]
>> >> On Behalf Of Tim Bain
>> >> Sent: Friday, November 24, 2017 7:19 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>
>> >>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> 1. Your send() method needs to call super.send() after doing your
>> >> custom
>> >>
>> >> work, otherwise the message will never be sent to the real Broker
>> >> object.
>> >>
>> >> Please review the wiki page I referred to earlier, which covers how to
>> >>
>> >> implement an interceptor.
>> >>
>> >>
>> >>
>> >> 2. To me it sounds like your plugin isn't getting installed. Do you
>> >> have
>> >>
>> >> any indication that it is, from logs or some other mechanism? And can
>> >> you
>> >>
>> >> please share the code of the class that implements BrokerPlugin, to
>> >> confirm
>> >>
>> >> that your installPlugin() method looks right, and the XML block where
>> >> you
>> >>
>> >> create the plugin bean?
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I tried implementing the method as below:
>> >>
>> >>
>> >>
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> >>
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>
>> >>         {
>> >>
>> >>                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                  String message = new String(messageBytes);
>> >>
>> >>                  logger.info<http://logger.info><http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>
>> >>        }
>> >>
>> >>
>> >>
>> >> Also I am publishing a message on a topic even though this send()
>> >> method
>> >>
>> >> is not been called as logger.info<http://logger.info><
>> http://logger.info>
>> >> is not getting
>> >> printed in my Custom
>> >>
>> >> Plugin.
>> >>
>> >>
>> >>
>> >> Could you please help me on this?
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>> >>
>> >> Sent: Friday, November 24, 2017 7:15 PM
>> >>
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>>
>> >>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> As I said in your other thread, you would do that by implementing
>> >> code
>> >> in
>> >>
>> >> the send() method of your subclass of BrokerFilter, which you would
>> >> create
>> >>
>> >> and return in your installPlugin() method.
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I have a scenario as follows:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 1.       I have Custom Plugins that decrypts the data and validates
>> >> it.
>> >>
>> >>
>> >>
>> >> 2.       I am getting Encrypted data (token) from user that need to
>> >> be
>> >>
>> >> decrypted on custom plugin.
>> >>
>> >>
>> >>
>> >> 3.       Client is accessing the broker using mqtt protocol
>> >>
>> >>
>> >>
>> >> Need Solution for the following:
>> >>
>> >>
>> >>
>> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>> >>
>> >> validate the  data(token) in my custom plugin
>> >>
>> >>
>> >>
>> >> 2.       How to extract a data what customer is sending? So that I
>> >> can
>> >>
>> >> extract the data, decrypt the message and validate.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Implementation so far:
>> >>
>> >>
>> >>
>> >> 1.       Custom Plugin is ready and JAR has been added in
>> >> <ActiveMQ>/libs
>> >>
>> >>
>> >>
>> >> 2.       Added the plugin configuration in activemq.xml
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Could anyone help me with a solution for the same as it's critical
>> >> case.
>> >>
>> >>
>> >>
>> >> Thank you In Advance
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com<mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>

RE: ActiveMQ custom plugin

Posted by Tim Bain <tb...@alumni.duke.edu>.
Oh, and I missed your second question. I would expect that you could add
headers similar to how the code you posted removed some. Does your question
mean that you tried that and it didn't work? If so, how did it fail?

Tim

On Feb 1, 2018 6:59 AM, "Tim Bain" <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> Is this in 5.x, or did you switch to Artemis?
>
> Your code is operating on a message, but what called your code? We'd need
> some context on how you got that message to know what you should do with it
> next.
>
> Tim
>
> On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Hello Tim,
>>
>> I am getting following message from client using MQTT
>>
>> {
>>         "header": {
>>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU
>> zI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5p
>> a3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThj
>> YTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNh
>> LTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVm
>> ZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3
>> IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25z
>> IjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5
>> OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwi
>> YXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1Iiwi
>> ZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1
>> d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJ
>> ftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi
>> 3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-
>> V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcx
>> AzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnD
>> t1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmH
>> qfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0
>> BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4
>> z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEr
>> aBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPG
>> a-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GE
>> Rg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>>                 "correlId": "",
>>                 "initialMessageid": "fcbef565-18ea-429a-836f-7e24d
>> 9b53743",
>>                 "environment": "st5",
>>                 "producerUTCTimestamp": 1515677099337,
>>                 "contractId": "SCCO3822",
>>                 "producerVer": "1.0",
>>                 "messageType": "SendChatMessageInConversationMessage",
>>                 "appId": "fma",
>>                 "messageTypeVer": "1.0",
>>                 "receivers": []
>>         },
>>         "body": {
>>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>>                 "content": "grte",
>>                 "attachments": []
>>         }
>> }
>>
>> I am validating the message by validating the jwt token. I don’t want
>> jwtToken field in message once I have validate it and used following to
>> remove it:
>>
>> for (JsonNode jsonNode : jsonNodeRoot) {
>>            if (jsonNode instanceof ObjectNode) {
>>                ObjectNode o = (ObjectNode) jsonNode;
>>                o.remove("jwtToken");
>>
>>            }
>>        }
>>
>> But how to publish a message on topic once I have done the following
>> checks on it? What method I can use here?
>>
>> Also I wish to add certain attributes in the message header and then
>> publish on the topic how I can do that also?
>>
>> Thank You in Advance
>>
>> Regards,
>> Bharat Gupta
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 2 januari 2018 06:27
>> To: ActiveMQ Users <us...@activemq.apache.org>
>> Cc: users-owner@activemq.apache.org
>> Subject: Re: ActiveMQ custom plugin
>>
>> I spent a little time this evening looking through the ActiveMQ 5.x code
>> and didn't find an obvious way to hook into the MQTT-specific pieces, so
>> switching to Artemis may be your best bet.
>>
>> Tim
>>
>> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>>
>> > Bharat,
>> >
>> > I hadn't caught that this question was about making the connection
>> rather
>> > vs. the first question about sending messages across it; thanks for
>> helping
>> > me understand your question.
>> >
>> > As far as I know, the interception capabilities of 5.x apply only to the
>> > core broker using the interface you used in the earlier messages in this
>> > thread, but not to the code that translates non-OpenWire protocols such
>> as
>> > MQTT into OpenWire. I'll need to spend some time digging through the
>> code
>> > to make sure there isn't an MQTT plugin capability I don't know about,
>> and
>> > I probably won't get a chance to do that until the weekend. But unless I
>> > find something unexpected when I do that digging, what you want may not
>> be
>> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
>> > everything you're trying to do, then switching to it may be a good
>> option.
>> >
>> > Tim
>> >
>> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com>
>> wrote:
>> >
>> >> Yes the question I asked here is not answered earlier. In previous
>> >> threads/mail focus was on when client was publishing a message on
>> topic the
>> >> activemq.send method was called to intercept the message before it
>> actually
>> >> published on topic.
>> >>
>> >> Here I am majorly focusing on intercepting mqtt connections, which
>> means
>> >> intercepting the client request to activemq and Call my plugin there.
>> So
>> >> which method of activemq can be used here?
>> >>
>> >> As I went thru many solutions over internet and see Artemis as an
>> option.
>> >>
>> >> I hope I am able to put my point clear now. :) please let me know if
>> more
>> >> info is needed from my end.
>> >>
>> >>
>> >>
>> >> Sent from my iPhone
>> >>
>> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> >> tbain@alumni.duke.edu>> wrote:
>> >>
>> >> Is there some aspect of your question that's not answered by the first
>> >> 12(!) emails in the thread? I'm not clear why you're asking what
>> appears
>> >> to
>> >> be the same question again. If there's some new aspect of the question
>> or
>> >> something that wasn't previously answered, please highlight what it is.
>> >>
>> >> And no, I don't believe that Artemis is required to do what you're
>> trying
>> >> to do. It might be equally possible to do in Artemis compared to doing
>> in
>> >> 5.x (I don't know Artemis well enough to comment on whether this can be
>> >> done in Artemis), but you definitely don't "have to use Artemis here to
>> >> achieve this."
>> >>
>> >> Tim
>> >>
>> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> hello again,
>> >>
>> >> I am asking my question here again if you can possibly help me with a
>> >> method.
>> >>
>> >> 1. Need to intercept the Incoming connections from MQTT clients.
>> >> User is connecting to activemq broker by hitting on url and sending a
>> >> TOKEN [(hostname:port) + token]
>> >>
>> >> How can we intercept the connections and validate the token sent by
>> mqtt
>> >> client?
>> >>
>> >> I have my own custom plugin that will validate the token. Just Need to
>> >> know method on which we can call that Plugin.
>> >>
>> >> Also do we have to use Artemis here to achieve this?
>> >>
>> >> Thanks In Advance
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: Tuesday, December 5, 2017 7:29 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> I'd suggest that you store your cache of known credentials in your
>> plugin.
>> >> I'm not sure that you'd have access to the web session from a plugin,
>> >> because that's MQTT-specific, so I think your best bet would be to
>> store
>> >> it
>> >> in a Map (better: a Guava cache, so you get free age-off behavior)
>> within
>> >> your plugin.
>> >>
>> >> Tim
>> >>
>> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hi Tim,
>> >>
>> >> I am having a scenario here. Using custom plugin I am validating my JWT
>> >> tokens and fetching the claims from it.
>> >>
>> >> Claims:
>> >>
>> >> {
>> >>  "unique_name": "gubhpi",
>> >>  "sub": "gubhpi",
>> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>> >>  "AdAccount": "bguvvw",
>> >>  "FunctionalPermissions": "490879",
>> >>  "UserPermissions": [
>> >>    "2482503678 <(248)%20250-3678> <(248)%20250-3678>",
>> >>    "1006"
>> >>  ],
>> >>  "iss": "https://xyz/",
>> >>  "aud": "58b99b37-db1c78d7fef5",
>> >>  "exp": 1510240047,
>> >>  "nbf": 1510236447
>> >> }
>> >>
>> >> From this I need to fetch "AdAccount": "bguvvw", and store it
>> >> somewhere(please suggest me-- context or session) and when next time
>> user
>> >> sends me message on activemq using mqtt or web socket I need to check
>> the
>> >> message header with the users stored in contextsession or from some
>> >> object.
>> >> If user is present then we validate else we don’t.
>> >>
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 29 november 2017 04:20
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com>> wrote:
>> >>
>> >> Hello Tim,
>> >>
>> >> Thank you for your help. :)
>> >>
>> >> I have used below method to fetch that text from message when client
>> >> publish on topic and it works.
>> >>
>> >> public void send(ProducerBrokerExchange producerExchange, Message
>> >> messageSend) throws Exception {
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>> >>
>> >>
>> >> ((ActiveMQTextMessage)messageSend).getText()
>> >> It returns the text from web console only.
>> >>
>> >>
>> >> Really appreciate your help here. :)
>> >>
>> >>
>> >>
>> >> Great, I'm glad I've been able to help.
>> >>
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> ------------------------------------------------------------
>> >> -----------------------
>> >>
>> >> Apart from this I have a situation here that when I try to execute
>> below
>> >> code:
>> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> >> creating a queue
>> >> 2. TextMessage claims = session.createTextMessage(payload); ---
>> >> converting
>> >> the string to message to send it on above made queue
>> >> 3. producer.send(dest, claims); --- send the message on
>> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> >> JWT_PAYLOAD
>> >> why?
>> >>
>> >>
>> >> What makes you think that this message on an advisory topic was your
>> >> message instead of a standard advisory message that's sent anytime a
>> >> non-anonymous producer sends a message? What makes you think that thos
>> >> message was sent instead of the message you sent to your queue, rather
>> >> than
>> >> sent *in addition to* the message on your queue? Can you share
>> >> before-and-after screenshots of your queue's row on the Queues page of
>> >> the
>> >> web console? And were there any warnings or errors logged in the
>> broker's
>> >> logs when this happened?
>> >>
>> >> 4. Before executing producer.send(dest, claims); ----- it is going on
>> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> >> returning null as it is again checking for Content and data. So my ques
>> >> is
>> >> why it is going back again on first line? Why it is not simply putting
>> >> the
>> >> data on queue?
>> >>
>> >>
>> >> I didn't understand what you meant by "it is going back again on first
>> >> line." Are you saying that the broker is putting the original message
>> >> onto
>> >> your topic? If so, that's because by calling super.send(), you're
>> >> allowing
>> >> the publishing of the original message to the original topic to
>> >> continue. I
>> >> advised you to do that because I didn't realize that you wanted to
>> >> transform the message and publish it to a different destination, but
>> >> since
>> >> it seems like you do, I think you don't want to call super.send() after
>> >> all.
>> >>
>> >> If that's not what you meant, then please help me to better understand
>> >> your
>> >> question.
>> >>
>> >> @Override
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> Message
>> >> messageSend) throws Exception {
>> >> if(messageSend != null)
>> >> {
>> >>        if(messageSend.getContent() != null)
>> >> {
>> >>        =               byte[] msg = ((ActiveMQMessage)
>> >> messageSend).getContent().data;
>> >>
>> >>                String message = new String(msg);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> message);
>> >>
>> >>                DecodedJWT jwt = JWT.decode(message);
>> >>                byte[] contentBytes = String.format("%s.%s",
>> >> jwt.getHeader(), jwt.getPayload())
>> >>                                .getBytes(StandardCharsets.UTF_8);
>> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> >> getSignature());
>> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>> >>                                + "please enter your key"
>> >>                                + "-----END PUBLIC KEY-----";
>> >>
>> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>> >>
>> >>                Security.addProvider(new BouncyCastleProvider());
>> >>                Signature signatureInstance =
>> >> Signature.getInstance("SHA256withRSA",
>> >> "BC");
>> >>                signatureInstance.initVerify(pk);
>> >>                signatureInstance.update(contentBytes);
>> >>                boolean result = signatureInstance.verify(
>> >> signatureBytes);
>> >>
>> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>> >>
>> >>                String payload = new String(pload);
>> >>                logger.warn("messageBody::::::::::::::::              "
>> >> +
>> >> payload);
>> >>                logger.warn("result::::::::::::::::              " +
>> >> result);
>> >>                if (result = true) {
>> >>
>> >>                        // Create a ConnectionFactory
>> >>            ActiveMQConnectionFactory connectionFactory = new
>> >> ActiveMQConnectionFactory("vm://localhost");
>> >>
>> >>            // Create a Connection
>> >>            javax.jms.Connection jmsConnection = connectionFactory.
>> >> createConnection();
>> >>            jmsConnection.start();
>> >>
>> >>            // Create a Session
>> >>            Session session = jmsConnection.createSession(false,
>> >> Session.AUTO_ACKNOWLEDGE);
>> >>
>> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
>> >>                        MessageProducer producer =
>> >> session.createProducer(dest);
>> >>                        producer.setDeliveryMode(
>> >> DeliveryMode.PERSISTENT);
>> >>
>> >>                        TextMessage claims = session.createTextMessage(
>> >> payload);
>> >>                        claims.setJMSType("TEXT");
>> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>                        producer.send(dest, claims);
>> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> >> claims);
>> >>
>> >>
>> >> //
>> >>                        MessageConsumer consumer =
>> >> session.createConsumer(dest);
>> >>                        consumer.setMessageListener(this);
>> >>
>> >>                }
>> >>
>> >>                else {
>> >>
>> >>                        logger.warn("Else Authentication failed. Please
>> >> send Valid Token");
>> >>                }
>> >>
>> >>                super.send(producerExchange, messageSend);
>> >>                // getNext().send(producerExchange, messageSend);
>> >>
>> >>        }
>> >>
>> >>        else
>> >>        {
>> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>> >>        }
>> >>        }
>> >> else
>> >> {
>> >>        logger.fatal("MESSAGE SEND IS NULL");
>> >> }
>> >>        }
>> >>
>> >>        @Override
>> >>        public void onMessage(javax.jms.Message message) {
>> >>                  String messageText = null;
>> >>                try {
>> >>                    if (message instanceof TextMessage) {
>> >>                        TextMessage textMessage = (TextMessage) message;
>> >>                        messageText = textMessage.getText();
>> >>                        System.out.println("messageText = " +
>> >> messageText);
>> >>                    }
>> >>                } catch (JMSException e) {
>> >>                    //Handle the exception appropriately
>> >>                }
>> >>        }
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>
>> <+46%2070%20086%2090%2007>, +91-9718483802 <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> bharat.gupta@scania.com<ma...@scania.com>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim Bain
>> >> Sent: den 27 november 2017 08:12
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >> Thank you for providing that code. I spent some time running your code,
>> >> and
>> >> found the following problems with it, which are causing this to not
>> work
>> >> as
>> >> you intended:
>> >>
>> >>   1. The signature for the send() method is "public void
>> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> >> throws
>> >>   Exception," not the signature you had defined. Because your signature
>> >>   didn't match the method you were trying to override, you weren't
>> >> actually
>> >>   overriding a method that would be called when a message was sent, but
>> >>   instead you were simply defining a public method that nothing ever
>> >> called.
>> >>   The compiler would have caught this for you if you'd annotated the
>> >> method
>> >>   as @Override; you should be using that annotation for all overriden
>> >>   methods, for exactly this reason.
>> >>   2. messageSend.getContent() returns null for the test message I sent
>> >> via
>> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> >> returns
>> >>   the body. I think this same code would work for an MQTT message, but
>> >> since
>> >>   I've never used MQTT you'll need to confirm that.
>> >>   3. I mentioned this earlier, but your send() method needs to call
>> >>   super.send() at the end, otherwise the broker's not going to process
>> >> any
>> >>   messages and you're going to be wondering why the broker "doesn't
>> >> work."
>> >>   This doesn't explain why you're not seeing your logging occur, but
>> >> once
>> >> we
>> >>   get past that problem, this is the next issue you're going to hit.
>> >>
>> >> Tim
>> >>
>> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <
>> bharat.gupta@scania.com
>> >> <ma...@scania.com>>
>> >> wrote:
>> >>
>> >> Hello,
>> >>
>> >> MyBroker.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import java.util.HashMap;
>> >> import java.util.Map;
>> >>
>> >> import javax.jms.Destination;
>> >> import javax.jms.ExceptionListener;
>> >> import javax.jms.JMSException;
>> >> import javax.jms.MessageConsumer;
>> >> import javax.jms.Session;
>> >> import javax.jms.TextMessage;
>> >>
>> >> import org.apache.activemq.ActiveMQConnection;
>> >> import org.apache.activemq.ActiveMQConnectionFactory;
>> >> import org.apache.activemq.ActiveMQMessageConsumer;
>> >> import org.apache.activemq.broker.BrokerFilter;
>> >> import org.apache.activemq.broker.Connection;
>> >> import org.apache.activemq.broker.ConnectionContext;
>> >> import org.apache.activemq.broker.ProducerBrokerExchange;
>> >> import org.apache.activemq.broker.region.Subscription;
>> >> import org.apache.activemq.command.ActiveMQDestination;
>> >> import org.apache.activemq.command.ActiveMQMessage;
>> >> import org.apache.activemq.command.ConnectionInfo;
>> >> import org.apache.activemq.command.ConsumerInfo;
>> >> import org.apache.activemq.command.Message;
>> >> import org.apache.activemq.command.SessionInfo;
>> >> import org.apache.log4j.Logger;
>> >>
>> >>
>> >> public class MyBroker extends BrokerFilter {
>> >>
>> >>                final static Logger logger = Logger.getLogger(MyBroker.
>> >> class);
>> >>                private Map<String, String> userMap = new
>> >> HashMap<String,
>> >> String>();
>> >>
>> >>                public MyBroker(org.apache.activemq.broker.Broker
>> >> next)
>> >> {
>> >>                                super(next);
>> >>
>> >>                }
>> >>
>> >>
>> >>
>> >>                public void send(ProducerBrokerExchange
>> >> producerExchange,
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>                {
>> >>                                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                                  Message data =
>> >> messageSend.getMessage();
>> >>                                  logger.warn("
>> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> >> + data);
>> >>                                  String message = new
>> >> String(messageBytes);
>> >>                                  logger.warn("messageBody" + message);
>> >>                                  logger.info<http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>                                  logger.fatal("messageBody" +
>> >> message);
>> >>                                  logger.debug("messageBody" +
>> >> message);
>> >>
>> >>
>> >>                 }
>> >>
>> >>                public void addConnection(ConnectionContext context,
>> >> ConnectionInfo info)
>> >>            throws Exception {
>> >>
>> >>                                info.getUserName();
>> >>                                info.toString();
>> >>
>> >>
>> >>                                logger.warn("info1" +
>> >> info.getUserName());
>> >>                                logger.fatal("info2" +
>> >> info.toString());
>> >>
>> >>       String token = context.getUserName();
>> >>       logger.debug("token1" + token);
>> >>       logger.warn("token2" + token);
>> >>       logger.fatal("token3" + token);
>> >>
>> >>
>> >>        // Then call your parent
>> >>        super.addConnection(context, info);
>> >>    }
>> >>
>> >>    public Subscription addConsumer(ConnectionContext context,
>> >> ConsumerInfo info) throws Exception {
>> >>
>> >>
>> >>
>> >>        ActiveMQDestination dest = info.getDestination();
>> >>        Connection conn = context.getConnection();
>> >>        if (dest != null) {
>> >>            String destName = info.getDestination().getPhysicalName();
>> >>            String clientId = context.getClientId();
>> >>            String allowedDest = userMap.get(clientId);
>> >>
>> >>            logger.info<http://logger.info>(">>> Got Consumer Add
>> request
>> >> { Destination:
>> >> " +
>> >> destName
>> >>                    + ", Remote Address: " + conn.getRemoteAddress()
>> >>                    + ", ClientID: " + clientId
>> >>                    + " }");
>> >>            if (allowedDest != null && (allowedDest.equals("*") ||
>> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>> >>                logger.info<http://logger.info>(">>> Subscription
>> >> allowed");
>> >>            } else {
>> >>                logger.error(">>> Destination not allowed. Subscription
>> >> denied!");
>> >>                throw new Exception(">>> Subscription denied!");
>> >>            }
>> >>        } else {
>> >>            logger.error("<<< Got Consumer Add request from Remote
>> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>> >>        }
>> >>        return super.addConsumer(context, info);
>> >>    }
>> >> }
>> >>
>> >> Sample.java
>> >>
>> >> package jwt.validation;
>> >>
>> >> import org.apache.activemq.ActiveMQMessageProducer;
>> >> import org.apache.activemq.broker.Broker;
>> >> import org.apache.activemq.broker.BrokerPlugin;
>> >> import org.apache.log4j.Logger;
>> >>
>> >> public class Sample  implements BrokerPlugin {
>> >>
>> >>                final static Logger logger =
>> >> Logger.getLogger(Sample.class)
>> >> ;
>> >>
>> >>                public static void main(String[] args) {
>> >>
>> >>
>> >>                }
>> >>
>> >>                private void runMe(String parameter){
>> >>
>> >>                                if(logger.isDebugEnabled()){
>> >>                                                logger.debug("This is
>> >> debug : " + parameter);
>> >>                                }
>> >>
>> >>                                if(logger.isInfoEnabled()){
>> >>                                                logger.info<
>> http://logger.
>> >> info>("This is
>> >> info
>> >> : " + parameter);
>> >>                                }
>> >>
>> >>                                logger.warn("This is warn : " +
>> >> parameter);
>> >>                                logger.error("This is error : " +
>> >> parameter);
>> >>                                logger.fatal("This is fatal : " +
>> >> parameter);
>> >>
>> >>                }
>> >>
>> >>                public Broker installPlugin(Broker broker) throws
>> >> Exception {
>> >>                                Sample sample = new Sample();
>> >>                                sample.runMe("ActiveMQ Hello");
>> >>
>> >>                                return new MyBroker(broker);
>> >>                }
>> >>
>> >>
>> >> }
>> >>
>> >> The above are two classes I have implemented for my custom plugin.
>> >>
>> >> Regards,
>> >> Bharat Gupta
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >> Mobile: +46700869007, +91-9718483802
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> >> tbain98@gmail.com] On Behalf Of Tim
>> >> Bain
>> >> Sent: Sunday, November 26, 2017 4:31 AM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >> hello Tim,
>> >>
>> >>
>> >>
>> >> My Custom Plugin is getting installed as I am using log4j to print
>> >> random
>> >> stuff and its getting printed in logs.
>> >> Can you please describe in more detail exactly what methods that
>> >> logging
>> >> is done in and how it proves that the plugin was actually installed? If
>> >> (for example) your logging is only in your constructor or your
>> >> initialization method, that just proves that Spring made your bean, not
>> >> that it was installed in the broker as a plugin.
>> >>
>> >> I am hereby attaching my codes that you can see.
>> >> Where? All I see is your activemq.xml snippet below, but no actual code
>> >> for your plugin.
>> >>
>> >> activemq.xml configurations:
>> >>
>> >> <plugins>
>> >>
>> >>                               <bean id="sample"
>> >>
>> >>                                class="jwt.validation.Sample"
>> >>
>> >>                                xmlns="http://www.
>> >> springframework.org/schema/beans<http://springframework.org/
>> schema/beans
>> >> >"/>
>> >>
>> >>                               </plugins>
>> >>
>> >>
>> >>
>> >> Also I would like to explain you my exact requirement.
>> >>
>> >>
>> >>
>> >> The diagram below shows what I am trying to do it now.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> [cid:image001.png@01D3658E.4A6B3E20]
>> >> That sounds like it should be doable via an interceptor based on what I
>> >> know about them (i.e. the wiki, but no hands-on experience).
>> >>
>> >> QUESTIONS:
>> >>
>> >>
>> >>
>> >> 1.       how can we provide JWT to custom plugin from client?
>> >> If you have to use MQTT, you'll need to encode it directly into the
>> >> message body, because that's all MQTT supports. You could for example
>> >> make
>> >> a JSON payload with two fields: the JWT and the message body. Or you
>> >> could
>> >> switch to OpenWire and put the JWT into a custom header on the message
>> >> the
>> >> client is sending.
>> >>
>> >> 2.       do we need to store jwt in topic first and then consume it
>> >> from
>> >> topic to validate it? (not idle case)
>> >> You need to put the JWT into the message itself so that your plugin can
>> >> evaluate the token and then decide what to do with the message based on
>> >> that evaluation.
>> >>
>> >> 3.       can we call restful service from activeMQ broker that can
>> >> validate token and gives the result back to broker?
>> >> Yes, as far as I know, you'd be able to do that from within the broker.
>> >> (I've never done that, but I'm not aware of anything that would prevent
>> >> you
>> >> from doing it.)
>> >>
>> >> Tim please let me know if I am clear with my requirements. Else we can
>> >> talk more on call/phone.
>> >>
>> >>
>> >>
>> >> Thanks in advance
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>]
>> >> On Behalf Of Tim Bain
>> >> Sent: Friday, November 24, 2017 7:19 PM
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>
>> >>
>> >> Subject: RE: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> 1. Your send() method needs to call super.send() after doing your
>> >> custom
>> >>
>> >> work, otherwise the message will never be sent to the real Broker
>> >> object.
>> >>
>> >> Please review the wiki page I referred to earlier, which covers how to
>> >>
>> >> implement an interceptor.
>> >>
>> >>
>> >>
>> >> 2. To me it sounds like your plugin isn't getting installed. Do you
>> >> have
>> >>
>> >> any indication that it is, from logs or some other mechanism? And can
>> >> you
>> >>
>> >> please share the code of the class that implements BrokerPlugin, to
>> >> confirm
>> >>
>> >> that your installPlugin() method looks right, and the XML block where
>> >> you
>> >>
>> >> create the plugin bean?
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I tried implementing the method as below:
>> >>
>> >>
>> >>
>> >>        public void send(ProducerBrokerExchange producerExchange,
>> >>
>> >> ActiveMQMessage messageSend) throws JMSException
>> >>
>> >>         {
>> >>
>> >>                  byte[] messageBytes =
>> >> messageSend.getContent().data;
>> >>
>> >>                  String message = new String(messageBytes);
>> >>
>> >>                  logger.info<http://logger.info><http://logger.info
>> >("messageBody"
>> >> +
>> >> message);
>> >>
>> >>        }
>> >>
>> >>
>> >>
>> >> Also I am publishing a message on a topic even though this send()
>> >> method
>> >>
>> >> is not been called as logger.info<http://logger.info><
>> http://logger.info>
>> >> is not getting
>> >> printed in my Custom
>> >>
>> >> Plugin.
>> >>
>> >>
>> >>
>> >> Could you please help me on this?
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >>
>> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> >> mail.com> [mailto:
>> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>> >>
>> >> Sent: Friday, November 24, 2017 7:15 PM
>> >>
>> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> >> users@activemq.apache.org><mailto:
>> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> >>
>> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> >> apache.org><mailto:users-owner@
>> >> activemq.apache.org<http://activemq.apache.org>>
>> >>
>> >> Subject: Re: ActiveMQ custom plugin
>> >>
>> >>
>> >>
>> >> As I said in your other thread, you would do that by implementing
>> >> code
>> >> in
>> >>
>> >> the send() method of your subclass of BrokerFilter, which you would
>> >> create
>> >>
>> >> and return in your installPlugin() method.
>> >>
>> >>
>> >>
>> >> Tim
>> >>
>> >>
>> >>
>> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailt
>> o:
>> >> bharat.gupta@scania.com><
>> >> mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>> >>
>> >>
>> >>
>> >> Hello,
>> >>
>> >>
>> >>
>> >> I have a scenario as follows:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 1.       I have Custom Plugins that decrypts the data and validates
>> >> it.
>> >>
>> >>
>> >>
>> >> 2.       I am getting Encrypted data (token) from user that need to
>> >> be
>> >>
>> >> decrypted on custom plugin.
>> >>
>> >>
>> >>
>> >> 3.       Client is accessing the broker using mqtt protocol
>> >>
>> >>
>> >>
>> >> Need Solution for the following:
>> >>
>> >>
>> >>
>> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>> >>
>> >> validate the  data(token) in my custom plugin
>> >>
>> >>
>> >>
>> >> 2.       How to extract a data what customer is sending? So that I
>> >> can
>> >>
>> >> extract the data, decrypt the message and validate.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Implementation so far:
>> >>
>> >>
>> >>
>> >> 1.       Custom Plugin is ready and JAR has been added in
>> >> <ActiveMQ>/libs
>> >>
>> >>
>> >>
>> >> 2.       Added the plugin configuration in activemq.xml
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Could anyone help me with a solution for the same as it's critical
>> >> case.
>> >>
>> >>
>> >>
>> >> Thank you In Advance
>> >>
>> >>
>> >>
>> >> Regards,
>> >>
>> >> Bharat Gupta
>> >>
>> >> Development & Support | Platform Technician, IXCB | Scania IT
>> >>
>> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> >> <+91%2097184%2083802>
>> >> <tel:+91%2097184%2083802>
>> >>
>> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> >> bharat.gupta@scania.com<mailto:
>> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>

RE: ActiveMQ custom plugin

Posted by Tim Bain <tb...@alumni.duke.edu>.
Bharat,

Is this in 5.x, or did you switch to Artemis?

Your code is operating on a message, but what called your code? We'd need
some context on how you got that message to know what you should do with it
next.

Tim

On Feb 1, 2018 5:01 AM, "Gupta Bharat" <bh...@scania.com> wrote:

> Hello Tim,
>
> I am getting following message from client using MQTT
>
> {
>         "header": {
>                 "messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
>                 "jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.
> eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIs
> ImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIs
> IkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAt
> OTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNl
> IjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRB
> Y2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkx
> MDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwi
> aXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoi
> MmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjox
> NTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7Bx
> A6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_
> 0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_
> VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_
> xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_
> LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-
> TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd
> 73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vs
> rcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_
> Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpI
> vI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-
> tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
>                 "correlId": "",
>                 "initialMessageid": "fcbef565-18ea-429a-836f-
> 7e24d9b53743",
>                 "environment": "st5",
>                 "producerUTCTimestamp": 1515677099337,
>                 "contractId": "SCCO3822",
>                 "producerVer": "1.0",
>                 "messageType": "SendChatMessageInConversationMessage",
>                 "appId": "fma",
>                 "messageTypeVer": "1.0",
>                 "receivers": []
>         },
>         "body": {
>                 "conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
>                 "chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
>                 "content": "grte",
>                 "attachments": []
>         }
> }
>
> I am validating the message by validating the jwt token. I don’t want
> jwtToken field in message once I have validate it and used following to
> remove it:
>
> for (JsonNode jsonNode : jsonNodeRoot) {
>            if (jsonNode instanceof ObjectNode) {
>                ObjectNode o = (ObjectNode) jsonNode;
>                o.remove("jwtToken");
>
>            }
>        }
>
> But how to publish a message on topic once I have done the following
> checks on it? What method I can use here?
>
> Also I wish to add certain attributes in the message header and then
> publish on the topic how I can do that also?
>
> Thank You in Advance
>
> Regards,
> Bharat Gupta
>
>
> -----Original Message-----
> From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
> Sent: den 2 januari 2018 06:27
> To: ActiveMQ Users <us...@activemq.apache.org>
> Cc: users-owner@activemq.apache.org
> Subject: Re: ActiveMQ custom plugin
>
> I spent a little time this evening looking through the ActiveMQ 5.x code
> and didn't find an obvious way to hook into the MQTT-specific pieces, so
> switching to Artemis may be your best bet.
>
> Tim
>
> On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:
>
> > Bharat,
> >
> > I hadn't caught that this question was about making the connection rather
> > vs. the first question about sending messages across it; thanks for
> helping
> > me understand your question.
> >
> > As far as I know, the interception capabilities of 5.x apply only to the
> > core broker using the interface you used in the earlier messages in this
> > thread, but not to the code that translates non-OpenWire protocols such
> as
> > MQTT into OpenWire. I'll need to spend some time digging through the code
> > to make sure there isn't an MQTT plugin capability I don't know about,
> and
> > I probably won't get a chance to do that until the weekend. But unless I
> > find something unexpected when I do that digging, what you want may not
> be
> > possible with ActiveMQ 5.x. If as you say Artemis allows you to do
> > everything you're trying to do, then switching to it may be a good
> option.
> >
> > Tim
> >
> > On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com> wrote:
> >
> >> Yes the question I asked here is not answered earlier. In previous
> >> threads/mail focus was on when client was publishing a message on topic
> the
> >> activemq.send method was called to intercept the message before it
> actually
> >> published on topic.
> >>
> >> Here I am majorly focusing on intercepting mqtt connections, which means
> >> intercepting the client request to activemq and Call my plugin there. So
> >> which method of activemq can be used here?
> >>
> >> As I went thru many solutions over internet and see Artemis as an
> option.
> >>
> >> I hope I am able to put my point clear now. :) please let me know if
> more
> >> info is needed from my end.
> >>
> >>
> >>
> >> Sent from my iPhone
> >>
> >> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
> >> tbain@alumni.duke.edu>> wrote:
> >>
> >> Is there some aspect of your question that's not answered by the first
> >> 12(!) emails in the thread? I'm not clear why you're asking what appears
> >> to
> >> be the same question again. If there's some new aspect of the question
> or
> >> something that wasn't previously answered, please highlight what it is.
> >>
> >> And no, I don't believe that Artemis is required to do what you're
> trying
> >> to do. It might be equally possible to do in Artemis compared to doing
> in
> >> 5.x (I don't know Artemis well enough to comment on whether this can be
> >> done in Artemis), but you definitely don't "have to use Artemis here to
> >> achieve this."
> >>
> >> Tim
> >>
> >> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<
> mailto:
> >> bharat.gupta@scania.com>> wrote:
> >>
> >> hello again,
> >>
> >> I am asking my question here again if you can possibly help me with a
> >> method.
> >>
> >> 1. Need to intercept the Incoming connections from MQTT clients.
> >> User is connecting to activemq broker by hitting on url and sending a
> >> TOKEN [(hostname:port) + token]
> >>
> >> How can we intercept the connections and validate the token sent by mqtt
> >> client?
> >>
> >> I have my own custom plugin that will validate the token. Just Need to
> >> know method on which we can call that Plugin.
> >>
> >> Also do we have to use Artemis here to achieve this?
> >>
> >> Thanks In Advance
> >>
> >> Regards,
> >> Bharat Gupta
> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> Mobile: +46700869007, +91-9718483802
> >> bharat.gupta@scania.com<ma...@scania.com>
> >>
> >> -----Original Message-----
> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> tbain98@gmail.com] On Behalf Of Tim Bain
> >> Sent: Tuesday, December 5, 2017 7:29 PM
> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> users@activemq.apache.org>>
> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> apache.org>
> >> Subject: RE: ActiveMQ custom plugin
> >>
> >> I'd suggest that you store your cache of known credentials in your
> plugin.
> >> I'm not sure that you'd have access to the web session from a plugin,
> >> because that's MQTT-specific, so I think your best bet would be to store
> >> it
> >> in a Map (better: a Guava cache, so you get free age-off behavior)
> within
> >> your plugin.
> >>
> >> Tim
> >>
> >> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
> >> bharat.gupta@scania.com>> wrote:
> >>
> >> Hi Tim,
> >>
> >> I am having a scenario here. Using custom plugin I am validating my JWT
> >> tokens and fetching the claims from it.
> >>
> >> Claims:
> >>
> >> {
> >>  "unique_name": "gubhpi",
> >>  "sub": "gubhpi",
> >>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
> >>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
> >>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
> >>  "AdAccount": "bguvvw",
> >>  "FunctionalPermissions": "490879",
> >>  "UserPermissions": [
> >>    "2482503678 <(248)%20250-3678>",
> >>    "1006"
> >>  ],
> >>  "iss": "https://xyz/",
> >>  "aud": "58b99b37-db1c78d7fef5",
> >>  "exp": 1510240047,
> >>  "nbf": 1510236447
> >> }
> >>
> >> From this I need to fetch "AdAccount": "bguvvw", and store it
> >> somewhere(please suggest me-- context or session) and when next time
> user
> >> sends me message on activemq using mqtt or web socket I need to check
> the
> >> message header with the users stored in contextsession or from some
> >> object.
> >> If user is present then we validate else we don’t.
> >>
> >>
> >> Regards,
> >> Bharat Gupta
> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> Mobile: +46700869007, +91-9718483802
> >> bharat.gupta@scania.com<ma...@scania.com>
> >>
> >> -----Original Message-----
> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> tbain98@gmail.com] On Behalf Of Tim Bain
> >> Sent: den 29 november 2017 04:20
> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> users@activemq.apache.org>>
> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> apache.org>
> >> Subject: RE: ActiveMQ custom plugin
> >>
> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<
> mailto:
> >> bharat.gupta@scania.com>> wrote:
> >>
> >> Hello Tim,
> >>
> >> Thank you for your help. :)
> >>
> >> I have used below method to fetch that text from message when client
> >> publish on topic and it works.
> >>
> >> public void send(ProducerBrokerExchange producerExchange, Message
> >> messageSend) throws Exception {
> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
> >>
> >>
> >> ((ActiveMQTextMessage)messageSend).getText()
> >> It returns the text from web console only.
> >>
> >>
> >> Really appreciate your help here. :)
> >>
> >>
> >>
> >> Great, I'm glad I've been able to help.
> >>
> >> ------------------------------------------------------------
> >> ------------------------------------------------------------
> >> ------------------------------------------------------------
> >> -----------------------
> >>
> >> Apart from this I have a situation here that when I try to execute below
> >> code:
> >> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
> >> creating a queue
> >> 2. TextMessage claims = session.createTextMessage(payload); ---
> >> converting
> >> the string to message to send it on above made queue
> >> 3. producer.send(dest, claims); --- send the message on
> >> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
> >> JWT_PAYLOAD
> >> why?
> >>
> >>
> >> What makes you think that this message on an advisory topic was your
> >> message instead of a standard advisory message that's sent anytime a
> >> non-anonymous producer sends a message? What makes you think that thos
> >> message was sent instead of the message you sent to your queue, rather
> >> than
> >> sent *in addition to* the message on your queue? Can you share
> >> before-and-after screenshots of your queue's row on the Queues page of
> >> the
> >> web console? And were there any warnings or errors logged in the
> broker's
> >> logs when this happened?
> >>
> >> 4. Before executing producer.send(dest, claims); ----- it is going on
> >> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
> >> returning null as it is again checking for Content and data. So my ques
> >> is
> >> why it is going back again on first line? Why it is not simply putting
> >> the
> >> data on queue?
> >>
> >>
> >> I didn't understand what you meant by "it is going back again on first
> >> line." Are you saying that the broker is putting the original message
> >> onto
> >> your topic? If so, that's because by calling super.send(), you're
> >> allowing
> >> the publishing of the original message to the original topic to
> >> continue. I
> >> advised you to do that because I didn't realize that you wanted to
> >> transform the message and publish it to a different destination, but
> >> since
> >> it seems like you do, I think you don't want to call super.send() after
> >> all.
> >>
> >> If that's not what you meant, then please help me to better understand
> >> your
> >> question.
> >>
> >> @Override
> >>        public void send(ProducerBrokerExchange producerExchange, Message
> >> messageSend) throws Exception {
> >> if(messageSend != null)
> >> {
> >>        if(messageSend.getContent() != null)
> >> {
> >>        =               byte[] msg = ((ActiveMQMessage)
> >> messageSend).getContent().data;
> >>
> >>                String message = new String(msg);
> >>                logger.warn("messageBody::::::::::::::::              "
> >> +
> >> message);
> >>
> >>                DecodedJWT jwt = JWT.decode(message);
> >>                byte[] contentBytes = String.format("%s.%s",
> >> jwt.getHeader(), jwt.getPayload())
> >>                                .getBytes(StandardCharsets.UTF_8);
> >>                byte[] signatureBytes = Base64.decodeBase64(jwt.
> >> getSignature());
> >>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
> >>                                + "please enter your key"
> >>                                + "-----END PUBLIC KEY-----";
> >>
> >>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
> >>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
> >>
> >>                Security.addProvider(new BouncyCastleProvider());
> >>                Signature signatureInstance =
> >> Signature.getInstance("SHA256withRSA",
> >> "BC");
> >>                signatureInstance.initVerify(pk);
> >>                signatureInstance.update(contentBytes);
> >>                boolean result = signatureInstance.verify(
> >> signatureBytes);
> >>
> >>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
> >>
> >>                String payload = new String(pload);
> >>                logger.warn("messageBody::::::::::::::::              "
> >> +
> >> payload);
> >>                logger.warn("result::::::::::::::::              " +
> >> result);
> >>                if (result = true) {
> >>
> >>                        // Create a ConnectionFactory
> >>            ActiveMQConnectionFactory connectionFactory = new
> >> ActiveMQConnectionFactory("vm://localhost");
> >>
> >>            // Create a Connection
> >>            javax.jms.Connection jmsConnection = connectionFactory.
> >> createConnection();
> >>            jmsConnection.start();
> >>
> >>            // Create a Session
> >>            Session session = jmsConnection.createSession(false,
> >> Session.AUTO_ACKNOWLEDGE);
> >>
> >>                Destination dest = session.createQueue("JWT_PAYLOAD");
> >>                        MessageProducer producer =
> >> session.createProducer(dest);
> >>                        producer.setDeliveryMode(
> >> DeliveryMode.PERSISTENT);
> >>
> >>                        TextMessage claims = session.createTextMessage(
> >> payload);
> >>                        claims.setJMSType("TEXT");
> >>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
> >> claims);
> >>                        producer.send(dest, claims);
> >>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
> >> claims);
> >>
> >>
> >> //
> >>                        MessageConsumer consumer =
> >> session.createConsumer(dest);
> >>                        consumer.setMessageListener(this);
> >>
> >>                }
> >>
> >>                else {
> >>
> >>                        logger.warn("Else Authentication failed. Please
> >> send Valid Token");
> >>                }
> >>
> >>                super.send(producerExchange, messageSend);
> >>                // getNext().send(producerExchange, messageSend);
> >>
> >>        }
> >>
> >>        else
> >>        {
> >>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
> >>        }
> >>        }
> >> else
> >> {
> >>        logger.fatal("MESSAGE SEND IS NULL");
> >> }
> >>        }
> >>
> >>        @Override
> >>        public void onMessage(javax.jms.Message message) {
> >>                  String messageText = null;
> >>                try {
> >>                    if (message instanceof TextMessage) {
> >>                        TextMessage textMessage = (TextMessage) message;
> >>                        messageText = textMessage.getText();
> >>                        System.out.println("messageText = " +
> >> messageText);
> >>                    }
> >>                } catch (JMSException e) {
> >>                    //Handle the exception appropriately
> >>                }
> >>        }
> >>
> >> Regards,
> >> Bharat Gupta
> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> Mobile: +46700869007 <+46%2070%20086%2090%2007>, +91-9718483802
> >> <+91%2097184%2083802>
> >> bharat.gupta@scania.com<ma...@scania.com>
> >>
> >> -----Original Message-----
> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> tbain98@gmail.com] On Behalf Of Tim Bain
> >> Sent: den 27 november 2017 08:12
> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> users@activemq.apache.org>>
> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> apache.org>
> >> Subject: Re: ActiveMQ custom plugin
> >>
> >> Thank you for providing that code. I spent some time running your code,
> >> and
> >> found the following problems with it, which are causing this to not work
> >> as
> >> you intended:
> >>
> >>   1. The signature for the send() method is "public void
> >>   send(ProducerBrokerExchange producerExchange, Message messageSend)
> >> throws
> >>   Exception," not the signature you had defined. Because your signature
> >>   didn't match the method you were trying to override, you weren't
> >> actually
> >>   overriding a method that would be called when a message was sent, but
> >>   instead you were simply defining a public method that nothing ever
> >> called.
> >>   The compiler would have caught this for you if you'd annotated the
> >> method
> >>   as @Override; you should be using that annotation for all overriden
> >>   methods, for exactly this reason.
> >>   2. messageSend.getContent() returns null for the test message I sent
> >> via
> >>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
> >> returns
> >>   the body. I think this same code would work for an MQTT message, but
> >> since
> >>   I've never used MQTT you'll need to confirm that.
> >>   3. I mentioned this earlier, but your send() method needs to call
> >>   super.send() at the end, otherwise the broker's not going to process
> >> any
> >>   messages and you're going to be wondering why the broker "doesn't
> >> work."
> >>   This doesn't explain why you're not seeing your logging occur, but
> >> once
> >> we
> >>   get past that problem, this is the next issue you're going to hit.
> >>
> >> Tim
> >>
> >> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <bharat.gupta@scania.com
> >> <ma...@scania.com>>
> >> wrote:
> >>
> >> Hello,
> >>
> >> MyBroker.java
> >>
> >> package jwt.validation;
> >>
> >> import java.util.HashMap;
> >> import java.util.Map;
> >>
> >> import javax.jms.Destination;
> >> import javax.jms.ExceptionListener;
> >> import javax.jms.JMSException;
> >> import javax.jms.MessageConsumer;
> >> import javax.jms.Session;
> >> import javax.jms.TextMessage;
> >>
> >> import org.apache.activemq.ActiveMQConnection;
> >> import org.apache.activemq.ActiveMQConnectionFactory;
> >> import org.apache.activemq.ActiveMQMessageConsumer;
> >> import org.apache.activemq.broker.BrokerFilter;
> >> import org.apache.activemq.broker.Connection;
> >> import org.apache.activemq.broker.ConnectionContext;
> >> import org.apache.activemq.broker.ProducerBrokerExchange;
> >> import org.apache.activemq.broker.region.Subscription;
> >> import org.apache.activemq.command.ActiveMQDestination;
> >> import org.apache.activemq.command.ActiveMQMessage;
> >> import org.apache.activemq.command.ConnectionInfo;
> >> import org.apache.activemq.command.ConsumerInfo;
> >> import org.apache.activemq.command.Message;
> >> import org.apache.activemq.command.SessionInfo;
> >> import org.apache.log4j.Logger;
> >>
> >>
> >> public class MyBroker extends BrokerFilter {
> >>
> >>                final static Logger logger = Logger.getLogger(MyBroker.
> >> class);
> >>                private Map<String, String> userMap = new
> >> HashMap<String,
> >> String>();
> >>
> >>                public MyBroker(org.apache.activemq.broker.Broker
> >> next)
> >> {
> >>                                super(next);
> >>
> >>                }
> >>
> >>
> >>
> >>                public void send(ProducerBrokerExchange
> >> producerExchange,
> >> ActiveMQMessage messageSend) throws JMSException
> >>                {
> >>                                  byte[] messageBytes =
> >> messageSend.getContent().data;
> >>
> >>                                  Message data =
> >> messageSend.getMessage();
> >>                                  logger.warn("
> >> MESSAGEEEEEEEEEEEEEEEEEEEEE"
> >> + data);
> >>                                  String message = new
> >> String(messageBytes);
> >>                                  logger.warn("messageBody" + message);
> >>                                  logger.info<http://logger.info
> >("messageBody"
> >> +
> >> message);
> >>                                  logger.fatal("messageBody" +
> >> message);
> >>                                  logger.debug("messageBody" +
> >> message);
> >>
> >>
> >>                 }
> >>
> >>                public void addConnection(ConnectionContext context,
> >> ConnectionInfo info)
> >>            throws Exception {
> >>
> >>                                info.getUserName();
> >>                                info.toString();
> >>
> >>
> >>                                logger.warn("info1" +
> >> info.getUserName());
> >>                                logger.fatal("info2" +
> >> info.toString());
> >>
> >>       String token = context.getUserName();
> >>       logger.debug("token1" + token);
> >>       logger.warn("token2" + token);
> >>       logger.fatal("token3" + token);
> >>
> >>
> >>        // Then call your parent
> >>        super.addConnection(context, info);
> >>    }
> >>
> >>    public Subscription addConsumer(ConnectionContext context,
> >> ConsumerInfo info) throws Exception {
> >>
> >>
> >>
> >>        ActiveMQDestination dest = info.getDestination();
> >>        Connection conn = context.getConnection();
> >>        if (dest != null) {
> >>            String destName = info.getDestination().getPhysicalName();
> >>            String clientId = context.getClientId();
> >>            String allowedDest = userMap.get(clientId);
> >>
> >>            logger.info<http://logger.info>(">>> Got Consumer Add
> request
> >> { Destination:
> >> " +
> >> destName
> >>                    + ", Remote Address: " + conn.getRemoteAddress()
> >>                    + ", ClientID: " + clientId
> >>                    + " }");
> >>            if (allowedDest != null && (allowedDest.equals("*") ||
> >> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
> >>                logger.info<http://logger.info>(">>> Subscription
> >> allowed");
> >>            } else {
> >>                logger.error(">>> Destination not allowed. Subscription
> >> denied!");
> >>                throw new Exception(">>> Subscription denied!");
> >>            }
> >>        } else {
> >>            logger.error("<<< Got Consumer Add request from Remote
> >> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
> >>        }
> >>        return super.addConsumer(context, info);
> >>    }
> >> }
> >>
> >> Sample.java
> >>
> >> package jwt.validation;
> >>
> >> import org.apache.activemq.ActiveMQMessageProducer;
> >> import org.apache.activemq.broker.Broker;
> >> import org.apache.activemq.broker.BrokerPlugin;
> >> import org.apache.log4j.Logger;
> >>
> >> public class Sample  implements BrokerPlugin {
> >>
> >>                final static Logger logger =
> >> Logger.getLogger(Sample.class)
> >> ;
> >>
> >>                public static void main(String[] args) {
> >>
> >>
> >>                }
> >>
> >>                private void runMe(String parameter){
> >>
> >>                                if(logger.isDebugEnabled()){
> >>                                                logger.debug("This is
> >> debug : " + parameter);
> >>                                }
> >>
> >>                                if(logger.isInfoEnabled()){
> >>                                                logger.info<
> http://logger.
> >> info>("This is
> >> info
> >> : " + parameter);
> >>                                }
> >>
> >>                                logger.warn("This is warn : " +
> >> parameter);
> >>                                logger.error("This is error : " +
> >> parameter);
> >>                                logger.fatal("This is fatal : " +
> >> parameter);
> >>
> >>                }
> >>
> >>                public Broker installPlugin(Broker broker) throws
> >> Exception {
> >>                                Sample sample = new Sample();
> >>                                sample.runMe("ActiveMQ Hello");
> >>
> >>                                return new MyBroker(broker);
> >>                }
> >>
> >>
> >> }
> >>
> >> The above are two classes I have implemented for my custom plugin.
> >>
> >> Regards,
> >> Bharat Gupta
> >> Development & Support | Platform Technician, IXCB | Scania IT
> >> Mobile: +46700869007, +91-9718483802
> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> bharat.gupta@scania.com>
> >>
> >> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
> >> tbain98@gmail.com] On Behalf Of Tim
> >> Bain
> >> Sent: Sunday, November 26, 2017 4:31 AM
> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> users@activemq.apache.org>>
> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> apache.org>
> >> Subject: RE: ActiveMQ custom plugin
> >>
> >>
> >>
> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<
> mailto:
> >> bharat.gupta@scania.com><
> >> mailto:
> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
> >>
> >> hello Tim,
> >>
> >>
> >>
> >> My Custom Plugin is getting installed as I am using log4j to print
> >> random
> >> stuff and its getting printed in logs.
> >> Can you please describe in more detail exactly what methods that
> >> logging
> >> is done in and how it proves that the plugin was actually installed? If
> >> (for example) your logging is only in your constructor or your
> >> initialization method, that just proves that Spring made your bean, not
> >> that it was installed in the broker as a plugin.
> >>
> >> I am hereby attaching my codes that you can see.
> >> Where? All I see is your activemq.xml snippet below, but no actual code
> >> for your plugin.
> >>
> >> activemq.xml configurations:
> >>
> >> <plugins>
> >>
> >>                               <bean id="sample"
> >>
> >>                                class="jwt.validation.Sample"
> >>
> >>                                xmlns="http://www.
> >> springframework.org/schema/beans<http://springframework.
> org/schema/beans
> >> >"/>
> >>
> >>                               </plugins>
> >>
> >>
> >>
> >> Also I would like to explain you my exact requirement.
> >>
> >>
> >>
> >> The diagram below shows what I am trying to do it now.
> >>
> >>
> >>
> >>
> >>
> >> [cid:image001.png@01D3658E.4A6B3E20]
> >> That sounds like it should be doable via an interceptor based on what I
> >> know about them (i.e. the wiki, but no hands-on experience).
> >>
> >> QUESTIONS:
> >>
> >>
> >>
> >> 1.       how can we provide JWT to custom plugin from client?
> >> If you have to use MQTT, you'll need to encode it directly into the
> >> message body, because that's all MQTT supports. You could for example
> >> make
> >> a JSON payload with two fields: the JWT and the message body. Or you
> >> could
> >> switch to OpenWire and put the JWT into a custom header on the message
> >> the
> >> client is sending.
> >>
> >> 2.       do we need to store jwt in topic first and then consume it
> >> from
> >> topic to validate it? (not idle case)
> >> You need to put the JWT into the message itself so that your plugin can
> >> evaluate the token and then decide what to do with the message based on
> >> that evaluation.
> >>
> >> 3.       can we call restful service from activeMQ broker that can
> >> validate token and gives the result back to broker?
> >> Yes, as far as I know, you'd be able to do that from within the broker.
> >> (I've never done that, but I'm not aware of anything that would prevent
> >> you
> >> from doing it.)
> >>
> >> Tim please let me know if I am clear with my requirements. Else we can
> >> talk more on call/phone.
> >>
> >>
> >>
> >> Thanks in advance
> >>
> >>
> >>
> >>
> >>
> >> Regards,
> >>
> >> Bharat Gupta
> >>
> >> Development & Support | Platform Technician, IXCB | Scania IT
> >>
> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
> >> <tel:+91%2097184%2083802>
> >>
> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> bharat.gupta@scania.com>
> >>
> >>
> >>
> >>
> >> -----Original Message-----
> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
> >> mail.com> [mailto:
> >> tbain98@gmail.com<ma...@gmail.com>]
> >> On Behalf Of Tim Bain
> >> Sent: Friday, November 24, 2017 7:19 PM
> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> users@activemq.apache.org><mailto:
> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> apache.org><mailto:users-owner@
> >> activemq.apache.org<http://activemq.apache.org>
> >>
> >> Subject: RE: ActiveMQ custom plugin
> >>
> >>
> >>
> >> 1. Your send() method needs to call super.send() after doing your
> >> custom
> >>
> >> work, otherwise the message will never be sent to the real Broker
> >> object.
> >>
> >> Please review the wiki page I referred to earlier, which covers how to
> >>
> >> implement an interceptor.
> >>
> >>
> >>
> >> 2. To me it sounds like your plugin isn't getting installed. Do you
> >> have
> >>
> >> any indication that it is, from logs or some other mechanism? And can
> >> you
> >>
> >> please share the code of the class that implements BrokerPlugin, to
> >> confirm
> >>
> >> that your installPlugin() method looks right, and the XML block where
> >> you
> >>
> >> create the plugin bean?
> >>
> >>
> >>
> >> Tim
> >>
> >>
> >>
> >> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<
> mailto:
> >> bharat.gupta@scania.com><
> >> mailto:
> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
> >>
> >>
> >>
> >> Hello,
> >>
> >>
> >>
> >> I tried implementing the method as below:
> >>
> >>
> >>
> >>        public void send(ProducerBrokerExchange producerExchange,
> >>
> >> ActiveMQMessage messageSend) throws JMSException
> >>
> >>         {
> >>
> >>                  byte[] messageBytes =
> >> messageSend.getContent().data;
> >>
> >>                  String message = new String(messageBytes);
> >>
> >>                  logger.info<http://logger.info><http://logger.info>("
> messageBody"
> >> +
> >> message);
> >>
> >>        }
> >>
> >>
> >>
> >> Also I am publishing a message on a topic even though this send()
> >> method
> >>
> >> is not been called as logger.info<http://logger.info><
> http://logger.info>
> >> is not getting
> >> printed in my Custom
> >>
> >> Plugin.
> >>
> >>
> >>
> >> Could you please help me on this?
> >>
> >>
> >>
> >> Regards,
> >>
> >> Bharat Gupta
> >>
> >> Development & Support | Platform Technician, IXCB | Scania IT
> >>
> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
> >> <tel:+91%2097184%2083802>
> >>
> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> bharat.gupta@scania.com>
> >>
> >>
> >>
> >>
> >>
> >> -----Original Message-----
> >>
> >> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
> >> mail.com> [mailto:
> >> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
> >>
> >> Sent: Friday, November 24, 2017 7:15 PM
> >>
> >> To: ActiveMQ Users <users@activemq.apache.org<mailto:
> >> users@activemq.apache.org><mailto:
> >> users@activemq.apache.org<ma...@activemq.apache.org>>>
> >>
> >> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
> >> apache.org><mailto:users-owner@
> >> activemq.apache.org<http://activemq.apache.org>>
> >>
> >> Subject: Re: ActiveMQ custom plugin
> >>
> >>
> >>
> >> As I said in your other thread, you would do that by implementing
> >> code
> >> in
> >>
> >> the send() method of your subclass of BrokerFilter, which you would
> >> create
> >>
> >> and return in your installPlugin() method.
> >>
> >>
> >>
> >> Tim
> >>
> >>
> >>
> >> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<
> mailto:
> >> bharat.gupta@scania.com><
> >> mailto:
> >> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
> >>
> >>
> >>
> >> Hello,
> >>
> >>
> >>
> >> I have a scenario as follows:
> >>
> >>
> >>
> >>
> >>
> >> 1.       I have Custom Plugins that decrypts the data and validates
> >> it.
> >>
> >>
> >>
> >> 2.       I am getting Encrypted data (token) from user that need to
> >> be
> >>
> >> decrypted on custom plugin.
> >>
> >>
> >>
> >> 3.       Client is accessing the broker using mqtt protocol
> >>
> >>
> >>
> >> Need Solution for the following:
> >>
> >>
> >>
> >> 1.       Before getting data onto topic on ACtiveMQ broker I need to
> >>
> >> validate the  data(token) in my custom plugin
> >>
> >>
> >>
> >> 2.       How to extract a data what customer is sending? So that I
> >> can
> >>
> >> extract the data, decrypt the message and validate.
> >>
> >>
> >>
> >>
> >>
> >> Implementation so far:
> >>
> >>
> >>
> >> 1.       Custom Plugin is ready and JAR has been added in
> >> <ActiveMQ>/libs
> >>
> >>
> >>
> >> 2.       Added the plugin configuration in activemq.xml
> >>
> >>
> >>
> >>
> >>
> >> Could anyone help me with a solution for the same as it's critical
> >> case.
> >>
> >>
> >>
> >> Thank you In Advance
> >>
> >>
> >>
> >> Regards,
> >>
> >> Bharat Gupta
> >>
> >> Development & Support | Platform Technician, IXCB | Scania IT
> >>
> >> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
> >> <+91%2097184%2083802>
> >> <tel:+91%2097184%2083802>
> >>
> >> bharat.gupta@scania.com<ma...@scania.com><mailto:
> >> bharat.gupta@scania.com<mailto:
> >> bharat.gupta@scania.com<ma...@scania.com>%3cma
> >> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
>

RE: ActiveMQ custom plugin

Posted by Gupta Bharat <bh...@scania.com>.
Hello Tim,

I am getting following message from client using MQTT

{
	"header": {
		"messageId": "fcbef565-18ea-429a-836f-7e24d9b53743",
		"jwtToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6IndpaW5pa3B2dCIsInN1YiI6IndpaW5pa3B2dCIsImtpZCI6ImMxMzFhMWI0LWU0YWUtNGUwNC1hMGYwLWViNzViYThjYTFjMyIsIkV4dGVybmFsU3RhZmZSZWZlcmVuY2UiOiJmZWNiMDQ1Ny05MmNhLTRmMDAtOTIwNC1lZjAwNTYzZDgxZGIiLCJFeHRlcm5hbEN1c3RvbWVyUmVmZXJlbmNlIjoiYTkxZWYzMTYtNTJhMi00ZWE0LTk3ZDMtNDI5MDhhMGNjYjQ3IiwiQWRBY2NvdW50IjoibndpN2E0IiwiRnVuY3Rpb25hbFBlcm1pc3Npb25zIjoiNDkxMDA3IiwiVXNlclBlcm1pc3Npb25zIjpbIjI0NDUxMTQ3NTAiLCI5OTIiXSwiaXNzIjoiaHR0cHM6Ly9mbXNkZXZhdXRoLnNjYW5pYS5jb20vIiwiYXVkIjoiMmMxNzk2NzktN2VjMS00MGQxLTkxNjAtNjk3NjEyOTg0ZDg1IiwiZXhwIjoxNTE1Njc5Njk4LCJuYmYiOjE1MTU2NzYwOTh9.Olt1zXeDA1sndO1d4M1y07uSBzj7BxA6Plvmf8TCLfeQhh3-Fyx-wMIyHhXWSNFgI6tRDVL0heJftxATcGbe_0u1nVp0vwnrTO7PuGuKzEhWYXFlGs83IasN7hIidOp1qP9hXzi3i_VKVNa0wILUsuBMza7nkPd7xuTgCqacuFDpBZowyt-V1PUvqyj2Gd50ADh_ouuazO3akN_xHCFENJGDXLx91ABuJbGGiUsPI16uDcxAzDmfeKgnwbF5Zs8dw3TE_LiiBCcICMKx81rp6L_RTkPuoe5Umv-Y2ihfcnDt1trp36TvpUsSa-TqtcvZntwkDBcCNKhoyEB5FokMxatK5xgnpjqpj1kwZmHqfzfsJwFDBHY9Cd73UQpigmarLc7RgyWL3O_QZXxDeVP1vxO4V2NK1im3Jc0BjL4vsrcIqrWUn_v4pJCMQMFtSZ2hkg8Yw_VRnrvJToF4z9OJa_yDN__bIC5_Ezl4HvvJ6jTrkr1sqQTJKq4ipyx-4pG9Ns5KPZezjgEraBMENcAHzCcIpIvI53Bmu6aPneFgEjOAQaJ5Dgzu-Cr4fesjEgIyBVt2bHPGa-ztAA7pfop-3BXsVjwXPsbc_7-tQanCr_gANHtZXQYXvjxM14PFuZAjc-GERg9IkCokgRd3x8xYlNWhRtiCZ47kflNNwt1_QVo",
		"correlId": "",
		"initialMessageid": "fcbef565-18ea-429a-836f-7e24d9b53743",
		"environment": "st5",
		"producerUTCTimestamp": 1515677099337,
		"contractId": "SCCO3822",
		"producerVer": "1.0",
		"messageType": "SendChatMessageInConversationMessage",
		"appId": "fma",
		"messageTypeVer": "1.0",
		"receivers": []
	},
	"body": {
		"conversationId": "2b575462-97bd-4e9a-8ac4-6fec793c836a",
		"chatMessageId": "098ee4e7-8976-4c21-8f0a-521873fd6ac5",
		"content": "grte",
		"attachments": []
	}
}

I am validating the message by validating the jwt token. I don’t want jwtToken field in message once I have validate it and used following to remove it:

for (JsonNode jsonNode : jsonNodeRoot) {
           if (jsonNode instanceof ObjectNode) {
               ObjectNode o = (ObjectNode) jsonNode;
               o.remove("jwtToken");
              
           }
       }

But how to publish a message on topic once I have done the following checks on it? What method I can use here?

Also I wish to add certain attributes in the message header and then publish on the topic how I can do that also?

Thank You in Advance

Regards,
Bharat Gupta


-----Original Message-----
From: tbain98@gmail.com [mailto:tbain98@gmail.com] On Behalf Of Tim Bain
Sent: den 2 januari 2018 06:27
To: ActiveMQ Users <us...@activemq.apache.org>
Cc: users-owner@activemq.apache.org
Subject: Re: ActiveMQ custom plugin

I spent a little time this evening looking through the ActiveMQ 5.x code
and didn't find an obvious way to hook into the MQTT-specific pieces, so
switching to Artemis may be your best bet.

Tim

On Wed, Dec 13, 2017 at 7:02 AM, Tim Bain <tb...@alumni.duke.edu> wrote:

> Bharat,
>
> I hadn't caught that this question was about making the connection rather
> vs. the first question about sending messages across it; thanks for helping
> me understand your question.
>
> As far as I know, the interception capabilities of 5.x apply only to the
> core broker using the interface you used in the earlier messages in this
> thread, but not to the code that translates non-OpenWire protocols such as
> MQTT into OpenWire. I'll need to spend some time digging through the code
> to make sure there isn't an MQTT plugin capability I don't know about, and
> I probably won't get a chance to do that until the weekend. But unless I
> find something unexpected when I do that digging, what you want may not be
> possible with ActiveMQ 5.x. If as you say Artemis allows you to do
> everything you're trying to do, then switching to it may be a good option.
>
> Tim
>
> On Dec 12, 2017 8:07 AM, "Gupta Bharat" <bh...@scania.com> wrote:
>
>> Yes the question I asked here is not answered earlier. In previous
>> threads/mail focus was on when client was publishing a message on topic the
>> activemq.send method was called to intercept the message before it actually
>> published on topic.
>>
>> Here I am majorly focusing on intercepting mqtt connections, which means
>> intercepting the client request to activemq and Call my plugin there. So
>> which method of activemq can be used here?
>>
>> As I went thru many solutions over internet and see Artemis as an option.
>>
>> I hope I am able to put my point clear now. :) please let me know if more
>> info is needed from my end.
>>
>>
>>
>> Sent from my iPhone
>>
>> On 12 Dec 2017, at 15:00, Tim Bain <tbain@alumni.duke.edu<mailto:
>> tbain@alumni.duke.edu>> wrote:
>>
>> Is there some aspect of your question that's not answered by the first
>> 12(!) emails in the thread? I'm not clear why you're asking what appears
>> to
>> be the same question again. If there's some new aspect of the question or
>> something that wasn't previously answered, please highlight what it is.
>>
>> And no, I don't believe that Artemis is required to do what you're trying
>> to do. It might be equally possible to do in Artemis compared to doing in
>> 5.x (I don't know Artemis well enough to comment on whether this can be
>> done in Artemis), but you definitely don't "have to use Artemis here to
>> achieve this."
>>
>> Tim
>>
>> On Dec 12, 2017 1:31 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com>> wrote:
>>
>> hello again,
>>
>> I am asking my question here again if you can possibly help me with a
>> method.
>>
>> 1. Need to intercept the Incoming connections from MQTT clients.
>> User is connecting to activemq broker by hitting on url and sending a
>> TOKEN [(hostname:port) + token]
>>
>> How can we intercept the connections and validate the token sent by mqtt
>> client?
>>
>> I have my own custom plugin that will validate the token. Just Need to
>> know method on which we can call that Plugin.
>>
>> Also do we have to use Artemis here to achieve this?
>>
>> Thanks In Advance
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007, +91-9718483802
>> bharat.gupta@scania.com<ma...@scania.com>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: Tuesday, December 5, 2017 7:29 PM
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: RE: ActiveMQ custom plugin
>>
>> I'd suggest that you store your cache of known credentials in your plugin.
>> I'm not sure that you'd have access to the web session from a plugin,
>> because that's MQTT-specific, so I think your best bet would be to store
>> it
>> in a Map (better: a Guava cache, so you get free age-off behavior) within
>> your plugin.
>>
>> Tim
>>
>> On Dec 5, 2017 3:50 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com>> wrote:
>>
>> Hi Tim,
>>
>> I am having a scenario here. Using custom plugin I am validating my JWT
>> tokens and fetching the claims from it.
>>
>> Claims:
>>
>> {
>>  "unique_name": "gubhpi",
>>  "sub": "gubhpi",
>>  "kid": "1d884b7a-88ce-40e7-9bb8-f5e8f6b5837d",
>>  "ExternalStaffReference": "0a8395d7-50b5-4cd8-ac68-6213da955f1c",
>>  "ExternalCustomerReference": "acab53e8-a134-4bb8-a66d-3e80430ec4d1",
>>  "AdAccount": "bguvvw",
>>  "FunctionalPermissions": "490879",
>>  "UserPermissions": [
>>    "2482503678 <(248)%20250-3678>",
>>    "1006"
>>  ],
>>  "iss": "https://xyz/",
>>  "aud": "58b99b37-db1c78d7fef5",
>>  "exp": 1510240047,
>>  "nbf": 1510236447
>> }
>>
>> From this I need to fetch "AdAccount": "bguvvw", and store it
>> somewhere(please suggest me-- context or session) and when next time user
>> sends me message on activemq using mqtt or web socket I need to check the
>> message header with the users stored in contextsession or from some
>> object.
>> If user is present then we validate else we don’t.
>>
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007, +91-9718483802
>> bharat.gupta@scania.com<ma...@scania.com>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 29 november 2017 04:20
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: RE: ActiveMQ custom plugin
>>
>> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com>> wrote:
>>
>> Hello Tim,
>>
>> Thank you for your help. :)
>>
>> I have used below method to fetch that text from message when client
>> publish on topic and it works.
>>
>> public void send(ProducerBrokerExchange producerExchange, Message
>> messageSend) throws Exception {
>> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data;
>>
>>
>> ((ActiveMQTextMessage)messageSend).getText()
>> It returns the text from web console only.
>>
>>
>> Really appreciate your help here. :)
>>
>>
>>
>> Great, I'm glad I've been able to help.
>>
>> ------------------------------------------------------------
>> ------------------------------------------------------------
>> ------------------------------------------------------------
>> -----------------------
>>
>> Apart from this I have a situation here that when I try to execute below
>> code:
>> 1. Destination dest = session.createQueue("JWT_PAYLOAD"); ---- it is
>> creating a queue
>> 2. TextMessage claims = session.createTextMessage(payload); ---
>> converting
>> the string to message to send it on above made queue
>> 3. producer.send(dest, claims); --- send the message on
>> ActiveMQ.Advisory.Producer.Queue.JWT_PAYLOAD instead of queue
>> JWT_PAYLOAD
>> why?
>>
>>
>> What makes you think that this message on an advisory topic was your
>> message instead of a standard advisory message that's sent anytime a
>> non-anonymous producer sends a message? What makes you think that thos
>> message was sent instead of the message you sent to your queue, rather
>> than
>> sent *in addition to* the message on your queue? Can you share
>> before-and-after screenshots of your queue's row on the Queues page of
>> the
>> web console? And were there any warnings or errors logged in the broker's
>> logs when this happened?
>>
>> 4. Before executing producer.send(dest, claims); ----- it is going on
>> byte[] msg = ((ActiveMQMessage) messageSend).getContent().data and
>> returning null as it is again checking for Content and data. So my ques
>> is
>> why it is going back again on first line? Why it is not simply putting
>> the
>> data on queue?
>>
>>
>> I didn't understand what you meant by "it is going back again on first
>> line." Are you saying that the broker is putting the original message
>> onto
>> your topic? If so, that's because by calling super.send(), you're
>> allowing
>> the publishing of the original message to the original topic to
>> continue. I
>> advised you to do that because I didn't realize that you wanted to
>> transform the message and publish it to a different destination, but
>> since
>> it seems like you do, I think you don't want to call super.send() after
>> all.
>>
>> If that's not what you meant, then please help me to better understand
>> your
>> question.
>>
>> @Override
>>        public void send(ProducerBrokerExchange producerExchange, Message
>> messageSend) throws Exception {
>> if(messageSend != null)
>> {
>>        if(messageSend.getContent() != null)
>> {
>>        =               byte[] msg = ((ActiveMQMessage)
>> messageSend).getContent().data;
>>
>>                String message = new String(msg);
>>                logger.warn("messageBody::::::::::::::::              "
>> +
>> message);
>>
>>                DecodedJWT jwt = JWT.decode(message);
>>                byte[] contentBytes = String.format("%s.%s",
>> jwt.getHeader(), jwt.getPayload())
>>                                .getBytes(StandardCharsets.UTF_8);
>>                byte[] signatureBytes = Base64.decodeBase64(jwt.
>> getSignature());
>>                String publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n"
>>                                + "please enter your key"
>>                                + "-----END PUBLIC KEY-----";
>>
>>                RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
>>                PublicKey pk = rsaKeyUtil.fromPemEncoded(publicKeyPEM);
>>
>>                Security.addProvider(new BouncyCastleProvider());
>>                Signature signatureInstance =
>> Signature.getInstance("SHA256withRSA",
>> "BC");
>>                signatureInstance.initVerify(pk);
>>                signatureInstance.update(contentBytes);
>>                boolean result = signatureInstance.verify(
>> signatureBytes);
>>
>>                byte[] pload = Base64.decodeBase64(jwt.getPayload());
>>
>>                String payload = new String(pload);
>>                logger.warn("messageBody::::::::::::::::              "
>> +
>> payload);
>>                logger.warn("result::::::::::::::::              " +
>> result);
>>                if (result = true) {
>>
>>                        // Create a ConnectionFactory
>>            ActiveMQConnectionFactory connectionFactory = new
>> ActiveMQConnectionFactory("vm://localhost");
>>
>>            // Create a Connection
>>            javax.jms.Connection jmsConnection = connectionFactory.
>> createConnection();
>>            jmsConnection.start();
>>
>>            // Create a Session
>>            Session session = jmsConnection.createSession(false,
>> Session.AUTO_ACKNOWLEDGE);
>>
>>                Destination dest = session.createQueue("JWT_PAYLOAD");
>>                        MessageProducer producer =
>> session.createProducer(dest);
>>                        producer.setDeliveryMode(
>> DeliveryMode.PERSISTENT);
>>
>>                        TextMessage claims = session.createTextMessage(
>> payload);
>>                        claims.setJMSType("TEXT");
>>                        logger.warn("CLAIMS>>>>>>>>>>>>>>>>  " +
>> claims);
>>                        producer.send(dest, claims);
>>                        logger.fatal("CLAIMS>>>>>>>>>>>>>>>>  " +
>> claims);
>>
>>
>> //
>>                        MessageConsumer consumer =
>> session.createConsumer(dest);
>>                        consumer.setMessageListener(this);
>>
>>                }
>>
>>                else {
>>
>>                        logger.warn("Else Authentication failed. Please
>> send Valid Token");
>>                }
>>
>>                super.send(producerExchange, messageSend);
>>                // getNext().send(producerExchange, messageSend);
>>
>>        }
>>
>>        else
>>        {
>>                logger.fatal("MESSAGE SEND CONTENT IS NULL");
>>        }
>>        }
>> else
>> {
>>        logger.fatal("MESSAGE SEND IS NULL");
>> }
>>        }
>>
>>        @Override
>>        public void onMessage(javax.jms.Message message) {
>>                  String messageText = null;
>>                try {
>>                    if (message instanceof TextMessage) {
>>                        TextMessage textMessage = (TextMessage) message;
>>                        messageText = textMessage.getText();
>>                        System.out.println("messageText = " +
>> messageText);
>>                    }
>>                } catch (JMSException e) {
>>                    //Handle the exception appropriately
>>                }
>>        }
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007 <+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> bharat.gupta@scania.com<ma...@scania.com>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim Bain
>> Sent: den 27 november 2017 08:12
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: Re: ActiveMQ custom plugin
>>
>> Thank you for providing that code. I spent some time running your code,
>> and
>> found the following problems with it, which are causing this to not work
>> as
>> you intended:
>>
>>   1. The signature for the send() method is "public void
>>   send(ProducerBrokerExchange producerExchange, Message messageSend)
>> throws
>>   Exception," not the signature you had defined. Because your signature
>>   didn't match the method you were trying to override, you weren't
>> actually
>>   overriding a method that would be called when a message was sent, but
>>   instead you were simply defining a public method that nothing ever
>> called.
>>   The compiler would have caught this for you if you'd annotated the
>> method
>>   as @Override; you should be using that annotation for all overriden
>>   methods, for exactly this reason.
>>   2. messageSend.getContent() returns null for the test message I sent
>> via
>>   the web console, but ((ActiveMQTextMessage)messageSend).getText()
>> returns
>>   the body. I think this same code would work for an MQTT message, but
>> since
>>   I've never used MQTT you'll need to confirm that.
>>   3. I mentioned this earlier, but your send() method needs to call
>>   super.send() at the end, otherwise the broker's not going to process
>> any
>>   messages and you're going to be wondering why the broker "doesn't
>> work."
>>   This doesn't explain why you're not seeing your logging occur, but
>> once
>> we
>>   get past that problem, this is the next issue you're going to hit.
>>
>> Tim
>>
>> On Sun, Nov 26, 2017 at 12:41 PM, Gupta Bharat <bharat.gupta@scania.com
>> <ma...@scania.com>>
>> wrote:
>>
>> Hello,
>>
>> MyBroker.java
>>
>> package jwt.validation;
>>
>> import java.util.HashMap;
>> import java.util.Map;
>>
>> import javax.jms.Destination;
>> import javax.jms.ExceptionListener;
>> import javax.jms.JMSException;
>> import javax.jms.MessageConsumer;
>> import javax.jms.Session;
>> import javax.jms.TextMessage;
>>
>> import org.apache.activemq.ActiveMQConnection;
>> import org.apache.activemq.ActiveMQConnectionFactory;
>> import org.apache.activemq.ActiveMQMessageConsumer;
>> import org.apache.activemq.broker.BrokerFilter;
>> import org.apache.activemq.broker.Connection;
>> import org.apache.activemq.broker.ConnectionContext;
>> import org.apache.activemq.broker.ProducerBrokerExchange;
>> import org.apache.activemq.broker.region.Subscription;
>> import org.apache.activemq.command.ActiveMQDestination;
>> import org.apache.activemq.command.ActiveMQMessage;
>> import org.apache.activemq.command.ConnectionInfo;
>> import org.apache.activemq.command.ConsumerInfo;
>> import org.apache.activemq.command.Message;
>> import org.apache.activemq.command.SessionInfo;
>> import org.apache.log4j.Logger;
>>
>>
>> public class MyBroker extends BrokerFilter {
>>
>>                final static Logger logger = Logger.getLogger(MyBroker.
>> class);
>>                private Map<String, String> userMap = new
>> HashMap<String,
>> String>();
>>
>>                public MyBroker(org.apache.activemq.broker.Broker
>> next)
>> {
>>                                super(next);
>>
>>                }
>>
>>
>>
>>                public void send(ProducerBrokerExchange
>> producerExchange,
>> ActiveMQMessage messageSend) throws JMSException
>>                {
>>                                  byte[] messageBytes =
>> messageSend.getContent().data;
>>
>>                                  Message data =
>> messageSend.getMessage();
>>                                  logger.warn("
>> MESSAGEEEEEEEEEEEEEEEEEEEEE"
>> + data);
>>                                  String message = new
>> String(messageBytes);
>>                                  logger.warn("messageBody" + message);
>>                                  logger.info<http://logger.info>("messageBody"
>> +
>> message);
>>                                  logger.fatal("messageBody" +
>> message);
>>                                  logger.debug("messageBody" +
>> message);
>>
>>
>>                 }
>>
>>                public void addConnection(ConnectionContext context,
>> ConnectionInfo info)
>>            throws Exception {
>>
>>                                info.getUserName();
>>                                info.toString();
>>
>>
>>                                logger.warn("info1" +
>> info.getUserName());
>>                                logger.fatal("info2" +
>> info.toString());
>>
>>       String token = context.getUserName();
>>       logger.debug("token1" + token);
>>       logger.warn("token2" + token);
>>       logger.fatal("token3" + token);
>>
>>
>>        // Then call your parent
>>        super.addConnection(context, info);
>>    }
>>
>>    public Subscription addConsumer(ConnectionContext context,
>> ConsumerInfo info) throws Exception {
>>
>>
>>
>>        ActiveMQDestination dest = info.getDestination();
>>        Connection conn = context.getConnection();
>>        if (dest != null) {
>>            String destName = info.getDestination().getPhysicalName();
>>            String clientId = context.getClientId();
>>            String allowedDest = userMap.get(clientId);
>>
>>            logger.info<http://logger.info>(">>> Got Consumer Add request
>> { Destination:
>> " +
>> destName
>>                    + ", Remote Address: " + conn.getRemoteAddress()
>>                    + ", ClientID: " + clientId
>>                    + " }");
>>            if (allowedDest != null && (allowedDest.equals("*") ||
>> allowedDest.equals(destName) || destName.startsWith("ActiveMQ"))) {
>>                logger.info<http://logger.info>(">>> Subscription
>> allowed");
>>            } else {
>>                logger.error(">>> Destination not allowed. Subscription
>> denied!");
>>                throw new Exception(">>> Subscription denied!");
>>            }
>>        } else {
>>            logger.error("<<< Got Consumer Add request from Remote
>> Address:" + conn.getRemoteAddress() + ". But destination is NULL.");
>>        }
>>        return super.addConsumer(context, info);
>>    }
>> }
>>
>> Sample.java
>>
>> package jwt.validation;
>>
>> import org.apache.activemq.ActiveMQMessageProducer;
>> import org.apache.activemq.broker.Broker;
>> import org.apache.activemq.broker.BrokerPlugin;
>> import org.apache.log4j.Logger;
>>
>> public class Sample  implements BrokerPlugin {
>>
>>                final static Logger logger =
>> Logger.getLogger(Sample.class)
>> ;
>>
>>                public static void main(String[] args) {
>>
>>
>>                }
>>
>>                private void runMe(String parameter){
>>
>>                                if(logger.isDebugEnabled()){
>>                                                logger.debug("This is
>> debug : " + parameter);
>>                                }
>>
>>                                if(logger.isInfoEnabled()){
>>                                                logger.info<http://logger.
>> info>("This is
>> info
>> : " + parameter);
>>                                }
>>
>>                                logger.warn("This is warn : " +
>> parameter);
>>                                logger.error("This is error : " +
>> parameter);
>>                                logger.fatal("This is fatal : " +
>> parameter);
>>
>>                }
>>
>>                public Broker installPlugin(Broker broker) throws
>> Exception {
>>                                Sample sample = new Sample();
>>                                sample.runMe("ActiveMQ Hello");
>>
>>                                return new MyBroker(broker);
>>                }
>>
>>
>> }
>>
>> The above are two classes I have implemented for my custom plugin.
>>
>> Regards,
>> Bharat Gupta
>> Development & Support | Platform Technician, IXCB | Scania IT
>> Mobile: +46700869007, +91-9718483802
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com>
>>
>> From: tbain98@gmail.com<ma...@gmail.com> [mailto:
>> tbain98@gmail.com] On Behalf Of Tim
>> Bain
>> Sent: Sunday, November 26, 2017 4:31 AM
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org>
>> Subject: RE: ActiveMQ custom plugin
>>
>>
>>
>> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com><
>> mailto:
>> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>>
>> hello Tim,
>>
>>
>>
>> My Custom Plugin is getting installed as I am using log4j to print
>> random
>> stuff and its getting printed in logs.
>> Can you please describe in more detail exactly what methods that
>> logging
>> is done in and how it proves that the plugin was actually installed? If
>> (for example) your logging is only in your constructor or your
>> initialization method, that just proves that Spring made your bean, not
>> that it was installed in the broker as a plugin.
>>
>> I am hereby attaching my codes that you can see.
>> Where? All I see is your activemq.xml snippet below, but no actual code
>> for your plugin.
>>
>> activemq.xml configurations:
>>
>> <plugins>
>>
>>                               <bean id="sample"
>>
>>                                class="jwt.validation.Sample"
>>
>>                                xmlns="http://www.
>> springframework.org/schema/beans<http://springframework.org/schema/beans
>> >"/>
>>
>>                               </plugins>
>>
>>
>>
>> Also I would like to explain you my exact requirement.
>>
>>
>>
>> The diagram below shows what I am trying to do it now.
>>
>>
>>
>>
>>
>> [cid:image001.png@01D3658E.4A6B3E20]
>> That sounds like it should be doable via an interceptor based on what I
>> know about them (i.e. the wiki, but no hands-on experience).
>>
>> QUESTIONS:
>>
>>
>>
>> 1.       how can we provide JWT to custom plugin from client?
>> If you have to use MQTT, you'll need to encode it directly into the
>> message body, because that's all MQTT supports. You could for example
>> make
>> a JSON payload with two fields: the JWT and the message body. Or you
>> could
>> switch to OpenWire and put the JWT into a custom header on the message
>> the
>> client is sending.
>>
>> 2.       do we need to store jwt in topic first and then consume it
>> from
>> topic to validate it? (not idle case)
>> You need to put the JWT into the message itself so that your plugin can
>> evaluate the token and then decide what to do with the message based on
>> that evaluation.
>>
>> 3.       can we call restful service from activeMQ broker that can
>> validate token and gives the result back to broker?
>> Yes, as far as I know, you'd be able to do that from within the broker.
>> (I've never done that, but I'm not aware of anything that would prevent
>> you
>> from doing it.)
>>
>> Tim please let me know if I am clear with my requirements. Else we can
>> talk more on call/phone.
>>
>>
>>
>> Thanks in advance
>>
>>
>>
>>
>>
>> Regards,
>>
>> Bharat Gupta
>>
>> Development & Support | Platform Technician, IXCB | Scania IT
>>
>> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <tel:+91%2097184%2083802>
>>
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com>
>>
>>
>>
>>
>> -----Original Message-----
>> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> mail.com> [mailto:
>> tbain98@gmail.com<ma...@gmail.com>]
>> On Behalf Of Tim Bain
>> Sent: Friday, November 24, 2017 7:19 PM
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org><mailto:
>> users@activemq.apache.org<ma...@activemq.apache.org>>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org><mailto:users-owner@
>> activemq.apache.org<http://activemq.apache.org>
>>
>> Subject: RE: ActiveMQ custom plugin
>>
>>
>>
>> 1. Your send() method needs to call super.send() after doing your
>> custom
>>
>> work, otherwise the message will never be sent to the real Broker
>> object.
>>
>> Please review the wiki page I referred to earlier, which covers how to
>>
>> implement an interceptor.
>>
>>
>>
>> 2. To me it sounds like your plugin isn't getting installed. Do you
>> have
>>
>> any indication that it is, from logs or some other mechanism? And can
>> you
>>
>> please share the code of the class that implements BrokerPlugin, to
>> confirm
>>
>> that your installPlugin() method looks right, and the XML block where
>> you
>>
>> create the plugin bean?
>>
>>
>>
>> Tim
>>
>>
>>
>> On Nov 24, 2017 8:39 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com><
>> mailto:
>> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>>
>>
>>
>> Hello,
>>
>>
>>
>> I tried implementing the method as below:
>>
>>
>>
>>        public void send(ProducerBrokerExchange producerExchange,
>>
>> ActiveMQMessage messageSend) throws JMSException
>>
>>         {
>>
>>                  byte[] messageBytes =
>> messageSend.getContent().data;
>>
>>                  String message = new String(messageBytes);
>>
>>                  logger.info<http://logger.info><http://logger.info>("messageBody"
>> +
>> message);
>>
>>        }
>>
>>
>>
>> Also I am publishing a message on a topic even though this send()
>> method
>>
>> is not been called as logger.info<http://logger.info><http://logger.info>
>> is not getting
>> printed in my Custom
>>
>> Plugin.
>>
>>
>>
>> Could you please help me on this?
>>
>>
>>
>> Regards,
>>
>> Bharat Gupta
>>
>> Development & Support | Platform Technician, IXCB | Scania IT
>>
>> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <tel:+91%2097184%2083802>
>>
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com>
>>
>>
>>
>>
>>
>> -----Original Message-----
>>
>> From: tbain98@gmail.com<ma...@gmail.com><mailto:tbain98@g
>> mail.com> [mailto:
>> tbain98@gmail.com<ma...@gmail.com>] On Behalf Of Tim Bain
>>
>> Sent: Friday, November 24, 2017 7:15 PM
>>
>> To: ActiveMQ Users <users@activemq.apache.org<mailto:
>> users@activemq.apache.org><mailto:
>> users@activemq.apache.org<ma...@activemq.apache.org>>>
>>
>> Cc: users-owner@activemq.apache.org<mailto:users-owner@activemq.
>> apache.org><mailto:users-owner@
>> activemq.apache.org<http://activemq.apache.org>>
>>
>> Subject: Re: ActiveMQ custom plugin
>>
>>
>>
>> As I said in your other thread, you would do that by implementing
>> code
>> in
>>
>> the send() method of your subclass of BrokerFilter, which you would
>> create
>>
>> and return in your installPlugin() method.
>>
>>
>>
>> Tim
>>
>>
>>
>> On Nov 24, 2017 3:51 AM, "Gupta Bharat" <bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com><
>> mailto:
>> bharat.gupta@scania.com<ma...@scania.com>>> wrote:
>>
>>
>>
>> Hello,
>>
>>
>>
>> I have a scenario as follows:
>>
>>
>>
>>
>>
>> 1.       I have Custom Plugins that decrypts the data and validates
>> it.
>>
>>
>>
>> 2.       I am getting Encrypted data (token) from user that need to
>> be
>>
>> decrypted on custom plugin.
>>
>>
>>
>> 3.       Client is accessing the broker using mqtt protocol
>>
>>
>>
>> Need Solution for the following:
>>
>>
>>
>> 1.       Before getting data onto topic on ACtiveMQ broker I need to
>>
>> validate the  data(token) in my custom plugin
>>
>>
>>
>> 2.       How to extract a data what customer is sending? So that I
>> can
>>
>> extract the data, decrypt the message and validate.
>>
>>
>>
>>
>>
>> Implementation so far:
>>
>>
>>
>> 1.       Custom Plugin is ready and JAR has been added in
>> <ActiveMQ>/libs
>>
>>
>>
>> 2.       Added the plugin configuration in activemq.xml
>>
>>
>>
>>
>>
>> Could anyone help me with a solution for the same as it's critical
>> case.
>>
>>
>>
>> Thank you In Advance
>>
>>
>>
>> Regards,
>>
>> Bharat Gupta
>>
>> Development & Support | Platform Technician, IXCB | Scania IT
>>
>> Mobile: +46700869007<tel:+46%2070%20086%2090%2007>, +91-9718483802
>> <+91%2097184%2083802>
>> <tel:+91%2097184%2083802>
>>
>> bharat.gupta@scania.com<ma...@scania.com><mailto:
>> bharat.gupta@scania.com<mailto:
>> bharat.gupta@scania.com<ma...@scania.com>%3cma
>> ilto:bharat.gupta@scania.com<ma...@scania.com>>>
>>
>>
>>
>>
>>
>>
>>