重构黑名单,修改代码

This commit is contained in:
heavyrain.lee
2019-11-18 14:53:20 +08:00
parent 029b6ed691
commit c1b9a81e12
13 changed files with 85 additions and 24 deletions
@@ -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()) {
@@ -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
) {
@@ -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);
@@ -2139,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);
@@ -2153,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;
@@ -2305,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` = ?";
@@ -2318,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,6 +30,7 @@ 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 win.liyufan.im.*;
@@ -1652,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();
@@ -1662,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);
}
}
}
@@ -1719,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)
@@ -1770,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());
@@ -1792,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());
@@ -1833,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);
@@ -1858,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);
@@ -1875,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());
@@ -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;