diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index d29fa3bd..8665ea5d 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -109,6 +109,15 @@ message.global_mute_exception_types 401,402,403,404,405,407,408,410,411 ## 当为true时,不转发server api发送的消息;当为false时,转发server api发送的消息。 message.no_forward_admin_message false +## 消息转发功能开启时,转发信息是否带上用户clientId和平台类型。 +message.forward_with_client_info false + +## 机器人回调信息是否带上用户clientId和平台类型。 +robot.callback_with_client_info false + +## 频道回调信息是否带上用户clientId和平台类型。 +channel.callback_with_client_info false + ##禁止搜索用户 friend.disable_search false diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index 4f9bf6fa..ca0ba4fc 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -142,6 +142,10 @@ public final class BrokerConstants { public static final String MESSAGE_NO_Forward_Admin_Message = "message.no_forward_admin_message"; + public static final String MESSAGE_Forward_With_Client_Info = "message.forward_with_client_info"; + public static final String ROBOT_Callback_With_Client_Info = "robot.callback_with_client_info"; + public static final String CHANNEL_Callback_With_Client_Info = "channel.callback_with_client_info"; + public static final String FRIEND_Disable_Search = "friend.disable_search"; public static final String FRIEND_Disable_NickName_Search = "friend.disable_nick_name_search"; public static final String FRIEND_Disable_Friend_Request = "friend.disable_friend_request"; diff --git a/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java b/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java index 1f768bca..3f725c66 100644 --- a/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java @@ -9,11 +9,13 @@ package io.moquette.imhandler; import cn.wildfirechat.pojos.MessagePayload; +import cn.wildfirechat.pojos.OutputClient; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; import com.google.gson.Gson; import com.hazelcast.util.StringUtil; import io.moquette.BrokerConstants; +import io.moquette.persistence.MemorySessionStore; import io.moquette.spi.impl.Qos1PublishHandler; import io.netty.buffer.ByteBuf; import cn.wildfirechat.common.ErrorCode; @@ -171,12 +173,20 @@ public class SendMessageHandler extends IMHandler { } message = message.toBuilder().setFromUser(fromUser).setMessageId(messageId).setServerTimestamp(timestamp).build(); + OutputClient outputClient = null; + if(m_messagesStore.isForwardMessageWithClientInfo() && requestSourceType == ProtoConstants.RequestSourceType.Request_From_User && !StringUtil.isNullOrEmpty(clientID)) { + MemorySessionStore.Session session = m_sessionsStore.getSession(clientID); + if(session != null && session.getUsername().equals(fromUser)) { + outputClient = new OutputClient(session.getPlatform(), clientID); + } + } + if (!StringUtil.isNullOrEmpty(mForwardUrl) && (mForwardMessageTypes.isEmpty() || mForwardMessageTypes.contains(message.getContent().getType())) && !(isAdmin && mNoForwardAdminMessage)) { - publisher.forwardMessage(message, mForwardUrl); + publisher.forwardMessage(message, mForwardUrl, outputClient); } if(!StringUtil.isNullOrEmpty(mMentionForwardUrl) && message.hasContent() && message.getContent().getMentionedType() != 0 && !(isAdmin && mNoForwardAdminMessage)) { - publisher.forwardMessage(message, mMentionForwardUrl); + publisher.forwardMessage(message, mMentionForwardUrl, outputClient); } if (!isAdmin) { diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 04e9863e..378c0454 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -167,6 +167,10 @@ public class MemoryMessagesStore implements IMessagesStore { private int mSyncDataPartSize = 0; private boolean keepDisplayNameWhenDestroyUser = true; + private boolean mForwardMessageWithClientInfo = false; + private boolean mRobotCallbackWithClientInfo = false; + private boolean mChannelCallbackWithClientInfo = false; + private Set mUserHideProperties = new HashSet<>(); MemoryMessagesStore(Server server, DatabaseStore databaseStore) { @@ -446,6 +450,23 @@ public class MemoryMessagesStore implements IMessagesStore { } catch (NumberFormatException e) { e.printStackTrace(); } + + try { + mForwardMessageWithClientInfo = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.MESSAGE_Forward_With_Client_Info, "false")); + } catch (Exception e) { + + } + try { + mRobotCallbackWithClientInfo = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.ROBOT_Callback_With_Client_Info, "false")); + } catch (Exception e) { + + } + try { + mChannelCallbackWithClientInfo = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.CHANNEL_Callback_With_Client_Info, "false")); + } catch (Exception e) { + + } + } private void printMissConfigLog(String config, String defaultValue) { @@ -4066,6 +4087,20 @@ public class MemoryMessagesStore implements IMessagesStore { return mGroupVisibleQuitKickoffNotification; } + @Override + public boolean isForwardMessageWithClientInfo() { + return mForwardMessageWithClientInfo; + } + + @Override + public boolean isRobotCallbackWithClientInfo() { + return mRobotCallbackWithClientInfo; + } + + @Override + public boolean isChannelCallbackWithClientInfo() { + return mChannelCallbackWithClientInfo; + } @Override public List getClientForbiddenSendTypes() { diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index d0231dfc..51e68180 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -233,6 +233,10 @@ public interface IMessagesStore { boolean isAllowRobotCustomGroupNotification(); int getVisibleQuitKickoffNotification(); + boolean isForwardMessageWithClientInfo(); + boolean isRobotCallbackWithClientInfo(); + boolean isChannelCallbackWithClientInfo(); + List getClientForbiddenSendTypes(); List getBlackListExceptionTypes(); List getGroupMuteExceptionTypes(); diff --git a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java index ab2ae616..46607d83 100755 --- a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java +++ b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java @@ -16,6 +16,7 @@ package io.moquette.spi.impl; +import cn.wildfirechat.pojos.OutputClient; import cn.wildfirechat.pojos.OutputMessageData; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; @@ -175,10 +176,19 @@ public class MessagesPublisher { if (message == null) { message = m_messagesStore.getMessage(messageId); } + OutputClient outputClient = null; + if(m_messagesStore.isRobotCallbackWithClientInfo() && !StringUtil.isNullOrEmpty(exceptClientId)) { + Session session = m_sessionsStore.getSession(exceptClientId); + if(session != null && session.getUsername().equals(sender)) { + outputClient = new OutputClient(session.getPlatform(), exceptClientId); + } + } + final WFCMessage.Message finalMsg = message; + OutputClient finalOutputClient = outputClient; Server.getServer().getCallbackScheduler().execute(() -> { try { - HttpUtils.httpJsonPost(robot.getCallback(), new Gson().toJson(OutputMessageData.fromProtoMessage(finalMsg), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Robot_Message_Callback); + HttpUtils.httpJsonPost(robot.getCallback(), new Gson().toJson(OutputMessageData.fromProtoMessage(finalMsg, finalOutputClient), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Robot_Message_Callback); } catch (Exception e) { e.printStackTrace(); Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception); @@ -595,9 +605,18 @@ public class MessagesPublisher { if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) { WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(message.getConversation().getTarget()); if (channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback())) { + OutputClient outputClient = null; + if(m_messagesStore.isChannelCallbackWithClientInfo() && !StringUtil.isNullOrEmpty(exceptClientId)) { + Session session = m_sessionsStore.getSession(exceptClientId); + if(session != null && session.getUsername().equals(message.getFromUser())) { + outputClient = new OutputClient(session.getPlatform(), exceptClientId); + } + } + + OutputClient finalOutputClient = outputClient; Server.getServer().getCallbackScheduler().execute(() -> { try { - HttpUtils.httpJsonPost(channelInfo.getCallback() + "/message", new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Channel_Message_Callback); + HttpUtils.httpJsonPost(channelInfo.getCallback() + "/message", new Gson().toJson(OutputMessageData.fromProtoMessage(message, finalOutputClient), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Channel_Message_Callback); } catch (Exception e) { e.printStackTrace(); Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception); @@ -647,10 +666,10 @@ public class MessagesPublisher { } - public void forwardMessage(final WFCMessage.Message message, String forwardUrl) { + public void forwardMessage(final WFCMessage.Message message, String forwardUrl, OutputClient outputClient) { Server.getServer().getCallbackScheduler().execute(() -> { try { - HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Forward_Message_Callback); + HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message, outputClient), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Forward_Message_Callback); } catch (Exception e) { e.printStackTrace(); Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception); diff --git a/common/src/main/java/cn/wildfirechat/pojos/OutputClient.java b/common/src/main/java/cn/wildfirechat/pojos/OutputClient.java new file mode 100755 index 00000000..39b1cc6d --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/OutputClient.java @@ -0,0 +1,40 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package cn.wildfirechat.pojos; + +import java.util.List; + +public class OutputClient { + private int platform; + private String clientId; + + public OutputClient() { + } + + public OutputClient(int platform, String clientId) { + this.platform = platform; + this.clientId = clientId; + } + + public int getPlatform() { + return platform; + } + + public void setPlatform(int platform) { + this.platform = platform; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } +} diff --git a/common/src/main/java/cn/wildfirechat/pojos/OutputMessageData.java b/common/src/main/java/cn/wildfirechat/pojos/OutputMessageData.java index ce742800..7f9a81b1 100644 --- a/common/src/main/java/cn/wildfirechat/pojos/OutputMessageData.java +++ b/common/src/main/java/cn/wildfirechat/pojos/OutputMessageData.java @@ -20,6 +20,7 @@ public class OutputMessageData { private MessagePayload payload; private List toUsers; private long timestamp; + private OutputClient client; public String getSender() { return sender; @@ -69,7 +70,19 @@ public class OutputMessageData { this.timestamp = timestamp; } + public OutputClient getClient() { + return client; + } + + public void setClient(OutputClient client) { + this.client = client; + } + public static OutputMessageData fromProtoMessage(WFCMessage.Message protoMessage) { + return fromProtoMessage(protoMessage, null); + } + + public static OutputMessageData fromProtoMessage(WFCMessage.Message protoMessage, OutputClient fromClient) { OutputMessageData data = new OutputMessageData(); data.messageId = protoMessage.getMessageId(); data.sender = protoMessage.getFromUser(); @@ -80,6 +93,7 @@ public class OutputMessageData { data.payload = MessagePayload.fromProtoMessageContent(protoMessage.getContent()); data.timestamp = protoMessage.getServerTimestamp(); data.toUsers = protoMessage.getToList(); + data.client = fromClient; return data; } } diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index cf6d30f8..cb32ddb3 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -104,6 +104,15 @@ message.global_mute_exception_types 401,402,403,404,405,407,408,410,411 ## 当为true时,不转发server api发送的消息;当为false时,转发server api发送的消息。 message.no_forward_admin_message false +## 消息转发功能开启时,转发信息是否带上用户clientId和平台类型。 +message.forward_with_client_info false + +## 机器人回调信息是否带上用户clientId和平台类型。 +robot.callback_with_client_info false + +## 频道回调信息是否带上用户clientId和平台类型。 +channel.callback_with_client_info false + ##禁止搜索用户 friend.disable_search false