Compare commits

...
16 Commits
Author SHA1 Message Date
heavyrain.lee 4f0545dfc1 update version to 0.30 2019-11-18 15:00:39 +08:00
heavyrain.lee c1b9a81e12 重构黑名单,修改代码 2019-11-18 14:53:20 +08:00
heavyrain.lee 029b6ed691 重构黑名单,修改协议message 2019-11-18 14:52:19 +08:00
heavyrain.lee 4fdefca33d 修改拉取离线消息最大包大小为512KB 2019-11-18 11:07:50 +08:00
heavyrain.lee e90ca145be 添加设置群管理员的api接口 2019-11-14 16:11:33 +08:00
heavyrain.lee bf3d3c308d Update README.md 2019-11-13 20:28:23 +08:00
heavyrain.lee bee2f3c6ef 转移群主问题修复 2019-11-13 15:27:23 +08:00
heavyrain.lee d4e13e4578 删除敏感词后立即生效 2019-11-09 16:55:11 +08:00
heavyrain2012 66486b019f update 2019-11-04 20:30:48 +08:00
heavyrain.lee 6510204fe6 Merge pull request #104 from wildfirechat/dependabot/maven/broker/org.eclipse.paho-org.eclipse.paho.client.mqttv3-1.2.1
Bump org.eclipse.paho.client.mqttv3 from 1.0.2 to 1.2.1 in /broker
2019-11-03 20:36:09 +08:00
heavyrain.lee b4b736c0c4 Merge pull request #105 from k81/wildfirechat
remove duplicated code in reloadUserMessageMaps()
2019-11-03 20:35:23 +08:00
heavyrain.lee c4e8c5811c fix error 2019-11-03 17:02:21 +08:00
k 804b2fc610 remove duplicated code in reloadUserMessageMaps() 2019-11-03 10:55:57 +08:00
dependabot[bot] 0a7487a144 Bump org.eclipse.paho.client.mqttv3 from 1.0.2 to 1.2.1 in /broker
Bumps org.eclipse.paho.client.mqttv3 from 1.0.2 to 1.2.1.

Signed-off-by: dependabot[bot] <[email protected]>
2019-11-02 09:16:14 +00:00
heavyrain.lee 4ae9de0628 去掉sun的私有api 2019-11-02 08:44:47 +08:00
heavyrain.lee 04d0f717d8 精确搜索时,只搜索用户名和电话号码,不搜索昵称 2019-10-31 09:47:36 +08:00
26 changed files with 444 additions and 88 deletions
+5
View File
@@ -41,6 +41,11 @@
![野火IM](http://static.wildfirechat.cn/download_qrcode.png)
#### 加入野火官方体验交流群
使用野火IM移动客户端扫码下面二维码(不是使用微信扫码),和野火IM的爱好者一起畅谈野火IM的问题和经验:
![野火IM官方交流群](http://static.wildfirechat.cn/wildfirechat_official_group.jpeg)
#### 应用截图
![ios-demo](http://static.wildfirechat.cn/ios-demo.gif)
+2
View File
@@ -0,0 +1,2 @@
alter table t_friend add column `_blacked` tinyint DEFAULT 0;
update t_friend set `_blacked` = 1 where `_state` = 2;
+2
View File
@@ -0,0 +1,2 @@
alter table t_friend add column `_blacked` tinyint DEFAULT 0 COMMENT "0, normal; 1, blacked";
update t_friend set `_blacked` = 1 where `_state` = 2;
Executable → Regular
+2 -2
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.29</version>
<version>0.30</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -161,7 +161,7 @@
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.0.2</version>
<version>1.2.1</version>
</dependency>
<dependency>
@@ -36,7 +36,7 @@ public class FriendRelationGetAction extends AdminAction {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetFriendList inputGetFriendList = getRequestBody(request.getNettyRequest(), InputGetFriendList.class);
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), 0);
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0);
List<String> list = new ArrayList<>();
for (FriendData data : dataList) {
if (data.getState() == inputGetFriendList.getStatus()) {
@@ -0,0 +1,85 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputAddGroupMember;
import cn.wildfirechat.pojos.InputSetGroupManager;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Group_Set_Manager)
@HttpMethod("POST")
public class SetGroupManagerAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputSetGroupManager inputAddGroupMember = getRequestBody(request.getNettyRequest(), InputSetGroupManager.class);
if (inputAddGroupMember.isValide()) {
RPCCenter.getInstance().sendRequest(inputAddGroupMember.getOperator(), null, IMTopic.SetGroupManagerTopic, inputAddGroupMember.toProtoGroupRequest().toByteArray(), inputAddGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -15,14 +15,16 @@ public class FriendData implements Serializable {
private String friendUid;
private String alias;
private int state;
private int blacked;
private long timestamp;
public FriendData(String userId, String friendUid, String alias, int state, long timestamp) {
public FriendData(String userId, String friendUid, String alias, int state, int blacked, long timestamp) {
this.userId = userId;
this.friendUid = friendUid;
this.alias = alias;
this.state = state;
this.blacked = blacked;
this.timestamp = timestamp;
}
@@ -61,6 +63,14 @@ public class FriendData implements Serializable {
this.state = state;
}
public int getBlacked() {
return blacked;
}
public void setBlacked(int blacked) {
this.blacked = blacked;
}
public long getTimestamp() {
return timestamp;
}
@@ -22,7 +22,7 @@ import java.util.List;
public class FriendPullHandler extends IMHandler<WFCMessage.Version> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.Version request, Qos1PublishHandler.IMCallback callback) {
List<FriendData> friendDatas = m_messagesStore.getFriendList(fromUser, request.getVersion());
List<FriendData> friendDatas = m_messagesStore.getFriendList(fromUser, clientID, request.getVersion());
WFCMessage.GetFriendsResult.Builder builder = WFCMessage.GetFriendsResult.newBuilder();
for (FriendData data : friendDatas
) {
@@ -19,7 +19,6 @@ import com.xiaoleilu.loServer.model.FriendData;
import io.moquette.spi.ClientSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Encoder;
import win.liyufan.im.DBUtil;
import win.liyufan.im.MessageBundle;
import win.liyufan.im.MessageShardingUtil;
@@ -57,8 +56,6 @@ public class DatabaseStore {
statement.setString(1, userId);
statement.executeQuery();
rs = statement.executeQuery();
while (rs.next()) {
int index = 1;
@@ -173,13 +170,17 @@ public class DatabaseStore {
if (buzzy) {
sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) ";
} else {
sql += " where (`_display_name` = ? or `_name` = ? or `_mobile` = ?) ";
sql += " where (`_name` = ? or `_mobile` = ?) ";
}
sql += " and _type <> 2"; //can search normal user(0) and robot(1), can not search things
sql += " limit 20";
if (buzzy) {
sql += " limit 20";
} else {
sql += " limit 1";
}
if (page > 0) {
sql += "offset = '" + page * 20 + "'";
}
@@ -189,9 +190,8 @@ public class DatabaseStore {
int index = 1;
if (buzzy) {
statement.setString(index++, "%" + keyword + "%");
} else {
statement.setString(index++, keyword);
}
statement.setString(index++, keyword);
statement.setString(index++, keyword);
@@ -350,7 +350,7 @@ public class DatabaseStore {
try {
connection = DBUtil.getConnection();
String sql = "select `_uid`, `_friend_uid`, `_alias`, `_state`, `_dt` from t_friend";
String sql = "select `_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt` from t_friend";
statement = connection.prepareStatement(sql);
int index;
@@ -375,6 +375,9 @@ public class DatabaseStore {
int intvalue = rs.getInt(index++);
builder.setState(intvalue);
intvalue = rs.getInt(index++);
builder.setBlacked(intvalue);
long longvalue = rs.getLong(index++);
builder.setTimestamp(longvalue);
@@ -1628,8 +1631,7 @@ public class DatabaseStore {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
BASE64Encoder base64en = new BASE64Encoder();
String passwdMd5 = base64en.encode(md5.digest(password.getBytes("utf-8")));
String passwdMd5 = Base64.getEncoder().encodeToString(md5.digest(password.getBytes("utf-8")));
statement.setString(index, passwdMd5);
} catch (Exception e) {
statement.setString(index, "");
@@ -2140,7 +2142,7 @@ public class DatabaseStore {
ResultSet rs = null;
try {
connection = DBUtil.getConnection();
String sql = "select `_friend_uid`, `_alias`, `_state`, `_dt` from t_friend where `_uid` = ?";
String sql = "select `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt` from t_friend where `_uid` = ?";
statement = connection.prepareStatement(sql);
@@ -2154,9 +2156,10 @@ public class DatabaseStore {
String uid = rs.getString(1);
String alias = rs.getString(2);
int state = rs.getInt(3);
long timestamp = rs.getLong(4);
int blacked = rs.getInt(4);
long timestamp = rs.getLong(5);
FriendData data = new FriendData(userId, uid, alias, state, timestamp);
FriendData data = new FriendData(userId, uid, alias, state, blacked, timestamp);
out.add(data);
}
return out;
@@ -2306,10 +2309,11 @@ public class DatabaseStore {
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
String sql = "insert into t_friend (`_uid`, `_friend_uid`, `_alias`, `_state`, `_dt`) values(?, ?, ?, ?, ?)" +
String sql = "insert into t_friend (`_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`) values(?, ?, ?, ?, ?, ?)" +
" ON DUPLICATE KEY UPDATE " +
"`_alias` = ?," +
"`_state` = ?," +
"`_blacked` = ?," +
"`_dt` = ?";
@@ -2319,9 +2323,11 @@ public class DatabaseStore {
statement.setString(index++, request.getFriendUid());
statement.setString(index++, request.getAlias());
statement.setInt(index++, request.getState());
statement.setInt(index++, request.getBlacked());
statement.setLong(index++, request.getTimestamp());
statement.setString(index++, request.getAlias());
statement.setInt(index++, request.getState());
statement.setInt(index++, request.getBlacked());
statement.setLong(index++, request.getTimestamp());
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
@@ -30,9 +30,9 @@ import io.moquette.spi.IMatchingCondition;
import io.moquette.spi.IMessagesStore;
import io.moquette.spi.security.Tokenor;
import io.moquette.spi.impl.subscriptions.Topic;
import io.netty.handler.codec.mqtt.MqttVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Encoder;
import win.liyufan.im.*;
import java.security.MessageDigest;
@@ -349,7 +349,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
size += bundle.getMessage().getSerializedSize();
if (size >= 1 * 1024 * 1024) { //3M
if (size >= 512 * 1024) { //3M
break;
}
builder.addMessage(bundle.getMessage());
@@ -1039,25 +1039,31 @@ public class MemoryMessagesStore implements IMessagesStore {
//check the new owner is in member list? is that necessary?
long updateDt = System.currentTimeMillis();
groupInfo = groupInfo.toBuilder().setOwner(newOwner).setUpdateDt(updateDt).build();
groupInfo = groupInfo.toBuilder().setOwner(newOwner).setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build();
mIMap.set(groupId, groupInfo);
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
if (members == null || members.size() == 0) {
members = loadGroupMemberFromDB(hzInstance, groupId);
}
int modifyMemeberCount = 0;
for (WFCMessage.GroupMember member : members) {
if (modifyMemeberCount == 2) {
break;
}
if (newOwner.equals(member.getMemberId())) {
groupMembers.remove(groupId, member);
member = member.toBuilder().setType(GroupMemberType_Owner).setUpdateDt(updateDt).build();
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
groupMembers.put(groupId, member);
modifyMemeberCount++;
} else if(member.getType() == GroupMemberType_Owner) {
groupMembers.remove(groupId, member);
member = member.toBuilder().setType(GroupMemberType_Normal).setUpdateDt(updateDt).build();
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
groupMembers.put(groupId, member);
modifyMemeberCount++;
}
}
@@ -1592,8 +1598,7 @@ public class MemoryMessagesStore implements IMessagesStore {
String pwd_md5 = rs.getString(2);
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
BASE64Encoder base64en = new BASE64Encoder();
String passwdMd5 = base64en.encode(md5.digest(password.getBytes("utf-8")));
String passwdMd5 = Base64.getEncoder().encodeToString(md5.digest(password.getBytes("utf-8")));
if (passwdMd5.equals(pwd_md5)) {
LOG.info("login success userName={}, userId={}", name, uid);
userIdRet.add(uid);
@@ -1648,7 +1653,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public List<FriendData> getFriendList(String userId, long version) {
public List<FriendData> getFriendList(String userId, String clientId, long version) {
List<FriendData> out = new ArrayList<FriendData>();
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -1658,9 +1663,26 @@ public class MemoryMessagesStore implements IMessagesStore {
friends = loadFriend(friendsMap, userId);
}
boolean needFriendMigrate = false;
if (!StringUtil.isNullOrEmpty(clientId)) {
MemorySessionStore.Session session = m_Server.getStore().sessionsStore().getSession(clientId);
if(session != null && session.getMqttVersion() != null && session.getMqttVersion().protocolLevel() < MqttVersion.Wildfire_2.protocolLevel()) {
needFriendMigrate = true;
}
}
for (FriendData friend : friends) {
if (friend.getTimestamp() > version) {
out.add(friend);
if (needFriendMigrate) {
if (friend.getBlacked() > 0) {
friend.setState(2);
}
out.add(friend);
} else {
out.add(friend);
}
}
}
@@ -1715,6 +1737,24 @@ public class MemoryMessagesStore implements IMessagesStore {
return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST;
}
}
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
FriendData friendData1 = null;
Collection<FriendData> friendDatas = friendsMap.get(userId);
if (friendDatas == null || friendDatas.size() == 0) {
friendDatas = loadFriend(friendsMap, userId);
}
for (FriendData fd : friendDatas) {
if (fd.getFriendUid().equals(request.getTargetUid())) {
friendData1 = fd;
break;
}
}
if (friendData1 != null && friendData1.getBlacked() > 0) {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
}
WFCMessage.FriendRequest newRequest = WFCMessage.FriendRequest
.newBuilder()
.setFromUid(userId)
@@ -1766,7 +1806,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
if (friendData1 == null) {
friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getStatus(), System.currentTimeMillis());
friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getStatus(), 0, System.currentTimeMillis());
} else {
friendData1.setState(request.getStatus());
friendData1.setTimestamp(System.currentTimeMillis());
@@ -1788,7 +1828,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
if (friendData2 == null) {
friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getStatus(), friendData1.getTimestamp());
friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getStatus(), 0, friendData1.getTimestamp());
} else {
friendsMap.remove(request.getTargetUid(), friendData2);
friendData2.setState(request.getStatus());
@@ -1829,10 +1869,10 @@ public class MemoryMessagesStore implements IMessagesStore {
databaseStore.persistOrUpdateFriendRequest(existRequest);
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", 0, System.currentTimeMillis());
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", 0, 0, System.currentTimeMillis());
databaseStore.persistOrUpdateFriendData(friendData1);
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", 0, friendData1.getTimestamp());
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", 0, 0, friendData1.getTimestamp());
databaseStore.persistOrUpdateFriendData(friendData2);
requestMap.remove(userId);
@@ -1854,6 +1894,9 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override
public ErrorCode blackUserRequest(String fromUser, String targetUserId, int state, long[] heads) {
if (state == 2) {
state = 1;
}
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
@@ -1871,9 +1914,9 @@ public class MemoryMessagesStore implements IMessagesStore {
}
if (friendData == null) {
friendData = new FriendData(fromUser, targetUserId, "", state, System.currentTimeMillis());
friendData = new FriendData(fromUser, targetUserId, "", 1, state, System.currentTimeMillis());
}
friendData.setState(state);
friendData.setBlacked(state);
friendData.setTimestamp(System.currentTimeMillis());
@@ -2320,6 +2363,7 @@ public class MemoryMessagesStore implements IMessagesStore {
words) {
databaseStore.deleteSensitiveWord(word);
}
lastUpdateSensitiveTime = 0;
return true;
}
@@ -153,7 +153,7 @@ public interface IMessagesStore {
ErrorCode verifyToken(String userId, String token, List<String> serverIPs, List<Integer> ports);
ErrorCode login(String name, String password, List<String> userIdRet);
List<FriendData> getFriendList(String userId, long version);
List<FriendData> getFriendList(String userId, String clientId, long version);
List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version);
ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head);
@@ -142,9 +142,8 @@ public class ProtocolProcessor {
String clientId = payload.clientIdentifier();
LOG.info("Processing CONNECT message. CId={}, username={}", clientId, payload.userName());
if (msg.variableHeader().version() != MqttVersion.MQTT_3_1.protocolLevel()
&& msg.variableHeader().version() != MqttVersion.MQTT_3_1_1.protocolLevel()
&& msg.variableHeader().version() != MqttVersion.Wildfire_1.protocolLevel()) {
if (msg.variableHeader().version() <= MqttVersion.MQTT_3_1_1.protocolLevel() ||
msg.variableHeader().version() >= MqttVersion.Wildfire_Max.protocolLevel()) {
MqttConnAckMessage badProto = connAck(CONNECTION_REFUSED_UNACCEPTABLE_PROTOCOL_VERSION);
LOG.error("MQTT protocol version is not valid. CId={}", clientId);
@@ -178,7 +178,7 @@ public class Qos1PublishHandler extends QosPublishHandler {
} else {
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
if (session != null && session.getUsername().equals(fromUser)) {
if (data.length > 7*1024 && session.getMqttVersion() == MqttVersion.Wildfire_1) {
if (data.length > 7*1024 && session.getMqttVersion().protocolLevel() >= MqttVersion.Wildfire_1.protocolLevel()) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip;
try {
@@ -43,7 +43,7 @@ final class MqttCodecUtil {
return clientId != null && clientId.length() >= MIN_CLIENT_ID_LENGTH &&
clientId.length() <= MAX_CLIENT_ID_LENGTH;
}
if (mqttVersion == MqttVersion.MQTT_3_1_1 || mqttVersion == MqttVersion.Wildfire_1) {
if (mqttVersion.protocolLevel() >= MqttVersion.MQTT_3_1_1.protocolLevel()) {
// In 3.1.3.1 Client Identifier of MQTT 3.1.1 specification, The Server MAY allow ClientId’s
// that contain more than 23 encoded bytes. And, The Server MAY allow zero-length ClientId.
return clientId != null;
@@ -223,7 +223,7 @@ public final class MqttDecoder extends ReplayingDecoder<DecoderState> {
final int willQos = (b1 & 0x18) >> 3;
final boolean willFlag = (b1 & 0x04) == 0x04;
final boolean cleanSession = (b1 & 0x02) == 0x02;
if (mqttVersion == MqttVersion.MQTT_3_1_1 || mqttVersion == MqttVersion.Wildfire_1) {
if (mqttVersion.protocolLevel() >= MqttVersion.MQTT_3_1_1.protocolLevel()) {
final boolean zeroReservedFlag = (b1 & 0x01) == 0x0;
if (!zeroReservedFlag) {
// MQTT v3.1.1: The Server MUST validate that the reserved flag in the CONNECT Control Packet is
@@ -25,7 +25,9 @@ import io.netty.util.internal.ObjectUtil;
public enum MqttVersion {
MQTT_3_1("MQIsdp", (byte) 3),
MQTT_3_1_1("MQTT", (byte) 4),
Wildfire_1("MQTT", (byte) 5);
Wildfire_1("MQTT", (byte) 5),
Wildfire_2("MQTT", (byte) 6),
Wildfire_Max("MQTT", (byte) 7);
private final String name;
private final byte level;
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.29</version>
<version>0.30</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -0,0 +1,72 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package cn.wildfirechat.pojos;
import cn.wildfirechat.proto.WFCMessage;
import io.netty.util.internal.StringUtil;
import java.util.List;
public class InputSetGroupManager extends InputGroupBase {
private String group_id;
private List<String> members;
private boolean is_manager;
public String getGroup_id() {
return group_id;
}
public void setGroup_id(String group_id) {
this.group_id = group_id;
}
public List<String> getMembers() {
return members;
}
public void setMembers(List<String> members) {
this.members = members;
}
public boolean isIs_manager() {
return is_manager;
}
public void setIs_manager(boolean is_manager) {
this.is_manager = is_manager;
}
public boolean isValide() {
if (StringUtil.isNullOrEmpty(operator) || StringUtil.isNullOrEmpty(group_id) || members == null || members.isEmpty()) {
return false;
}
return true;
}
public WFCMessage.SetGroupManagerRequest toProtoGroupRequest() {
WFCMessage.SetGroupManagerRequest.Builder addGroupBuilder = WFCMessage.SetGroupManagerRequest.newBuilder();
addGroupBuilder.setGroupId(group_id);
addGroupBuilder.addAllUserId(members);
addGroupBuilder.setType(is_manager ? 1 : 0);
if (to_lines != null) {
for (Integer line : to_lines
) {
addGroupBuilder.addToLine(line);
}
}
if (notify_message != null) {
addGroupBuilder.setNotifyContent(notify_message.toProtoMessageContent());
}
return addGroupBuilder.build();
}
}
@@ -36,6 +36,7 @@ public interface APIPath {
String Group_Member_List = "/admin/group/member/list";
String Group_Member_Add = "/admin/group/member/add";
String Group_Member_Kickoff = "/admin/group/member/del";
String Group_Set_Manager = "/admin/group/manager/set";
String Create_Channel = "/admin/channel/create";
@@ -1,5 +1,5 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: wfcmessage.proto
// source: wfcmessage_community.proto
package cn.wildfirechat.proto;
@@ -45256,6 +45256,16 @@ public final class WFCMessage {
*/
com.google.protobuf.ByteString
getAliasBytes();
// optional int32 blacked = 5;
/**
* <code>optional int32 blacked = 5;</code>
*/
boolean hasBlacked();
/**
* <code>optional int32 blacked = 5;</code>
*/
int getBlacked();
}
/**
* Protobuf type {@code Friend}
@@ -45328,6 +45338,11 @@ public final class WFCMessage {
alias_ = input.readBytes();
break;
}
case 40: {
bitField0_ |= 0x00000010;
blacked_ = input.readInt32();
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -45486,11 +45501,28 @@ public final class WFCMessage {
}
}
// optional int32 blacked = 5;
public static final int BLACKED_FIELD_NUMBER = 5;
private int blacked_;
/**
* <code>optional int32 blacked = 5;</code>
*/
public boolean hasBlacked() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>optional int32 blacked = 5;</code>
*/
public int getBlacked() {
return blacked_;
}
private void initFields() {
uid_ = "";
state_ = 0;
updateDt_ = 0L;
alias_ = "";
blacked_ = 0;
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@@ -45528,6 +45560,9 @@ public final class WFCMessage {
if (((bitField0_ & 0x00000008) == 0x00000008)) {
output.writeBytes(4, getAliasBytes());
}
if (((bitField0_ & 0x00000010) == 0x00000010)) {
output.writeInt32(5, blacked_);
}
getUnknownFields().writeTo(output);
}
@@ -45553,6 +45588,10 @@ public final class WFCMessage {
size += com.google.protobuf.CodedOutputStream
.computeBytesSize(4, getAliasBytes());
}
if (((bitField0_ & 0x00000010) == 0x00000010)) {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(5, blacked_);
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
@@ -45677,6 +45716,8 @@ public final class WFCMessage {
bitField0_ = (bitField0_ & ~0x00000004);
alias_ = "";
bitField0_ = (bitField0_ & ~0x00000008);
blacked_ = 0;
bitField0_ = (bitField0_ & ~0x00000010);
return this;
}
@@ -45721,6 +45762,10 @@ public final class WFCMessage {
to_bitField0_ |= 0x00000008;
}
result.alias_ = alias_;
if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
to_bitField0_ |= 0x00000010;
}
result.blacked_ = blacked_;
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
@@ -45753,6 +45798,9 @@ public final class WFCMessage {
alias_ = other.alias_;
onChanged();
}
if (other.hasBlacked()) {
setBlacked(other.getBlacked());
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
@@ -46006,6 +46054,39 @@ public final class WFCMessage {
return this;
}
// optional int32 blacked = 5;
private int blacked_ ;
/**
* <code>optional int32 blacked = 5;</code>
*/
public boolean hasBlacked() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>optional int32 blacked = 5;</code>
*/
public int getBlacked() {
return blacked_;
}
/**
* <code>optional int32 blacked = 5;</code>
*/
public Builder setBlacked(int value) {
bitField0_ |= 0x00000010;
blacked_ = value;
onChanged();
return this;
}
/**
* <code>optional int32 blacked = 5;</code>
*/
public Builder clearBlacked() {
bitField0_ = (bitField0_ & ~0x00000010);
blacked_ = 0;
onChanged();
return this;
}
// @@protoc_insertion_point(builder_scope:Friend)
}
@@ -60248,46 +60329,46 @@ public final class WFCMessage {
"cope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\"\032" +
"\n\007Version\022\017\n\007version\030\001 \002(\003\"8\n\024GetUserSet" +
"tingResult\022 \n\005entry\030\001 \003(\0132\021.UserSettingE" +
"ntry\"F\n\006Friend\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002" +
"(\005\022\021\n\tupdate_dt\030\003 \002(\003\022\r\n\005alias\030\004 \001(\t\"*\n\020" +
"GetFriendsResult\022\026\n\005entry\030\001 \003(\0132\007.Friend" +
"\"7\n\026GetFriendRequestResult\022\035\n\005entry\030\001 \003(",
"\0132\016.FriendRequest\"\243\001\n\021ConnectAckPayload\022" +
"\020\n\010msg_head\030\001 \001(\003\022\023\n\013friend_head\030\002 \001(\003\022\026" +
"\n\016friend_rq_head\030\003 \001(\003\022\024\n\014setting_head\030\004" +
" \001(\003\022\021\n\tnode_addr\030\005 \001(\t\022\021\n\tnode_port\030\006 \001" +
"(\005\022\023\n\013server_time\030\007 \001(\003\"P\n\rIMHttpWrapper" +
"\022\r\n\005token\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\017\n\007re" +
"quest\030\003 \002(\t\022\014\n\004data\030\004 \001(\014\"A\n\021SearchUserR" +
"equest\022\017\n\007keyword\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014" +
"\n\004page\030\003 \001(\005\"(\n\020SearchUserResult\022\024\n\005entr" +
"y\030\001 \003(\0132\005.User\"@\n\026GetChatroomInfoRequest",
"\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003" +
"\"\227\001\n\014ChatroomInfo\022\r\n\005title\030\001 \002(\t\022\014\n\004desc" +
"\030\002 \001(\t\022\020\n\010portrait\030\003 \001(\t\022\024\n\014member_count" +
"\030\004 \001(\005\022\021\n\tcreate_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006" +
" \001(\003\022\r\n\005extra\030\007 \001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034Ge" +
"tChatroomMemberInfoRequest\022\023\n\013chatroom_i" +
"d\030\001 \002(\t\022\021\n\tmax_count\030\002 \001(\005\";\n\022ChatroomMe" +
"mberInfo\022\024\n\014member_count\030\001 \001(\005\022\017\n\007member" +
"s\030\002 \003(\t\"\026\n\010INT64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023Notif" +
"yRecallMessage\022\n\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030",
"\002 \002(\t\"/\n\020BlackUserRequest\022\013\n\003uid\030\001 \002(\t\022\016" +
"\n\006status\030\002 \002(\005\"\323\001\n\014RouteRequest\022\013\n\003app\030\001" +
" \001(\t\022\020\n\010platform\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(" +
"\005\022\023\n\013device_name\030\004 \001(\t\022\026\n\016device_version" +
"\030\005 \001(\t\022\022\n\nphone_name\030\006 \001(\t\022\020\n\010language\030\007" +
" \001(\t\022\024\n\014carrier_name\030\010 \001(\t\022\023\n\013app_versio" +
"n\030\t \001(\t\022\023\n\013sdk_version\030\n \001(\t\"D\n\rRouteRes" +
"ponse\022\014\n\004host\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022" +
"\n\nshort_port\030\003 \002(\005\"5\n\017GetTokenRequest\022\017\n" +
"\007user_id\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\"\\\n\022Loa",
"dRemoteMessages\022#\n\014conversation\030\001 \002(\0132\r." +
"Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n\005coun" +
"t\030\003 \002(\005\"a\n\020MultiCastMessage\022\021\n\tfrom_user" +
"\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.MessageContent" +
"\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005B#\n\025cn.wildfir" +
"echat.protoB\nWFCMessage"
"ntry\"W\n\006Friend\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002" +
"(\005\022\021\n\tupdate_dt\030\003 \002(\003\022\r\n\005alias\030\004 \001(\t\022\017\n\007" +
"blacked\030\005 \001(\005\"*\n\020GetFriendsResult\022\026\n\005ent" +
"ry\030\001 \003(\0132\007.Friend\"7\n\026GetFriendRequestRes",
"ult\022\035\n\005entry\030\001 \003(\0132\016.FriendRequest\"\243\001\n\021C" +
"onnectAckPayload\022\020\n\010msg_head\030\001 \001(\003\022\023\n\013fr" +
"iend_head\030\002 \001(\003\022\026\n\016friend_rq_head\030\003 \001(\003\022" +
"\024\n\014setting_head\030\004 \001(\003\022\021\n\tnode_addr\030\005 \001(\t" +
"\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013server_time\030\007 \001(\003" +
"\"P\n\rIMHttpWrapper\022\r\n\005token\030\001 \002(\t\022\021\n\tclie" +
"nt_id\030\002 \002(\t\022\017\n\007request\030\003 \002(\t\022\014\n\004data\030\004 \001" +
"(\014\"A\n\021SearchUserRequest\022\017\n\007keyword\030\001 \002(\t" +
"\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page\030\003 \001(\005\"(\n\020SearchU" +
"serResult\022\024\n\005entry\030\001 \003(\0132\005.User\"@\n\026GetCh",
"atroomInfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021" +
"\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014ChatroomInfo\022\r\n\005ti" +
"tle\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010portrait\030\003 \001(" +
"\t\022\024\n\014member_count\030\004 \001(\005\022\021\n\tcreate_dt\030\005 \001" +
"(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r\n\005extra\030\007 \001(\t\022\r\n\005" +
"state\030\010 \001(\005\"F\n\034GetChatroomMemberInfoRequ" +
"est\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tmax_count\030\002 " +
"\001(\005\";\n\022ChatroomMemberInfo\022\024\n\014member_coun" +
"t\030\001 \001(\005\022\017\n\007members\030\002 \003(\t\"\026\n\010INT64Buf\022\n\n\002" +
"id\030\001 \002(\003\"4\n\023NotifyRecallMessage\022\n\n\002id\030\001 ",
"\002(\003\022\021\n\tfrom_user\030\002 \002(\t\"/\n\020BlackUserReque" +
"st\022\013\n\003uid\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\"\323\001\n\014Rout" +
"eRequest\022\013\n\003app\030\001 \001(\t\022\020\n\010platform\030\002 \001(\005\022" +
"\021\n\tpush_type\030\003 \001(\005\022\023\n\013device_name\030\004 \001(\t\022" +
"\026\n\016device_version\030\005 \001(\t\022\022\n\nphone_name\030\006 " +
"\001(\t\022\020\n\010language\030\007 \001(\t\022\024\n\014carrier_name\030\010 " +
"\001(\t\022\023\n\013app_version\030\t \001(\t\022\023\n\013sdk_version\030" +
"\n \001(\t\"D\n\rRouteResponse\022\014\n\004host\030\001 \002(\t\022\021\n\t" +
"long_port\030\002 \002(\005\022\022\n\nshort_port\030\003 \002(\005\"5\n\017G" +
"etTokenRequest\022\017\n\007user_id\030\001 \002(\t\022\021\n\tclien",
"t_id\030\002 \002(\t\"\\\n\022LoadRemoteMessages\022#\n\014conv" +
"ersation\030\001 \002(\0132\r.Conversation\022\022\n\nbefore_" +
"uid\030\002 \002(\003\022\r\n\005count\030\003 \002(\005\"a\n\020MultiCastMes" +
"sage\022\021\n\tfrom_user\030\001 \002(\t\022 \n\007content\030\002 \002(\013" +
"2\017.MessageContent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 " +
"\002(\005B#\n\025cn.wildfirechat.protoB\nWFCMessage"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -60617,7 +60698,7 @@ public final class WFCMessage {
internal_static_Friend_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_Friend_descriptor,
new java.lang.String[] { "Uid", "State", "UpdateDt", "Alias", });
new java.lang.String[] { "Uid", "State", "UpdateDt", "Alias", "Blacked", });
internal_static_GetFriendsResult_descriptor =
getDescriptor().getMessageTypes().get(54);
internal_static_GetFriendsResult_fieldAccessorTable = new
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.29</version>
<version>0.30</version>
</parent>
<artifactId>distribution</artifactId>
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging>
<version>0.29</version>
<version>0.30</version>
<name>Wildfire Chat</name>
<description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.29</version>
<version>0.30</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -88,6 +88,20 @@ public class GroupAdmin {
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public static IMResult<Void> setGroupManager(String operator, String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Group_Set_Manager;
InputSetGroupManager addGroupMember = new InputSetGroupManager();
addGroupMember.setGroup_id(groupId);
addGroupMember.setMembers(groupMemberIds);
addGroupMember.setIs_manager(isManager);
addGroupMember.setOperator(operator);
addGroupMember.setTo_lines(to_lines);
addGroupMember.setNotify_message(notify_message);
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public static IMResult<Void> kickoffGroupMembers(String operator, String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Group_Member_Kickoff;
InputKickoffGroupMember kickoffGroupMember = new InputKickoffGroupMember();
@@ -268,6 +268,24 @@ public class Main {
System.exit(-1);
}
voidIMResult = GroupAdmin.setGroupManager("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), true, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("set group manager success");
} else {
System.out.println("set group manager failure");
System.exit(-1);
}
voidIMResult = GroupAdmin.setGroupManager("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), false, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("cancel group manager success");
} else {
System.out.println("cancel group manager failure");
System.exit(-1);
}
//***********************************************
//**** 消息相关功能
//***********************************************
@@ -0,0 +1,15 @@
从github release处下载源码,或者从工程首页下载源码会编译失败,提示如下
```
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 51.504 s
[INFO] Finished at: 2019-11-04T20:27:21+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal pl.project13.maven:git-commit-id-plugin:2.1.5:revision (default) on project distribution: .git directory could not be found! Please specify a valid [dotGitDirectory] in your pom.xml -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
```
原因是项目中有个git的插件需要读取当前工程的提交信息,github打包的源码没有git信息,所以就打包失败。
解决办法:git clone下载