Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
RemoteEventPublisher.java
Go to the documentation of this file.
1/*
2 * Autopsy Forensic Browser
3 *
4 * Copyright 2011-2018 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package org.sleuthkit.autopsy.events;
20
21import java.net.URISyntaxException;
22import java.util.logging.Level;
23import javax.annotation.concurrent.GuardedBy;
24import javax.annotation.concurrent.ThreadSafe;
25import jakarta.jms.Connection;
26import jakarta.jms.DeliveryMode;
27import jakarta.jms.JMSException;
28import jakarta.jms.Message;
29import jakarta.jms.MessageConsumer;
30import jakarta.jms.MessageListener;
31import jakarta.jms.MessageProducer;
32import jakarta.jms.ObjectMessage;
33import jakarta.jms.Session;
34import jakarta.jms.Topic;
35import org.apache.activemq.ActiveMQConnectionFactory;
36import org.sleuthkit.autopsy.coreutils.Logger;
37
45@ThreadSafe
46final class RemoteEventPublisher {
47
48 private static final Logger logger = Logger.getLogger(RemoteEventPublisher.class.getName());
49 private static final String ALL_MESSAGE_SELECTOR = "All"; //NON-NLS
50 private final LocalEventPublisher localPublisher; // LocalEventPublisher is thread-safe
51 @GuardedBy("this")
52 private final Connection connection;
53 @GuardedBy("this")
54 private final Session session;
55 @GuardedBy("this")
56 private final MessageProducer producer;
57 @GuardedBy("this")
58 private final MessageConsumer consumer;
59
75 RemoteEventPublisher(String eventChannelName, LocalEventPublisher localPublisher, MessageServiceConnectionInfo info) throws URISyntaxException, JMSException {
76 try {
77 this.localPublisher = localPublisher;
78 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(info.getUserName(), info.getPassword(), info.getURI());
79 connectionFactory.setTrustAllPackages(true);
80 connection = connectionFactory.createConnection();
81 connection.start();
82 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
83 Topic topic = session.createTopic(eventChannelName);
84 producer = session.createProducer(topic);
85 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
86 consumer = session.createConsumer(topic, "events = '" + ALL_MESSAGE_SELECTOR + "'", true); //NON-NLS
87 MessageReceiver receiver = new MessageReceiver();
88 consumer.setMessageListener(receiver);
89 } catch (URISyntaxException | JMSException ex) {
90 logger.log(Level.SEVERE, "Failed to connect to event channel", ex); //NON-NLS
91 try {
92 stop();
93 } catch (JMSException ignored) {
98 }
99 throw ex;
100 }
101 }
102
109 synchronized void stop() throws JMSException {
110 if (null != producer) {
111 producer.close();
112 }
113 if (null != consumer) {
114 consumer.close();
115 }
116 if (null != session) {
117 session.close();
118 }
119 if (null != connection) {
120 connection.close();
121 }
122 }
123
129 synchronized void publish(AutopsyEvent event) throws JMSException {
130 ObjectMessage message = session.createObjectMessage();
131 message.setStringProperty("events", ALL_MESSAGE_SELECTOR); //NON-NLS
132 message.setObject(event);
133 producer.send(message);
134 }
135
140 private final class MessageReceiver implements MessageListener {
141
148 @Override
149 public void onMessage(Message message) {
150 try {
151 if (message instanceof ObjectMessage) {
152 ObjectMessage objectMessage = (ObjectMessage) message;
153 Object object = objectMessage.getObject();
154 if (object instanceof AutopsyEvent) {
155 AutopsyEvent event = (AutopsyEvent) object;
156 event.setSourceType(AutopsyEvent.SourceType.REMOTE);
157 localPublisher.publish(event);
158 }
159 }
160 } catch (JMSException ex) {
161 logger.log(Level.SEVERE, "Error receiving message", ex); //NON-NLS
162 } catch (Throwable ex) {
163 // Exception firewall.
164 logger.log(Level.SEVERE, "Unexpected error receiving message", ex); //NON-NLS
165 }
166 }
167 }
168}

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.