Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f4c2b0cea | ||
|
|
932ee9235f | ||
|
|
1e5ac9b787 | ||
|
|
ad5d4991c8 | ||
|
|
a2ee6c87eb | ||
|
|
30e01a7040 | ||
|
|
082f42af77 | ||
|
|
2bec610552 | ||
|
|
f3a2603309 | ||
|
|
7d10251bd9 | ||
|
|
5c7b320b04 |
@@ -357,10 +357,12 @@ push.ios.server.address http://localhost:8085/ios/push
|
||||
#*********************************************************************
|
||||
# Sensitive configuration
|
||||
#*********************************************************************
|
||||
## 内置文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
|
||||
## 内置文本敏感词过滤处理方法,当命中敏感词后,消息会被记录到t_sensitive_messages表中,然后根据type类型做不同的处理,处理方式如下:
|
||||
## 0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***然后正常发送;3 正常发送。
|
||||
## 如果开启 message.sensitive.forward.url 配置,命中敏感词的消息还会被回调到这个地址
|
||||
sensitive.filter.type 0
|
||||
|
||||
## 如果内置敏感词库无法满足您的需求,可以自己开发部署敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址
|
||||
## 如果内置敏感词库无法满足您的需求,可以开发部署独立敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址,内置的敏感词审核和敏感词转发功能就不再起作用了。
|
||||
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
|
||||
## 独立审核服务地址,IM服务会post SendMessageData。如果需要修改消息内容,返回 MessagePayload。请参考应用服务中 "/message/censor" Mapping.
|
||||
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<relativePath>../</relativePath>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.1.6</version>
|
||||
<version>1.1.8</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>moquette-broker</artifactId>
|
||||
|
||||
@@ -12,9 +12,11 @@ package cn.wildfirechat.push;
|
||||
public class PushMessage {
|
||||
public String sender;
|
||||
public String senderName;
|
||||
public String senderPortrait;
|
||||
public int convType;
|
||||
public String target;
|
||||
public String targetName;
|
||||
public String targetPortrait;
|
||||
public String userId;
|
||||
public int line;
|
||||
public int cntType;
|
||||
@@ -34,12 +36,14 @@ public class PushMessage {
|
||||
public String language;
|
||||
public long messageId;
|
||||
|
||||
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
|
||||
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
|
||||
this.sender = sender;
|
||||
this.convType = conversationType;
|
||||
this.target = target;
|
||||
this.senderName = senderName;
|
||||
this.senderPortrait = senderPortrait;
|
||||
this.targetName = targetName;
|
||||
this.targetPortrait = targetPortrait;
|
||||
this.line = line;
|
||||
this.cntType = messageContentType;
|
||||
this.serverTime = serverTime;
|
||||
|
||||
@@ -25,6 +25,9 @@ import io.netty.util.internal.StringUtil;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
|
||||
@Route(APIPath.Msg_Recall)
|
||||
@HttpMethod("POST")
|
||||
public class RecallMessageAction extends AdminAction {
|
||||
@@ -42,10 +45,9 @@ public class RecallMessageAction extends AdminAction {
|
||||
|
||||
WFCMessage.INT64Buf idBuf = WFCMessage.INT64Buf.newBuilder().setId(recallMessageData.getMessageUid()).build();
|
||||
sendApiMessage(response, recallMessageData.getOperator(), IMTopic.RecallMessageTopic, idBuf.toByteArray(), result -> {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
return new Result(errorCode);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(result[0]);
|
||||
byte[] data = Arrays.copyOfRange(result,1, result.length);
|
||||
return new Result(errorCode, new String(data, StandardCharsets.UTF_8));
|
||||
});
|
||||
return false;
|
||||
} else {
|
||||
|
||||
@@ -23,7 +23,7 @@ public class RecallMessageHandler extends IMHandler<WFCMessage.INT64Buf> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.INT64Buf int64Buf, Qos1PublishHandler.IMCallback callback) {
|
||||
boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin;
|
||||
ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin);
|
||||
ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin, ackPayload);
|
||||
|
||||
if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
return errorCode;
|
||||
|
||||
@@ -163,11 +163,8 @@ public class DatabaseStore {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<WFCMessage.User> searchUserByNameMobile(String keyword, int searchType, int page) {
|
||||
List<WFCMessage.User> searchUserByNameMobile(String keyword, int searchType) {
|
||||
ArrayList<WFCMessage.User> out = new ArrayList<>();
|
||||
if(page > 0) {
|
||||
return out;
|
||||
}
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet rs = null;
|
||||
@@ -315,7 +312,8 @@ public class DatabaseStore {
|
||||
|
||||
return out;
|
||||
}
|
||||
List<WFCMessage.User> searchUserByDisplayName(String keyword, int page) {
|
||||
|
||||
List<WFCMessage.User> searchUserByDisplayName(String keyword, int page, List<WFCMessage.User> nameOrIdMatched) {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet rs = null;
|
||||
@@ -326,14 +324,36 @@ public class DatabaseStore {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "select u._uid, u._name, u._display_name, u._portrait, u._mobile, u._gender, u._email, u._address, u._company, u._social, u._extra, u._dt, u._type " +
|
||||
" from t_user u left join (select _uid, _value from t_user_setting where _scope = 27) s on u._uid = s._uid " +
|
||||
" where u._display_name like ? and u._type <> 2 and u._deleted = 0 and (s._value is null or (s._value <> 1 and s._value <> 3 and s._value <> 5 and s._value <> 7)) limit 20";
|
||||
" where u._display_name like ? and u._type <> 2 and u._deleted = 0 ";
|
||||
if(nameOrIdMatched.size() == 1) {
|
||||
sql += " and u._uid <> ? and u._name <> ?";
|
||||
} else if(nameOrIdMatched.size() == 2) {
|
||||
sql += " and u._uid <> ? and u._uid <>? and u._name <> ? and u._name <>? ";
|
||||
}
|
||||
sql += " and (s._value is null or (s._value <> 1 and s._value <> 3 and s._value <> 5 and s._value <> 7)) limit ";
|
||||
|
||||
if(page == 0) {
|
||||
sql += (20 - nameOrIdMatched.size());
|
||||
} else {
|
||||
sql += 20;
|
||||
}
|
||||
|
||||
if (page > 0) {
|
||||
sql += " offset " + page * 20;
|
||||
sql += " offset " + (page * 20 - nameOrIdMatched.size());
|
||||
}
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
statement.setString(1, "%" + keyword + "%");
|
||||
if(nameOrIdMatched.size() == 1) {
|
||||
statement.setString(2, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||
statement.setString(3, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||
} else if(nameOrIdMatched.size() == 2) {
|
||||
statement.setString(2, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||
statement.setString(3, nameOrIdMatched.toArray(new WFCMessage.User[0])[1].getUid());
|
||||
statement.setString(4, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||
statement.setString(5, nameOrIdMatched.toArray(new WFCMessage.User[0])[1].getUid());
|
||||
}
|
||||
|
||||
rs = statement.executeQuery();
|
||||
while (rs.next()) {
|
||||
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
|
||||
@@ -403,9 +423,15 @@ public class DatabaseStore {
|
||||
}
|
||||
|
||||
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
|
||||
List<WFCMessage.User> out = searchUserByNameMobile(keyword, searchType, page);
|
||||
List<WFCMessage.User> nameOrIdMatched = searchUserByNameMobile(keyword, searchType);
|
||||
List<WFCMessage.User> out = new ArrayList<>();
|
||||
if(page == 0) {
|
||||
out.addAll(nameOrIdMatched);
|
||||
}
|
||||
|
||||
if(searchType == SearchUserType_General) {
|
||||
List<WFCMessage.User> general = searchUserByDisplayName(keyword, page);
|
||||
List<WFCMessage.User> general = searchUserByDisplayName(keyword, page, nameOrIdMatched);
|
||||
general.removeAll(nameOrIdMatched);
|
||||
out.addAll(general);
|
||||
}
|
||||
return out;
|
||||
|
||||
@@ -35,6 +35,7 @@ import io.moquette.spi.IMessagesStore;
|
||||
import io.moquette.spi.impl.security.AES;
|
||||
import io.moquette.spi.security.Tokenor;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.handler.codec.mqtt.MqttVersion;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.json.simple.JSONObject;
|
||||
@@ -44,6 +45,7 @@ import win.liyufan.im.*;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -810,7 +812,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
if (bundle.getMessage().getContent().getExpireDuration() > 0) {
|
||||
if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()*1000) {
|
||||
if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()* 1000L) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -2072,6 +2074,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
if(userList.contains(groupInfo.getOwner())) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
long updateDt = System.currentTimeMillis();
|
||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
|
||||
@@ -2177,7 +2183,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin) {
|
||||
public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
|
||||
|
||||
@@ -2272,7 +2278,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
json.put("c", message.getContent().getContent());
|
||||
json.put("e", message.getContent().getExtra());
|
||||
if (message.getContent().getData() != null && message.getContent().getData().size() > 0) {
|
||||
json.put("b", Base64.getEncoder().encode(message.getContent().getData().toByteArray()));
|
||||
json.put("b", Base64.getEncoder().encodeToString(message.getContent().getData().toByteArray()));
|
||||
}
|
||||
if (message.getContent().getMediaType() > 0) {
|
||||
json.put("mt", message.getContent().getMediaType());
|
||||
@@ -2303,6 +2309,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
databaseStore.deleteMessage(messageUid);
|
||||
|
||||
mIMap.put(messageUid, messageBundle, 7, TimeUnit.DAYS);
|
||||
ackPayload.writeBytes(recalledContent.getBytes(StandardCharsets.UTF_8));
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
} else {
|
||||
return ErrorCode.ERROR_CODE_NOT_EXIST;
|
||||
@@ -3096,14 +3103,18 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
}
|
||||
|
||||
boolean alreadyExist = false;
|
||||
if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted && !isAdmin) {
|
||||
alreadyExist = true;
|
||||
if (mFriendRequestDuration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration) {
|
||||
if (existRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Rejected
|
||||
&& System.currentTimeMillis() - existRequest.getUpdateDt() < mFriendRejectDuration) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_BLOCKED;
|
||||
}
|
||||
} else {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST;
|
||||
if(System.currentTimeMillis() - existRequest.getUpdateDt() > 5 * 60 * 1000) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3125,7 +3136,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
.setExtra(request.getExtra())
|
||||
.setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Sent)
|
||||
.setToReadStatus(false)
|
||||
.setUpdateDt(System.currentTimeMillis())
|
||||
.setUpdateDt(alreadyExist ? existRequest.getUpdateDt() : System.currentTimeMillis())
|
||||
.build();
|
||||
|
||||
databaseStore.persistOrUpdateFriendRequest(newRequest);
|
||||
|
||||
@@ -128,7 +128,7 @@ public interface IMessagesStore {
|
||||
ErrorCode canSendMessageInGroup(String member, String groupId);
|
||||
Set<String> getGroupManagers(String groupId, boolean includeOwner);
|
||||
|
||||
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin);
|
||||
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload);
|
||||
ErrorCode recallCastMessage(long messageUid, String operatorId);
|
||||
|
||||
void clearUserMessages(String userId);
|
||||
|
||||
@@ -35,14 +35,11 @@ import io.moquette.spi.ISessionsStore;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.mqtt.*;
|
||||
import win.liyufan.im.GsonUtil;
|
||||
import win.liyufan.im.HttpUtils;
|
||||
import win.liyufan.im.IMTopic;
|
||||
import win.liyufan.im.*;
|
||||
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
@@ -168,6 +165,9 @@ public class MessagesPublisher {
|
||||
}
|
||||
|
||||
WFCMessage.Message message = null;
|
||||
String senderName = null;
|
||||
String senderPortrait = null;
|
||||
boolean sendNameLoaded = false;
|
||||
for (String user : receivers) {
|
||||
if (!user.equals(sender)) {
|
||||
WFCMessage.User userInfo = m_messagesStore.getUserInfo(user);
|
||||
@@ -207,10 +207,10 @@ public class MessagesPublisher {
|
||||
}
|
||||
|
||||
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
||||
String senderName = null;
|
||||
String targetName = null;
|
||||
boolean nameLoaded = false;
|
||||
|
||||
String targetName = null;
|
||||
String targetPortrait = null;
|
||||
boolean targetNameLoaded = false;
|
||||
|
||||
Collection<String> targetClients = null;
|
||||
if (pullType == ProtoConstants.PullType.Pull_ChatRoom) {
|
||||
@@ -386,10 +386,22 @@ public class MessagesPublisher {
|
||||
|
||||
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
|
||||
|
||||
if(!nameLoaded) {
|
||||
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null);
|
||||
targetName = getTargetName(target, conversationType);
|
||||
nameLoaded = true;
|
||||
if(!sendNameLoaded) {
|
||||
List<String> list = new ArrayList<>();
|
||||
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null, list);
|
||||
if(!list.isEmpty()) {
|
||||
senderPortrait = list.get(0);
|
||||
}
|
||||
sendNameLoaded = true;
|
||||
}
|
||||
|
||||
if(!targetNameLoaded) {
|
||||
List<String> list = new ArrayList<>();
|
||||
targetName = getTargetName(target, conversationType, user, list);
|
||||
if(!list.isEmpty()) {
|
||||
targetPortrait = list.get(0);
|
||||
}
|
||||
targetNameLoaded = true;
|
||||
}
|
||||
|
||||
String name = senderName;
|
||||
@@ -399,7 +411,7 @@ public class MessagesPublisher {
|
||||
name = fd.getAlias();
|
||||
}
|
||||
}
|
||||
this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, messageContentType, serverTime, name, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
||||
this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, messageContentType, serverTime, name, senderPortrait, targetName, targetPortrait, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -461,10 +473,13 @@ public class MessagesPublisher {
|
||||
}
|
||||
}
|
||||
|
||||
String getUserDisplayName(String userId, String groupId) {
|
||||
String getUserDisplayName(String userId, String groupId, List<String> portraitList) {
|
||||
WFCMessage.User user = m_messagesStore.getUserInfo(userId);
|
||||
String userName = null;
|
||||
if(user != null) {
|
||||
if(portraitList != null && !StringUtil.isNullOrEmpty(user.getPortrait())) {
|
||||
portraitList.add(user.getPortrait());
|
||||
}
|
||||
userName = user.getDisplayName();
|
||||
}
|
||||
if (!StringUtil.isNullOrEmpty(groupId)) {
|
||||
@@ -476,17 +491,28 @@ public class MessagesPublisher {
|
||||
return userName;
|
||||
}
|
||||
|
||||
String getTargetName(String targetId, int cnvType) {
|
||||
String getTargetName(String targetId, int cnvType, String fromUser, List<String> portraitList) {
|
||||
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||
return getUserDisplayName(targetId, null);
|
||||
return getUserDisplayName(targetId, null, portraitList);
|
||||
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
|
||||
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
|
||||
if(group != null) {
|
||||
if(!StringUtil.isNullOrEmpty(group.getPortrait())) {
|
||||
portraitList.add(group.getPortrait());
|
||||
}
|
||||
|
||||
WFCMessage.UserSettingEntry entry = m_messagesStore.getUserSetting(fromUser, UserSettingScope.kUserSettingGroupRemark, targetId);
|
||||
if(entry != null && !StringUtil.isNullOrEmpty(entry.getValue())) {
|
||||
return entry.getValue();
|
||||
}
|
||||
return group.getName();
|
||||
}
|
||||
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId);
|
||||
if (channelInfo != null) {
|
||||
if(!StringUtil.isNullOrEmpty(channelInfo.getPortrait())) {
|
||||
portraitList.add(channelInfo.getPortrait());
|
||||
}
|
||||
return channelInfo.getName();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,9 +37,9 @@ class PersistentQueueMessageSender {
|
||||
this.connectionDescriptorStore = connectionDescriptorStore;
|
||||
}
|
||||
|
||||
void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
||||
void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
||||
LOG.info("Send push to {}, message from {}", deviceId, sender);
|
||||
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language);
|
||||
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, senderPortrait, targetName, targetPortrait, unReceivedMsg, mentionType, isHiddenDetail, language);
|
||||
pushMessage.pushContent = pushContent;
|
||||
pushMessage.pushData = pushData;
|
||||
pushMessage.messageId = messageId;
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.1.6</version>
|
||||
<version>1.1.8</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -156,6 +156,8 @@ public class ProtoConstants {
|
||||
int Modify_Group_History_Message = 7;
|
||||
//仅专业版的server api支持
|
||||
int Modify_Group_Max_Member_Count = 8;
|
||||
//仅专业版的server api支持
|
||||
int Modify_Group_Super_Group = 9;
|
||||
}
|
||||
|
||||
//ModifyGroupInfoRequest -> type
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<!--<relativePath>../pom.xml</relativePath>-->
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.1.6</version>
|
||||
<version>1.1.8</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>distribution</artifactId>
|
||||
|
||||
@@ -365,10 +365,12 @@ push.ios.server.address http://localhost:8085/ios/push
|
||||
#*********************************************************************
|
||||
# Sensitive configuration
|
||||
#*********************************************************************
|
||||
## 内置文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
|
||||
## 内置文本敏感词过滤处理方法,当命中敏感词后,消息会被记录到t_sensitive_messages表中,然后根据type类型做不同的处理,处理方式如下:
|
||||
## 0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***然后正常发送;3 正常发送。
|
||||
## 如果开启 message.sensitive.forward.url 配置,命中敏感词的消息还会被回调到这个地址
|
||||
sensitive.filter.type 0
|
||||
|
||||
## 如果内置敏感词库无法满足您的需求,可以自己开发部署敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址
|
||||
## 如果内置敏感词库无法满足您的需求,可以开发部署独立敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址,内置的敏感词审核和敏感词转发功能就不再起作用了。
|
||||
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
|
||||
## 独立审核服务地址,IM服务会post SendMessageData。如果需要修改消息内容,返回 MessagePayload。请参考应用服务中 "/message/censor" Mapping.
|
||||
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
# 野火IM服务docker使用说明
|
||||
|
||||
## 编译镜像
|
||||
首先需要先编译应用服务,在项目根目录下使用下面命令编译
|
||||
首先需要先编译IM服务,在项目根目录下使用下面命令编译
|
||||
```
|
||||
mvn clean package
|
||||
```
|
||||
@@ -14,7 +14,7 @@ sudo docker build -t im-server .
|
||||
|
||||
## 运行
|
||||
配置:
|
||||
运行需要手动指定配置目录,手动指定配置目录的方法如下,其中$PATH_TO_CONFIG为im配置目录,需要为绝对路径,模版为```distribution/src/main/resources```目录。另外需要创建h2数据库目录(如果用mysql就不需要了)、日志目录、内置存储服务目录(如果使用其它对象存储服务就不需要了)。
|
||||
运行需要手动指定配置目录,手动指定配置目录的方法如下,其中$PATH_TO_CONFIG为im配置目录,需要为绝对路径,模版为```distribution/src/main/resources```目录。另外需要创建h2数据库目录(如果用mysql就不需要了)、日志目录、内置存储服务目录(如果使用其它对象存储服务就不需要了)。h2数据库目录/日志目录/内置存储服务目录需要有写权限,因为IM服务会写入文件。
|
||||
```
|
||||
sudo docker run -it --name im-server -v $PATH_TO_CONFIG:/opt/im-server/config -v $PATH_TO_LOGS:/opt/im-server/logs -v $PATH_TO_H2DB:/opt/im-server/h2db -v $PATH_TO_MEDIA:/opt/im-server/media -e JVM_XMX=256M -e JVM_XMS=256M -p 80:80 -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 18080:18080 im-server
|
||||
```
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
|
||||
<packaging>pom</packaging>
|
||||
<version>1.1.6</version>
|
||||
<version>1.1.8</version>
|
||||
<name>Wildfire Chat</name>
|
||||
<description>Wildfire Chat Server</description>
|
||||
<inceptionYear>2019</inceptionYear>
|
||||
|
||||
@@ -12,6 +12,19 @@
|
||||
|
||||
# 更新记录
|
||||
|
||||
--------------
|
||||
Release note 1.1.8:
|
||||
1. 解决可以把群主设置为管理员的问题。
|
||||
2. 发送好友请求之后5分钟内可以再次发送。
|
||||
3. 解决撤回消息中原消息二进制内容格式错误问题。
|
||||
|
||||
--------------
|
||||
Release note 1.1.7:
|
||||
1. 优化用户搜索功能。
|
||||
2. 推送消息中使用群备注。
|
||||
3. 推送消息中添加发送者和目标头像。
|
||||
4. 优化撤回消息流程。
|
||||
|
||||
--------------
|
||||
Release note 1.1.6:
|
||||
1. 支持用户设置查找自己的方法。
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.1.6</version>
|
||||
<version>1.1.8</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -747,8 +747,8 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<Void> voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
IMResult<String> stringIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
|
||||
if (stringIMResult != null && stringIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("recall message success");
|
||||
} else {
|
||||
System.out.println("recall message failure");
|
||||
@@ -756,7 +756,7 @@ public class Main {
|
||||
}
|
||||
|
||||
if (commercialServer) {
|
||||
voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid());
|
||||
IMResult<Void> voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid());
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("delete message success");
|
||||
} else {
|
||||
@@ -832,7 +832,7 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers);
|
||||
IMResult<Void> voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("Success");
|
||||
} else {
|
||||
|
||||
@@ -25,12 +25,12 @@ public class MessageAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> recallMessage(String operator, long messageUid) throws Exception {
|
||||
public static IMResult<String> recallMessage(String operator, long messageUid) throws Exception {
|
||||
String path = APIPath.Msg_Recall;
|
||||
RecallMessageData messageData = new RecallMessageData();
|
||||
messageData.setOperator(operator);
|
||||
messageData.setMessageUid(messageUid);
|
||||
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
||||
return AdminHttpUtils.httpJsonPost(path, messageData, String.class);
|
||||
}
|
||||
|
||||
//仅专业版支持
|
||||
|
||||
Reference in New Issue
Block a user