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 <bharat.gu...@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: tbai...@gmail.com [mailto:tbai...@gmail.com] On Behalf Of Tim Bain > Sent: den 1 februari 2018 15:02 > To: ActiveMQ Users <users@activemq.apache.org> > Cc: users-ow...@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" <bharat.gu...@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: tbai...@gmail.com [mailto:tbai...@gmail.com] On Behalf Of Tim > Bain > >> Sent: den 2 januari 2018 06:27 > >> To: ActiveMQ Users <users@activemq.apache.org> > >> Cc: users-ow...@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" <bharat.gu...@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 <tb...@alumni.duke.edu<mailto: > >> >> tb...@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.gu...@scania.com > <mailt > >> o: > >> >> bharat.gu...@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.gu...@scania.com<mailto:bharat.gu...@scania.com> > >> >> > >> >> -----Original Message----- > >> >> From: tbai...@gmail.com<mailto:tbai...@gmail.com> [mailto: > >> >> tbai...@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-ow...@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.gu...@scania.com > <mailt > >> o: > >> >> bharat.gu...@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.gu...@scania.com<mailto:bharat.gu...@scania.com> > >> >> > >> >> -----Original Message----- > >> >> From: tbai...@gmail.com<mailto:tbai...@gmail.com> [mailto: > >> >> tbai...@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-ow...@activemq.apache.org<mailto:users-owner@activemq. > >> >> apache.org> > >> >> Subject: RE: ActiveMQ custom plugin > >> >> > >> >> On Nov 28, 2017 8:37 AM, "Gupta Bharat" <bharat.gu...@scania.com > <mailt > >> o: > >> >> bharat.gu...@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.gu...@scania.com<mailto:bharat.gu...@scania.com> > >> >> > >> >> -----Original Message----- > >> >> From: tbai...@gmail.com<mailto:tbai...@gmail.com> [mailto: > >> >> tbai...@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-ow...@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.gu...@scania.com > >> >> <mailto:bharat.gu...@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.gu...@scania.com<mailto:bharat.gu...@scania.com><mailto: > >> >> bharat.gu...@scania.com> > >> >> > >> >> From: tbai...@gmail.com<mailto:tbai...@gmail.com> [mailto: > >> >> tbai...@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-ow...@activemq.apache.org<mailto:users-owner@activemq. > >> >> apache.org> > >> >> Subject: RE: ActiveMQ custom plugin > >> >> > >> >> > >> >> > >> >> On Nov 24, 2017 5:44 PM, "Gupta Bharat" <bharat.gu...@scania.com > <mailt > >> o: > >> >> bharat.gu...@scania.com>< > >> >> mailto: > >> >> bharat.gu...@scania.com<mailto:bharat.gu...@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.gu...@scania.com<mailto:bharat.gu...@scania.com><mailto: > >> >> bharat.gu...@scania.com> > >> >> > >> >> > >> >> > >> >> > >> >> -----Original Message----- > >> >> From: tbai...@gmail.com<mailto:tbai...@gmail.com><mailto:tbain98@g > >> >> mail.com> [mailto: > >> >> tbai...@gmail.com<mailto:tbai...@gmail.com><mailto:tbai...@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<mailto:users@activemq.apache.org>>> > >> >> Cc: users-ow...@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.gu...@scania.com > <mailt > >> o: > >> >> bharat.gu...@scania.com>< > >> >> mailto: > >> >> bharat.gu...@scania.com<mailto:bharat.gu...@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.gu...@scania.com<mailto:bharat.gu...@scania.com><mailto: > >> >> bharat.gu...@scania.com> > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> -----Original Message----- > >> >> > >> >> From: tbai...@gmail.com<mailto:tbai...@gmail.com><mailto:tbain98@g > >> >> mail.com> [mailto: > >> >> tbai...@gmail.com<mailto:tbai...@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<mailto:users@activemq.apache.org>>> > >> >> > >> >> Cc: users-ow...@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.gu...@scania.com > <mailt > >> o: > >> >> bharat.gu...@scania.com>< > >> >> mailto: > >> >> bharat.gu...@scania.com<mailto:bharat.gu...@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.gu...@scania.com<mailto:bharat.gu...@scania.com><mailto: > >> >> bharat.gu...@scania.com<mailto: > >> >> bharat.gu...@scania.com<mailto:bharat.gu...@scania.com>%3cma > >> >> ilto:bharat.gu...@scania.com<mailto:bharat.gu...@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