Change the server authentication method

This commit is contained in:
方块君 2022-07-22 21:21:12 +08:00
parent 8030ef8034
commit e62b1d4967
4 changed files with 130 additions and 79 deletions

View File

@ -2,10 +2,7 @@ package com.github.jie65535.opencommand.socket;
import com.github.jie65535.opencommand.OpenCommandConfig; import com.github.jie65535.opencommand.OpenCommandConfig;
import com.github.jie65535.opencommand.OpenCommandPlugin; import com.github.jie65535.opencommand.OpenCommandPlugin;
import com.github.jie65535.opencommand.socket.packet.BasePacket; import com.github.jie65535.opencommand.socket.packet.*;
import com.github.jie65535.opencommand.socket.packet.HeartBeat;
import com.github.jie65535.opencommand.socket.packet.HttpPacket;
import com.github.jie65535.opencommand.socket.packet.Packet;
import com.github.jie65535.opencommand.socket.packet.player.Player; import com.github.jie65535.opencommand.socket.packet.player.Player;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.CommandMap; import emu.grasscutter.command.CommandMap;
@ -29,8 +26,11 @@ public class SocketClient {
public static boolean connect = false; public static boolean connect = false;
public static ReceiveThread receiveThread;
// 连接服务器 // 连接服务器
public static void connectServer() { public static void connectServer() {
if (connect) return;
OpenCommandConfig config = OpenCommandPlugin.getInstance().getConfig(); OpenCommandConfig config = OpenCommandPlugin.getInstance().getConfig();
mLogger = OpenCommandPlugin.getInstance().getLogger(); mLogger = OpenCommandPlugin.getInstance().getLogger();
clientThread = new ClientThread(config.socketHost, config.socketPort); clientThread = new ClientThread(config.socketHost, config.socketPort);
@ -80,10 +80,9 @@ public class SocketClient {
// 数据包接收 // 数据包接收
private static class ReceiveThread extends Thread { private static class ReceiveThread extends Thread {
private InputStream is; private InputStream is;
private String token; private boolean exit = false;
public ReceiveThread(Socket socket) { public ReceiveThread(Socket socket) {
token = OpenCommandPlugin.getInstance().getConfig().socketToken;
try { try {
is = socket.getInputStream(); is = socket.getInputStream();
} catch (IOException e) { } catch (IOException e) {
@ -97,9 +96,11 @@ public class SocketClient {
//noinspection InfiniteLoopStatement //noinspection InfiniteLoopStatement
while (true) { while (true) {
try { try {
if (exit) {
return;
}
String data = SocketUtils.readString(is); String data = SocketUtils.readString(is);
Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class);
if (packet.token.equals(token)) {
switch (packet.type) { switch (packet.type) {
// 玩家类 // 玩家类
case Player: case Player:
@ -122,7 +123,7 @@ public class SocketClient {
CommandMap.getInstance().invoke(playerData, playerData, command); CommandMap.getInstance().invoke(playerData, playerData, command);
sendPacket(new HttpPacket(200, resultCollector.getMessage()), packet.packetID); sendPacket(new HttpPacket(200, resultCollector.getMessage()), packet.packetID);
} catch (Exception e) { } catch (Exception e) {
OpenCommandPlugin.getInstance().getLogger().warn("Run command failed.", e); OpenCommandPlugin.getInstance().getLogger().warn("[OpenCommand] Run command failed.", e);
sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID); sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID);
} finally { } finally {
playerData.setMessageHandler(null); playerData.setMessageHandler(null);
@ -140,14 +141,20 @@ public class SocketClient {
} }
break; break;
} }
}
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
if (!sendPacket(new HeartBeat("Pong"))) {
return;
} }
} }
} }
} }
public void exit() {
exit = true;
}
}
// 客户端连接线程 // 客户端连接线程
private static class ClientThread extends Thread { private static class ClientThread extends Thread {
private final String ip; private final String ip;
@ -172,17 +179,26 @@ public class SocketClient {
@Override @Override
public void run() { public void run() {
try { try {
socket = new Socket(ip, port);
connect = true; connect = true;
if (receiveThread != null) {
receiveThread.exit();
}
socket = new Socket(ip, port);
os = socket.getOutputStream(); os = socket.getOutputStream();
mLogger.info("Connect to server: " + ip + ":" + port); mLogger.info("[OpenCommand]Connect to server: " + ip + ":" + port);
new ReceiveThread(socket); SocketClient.sendPacket(new AuthPacket(OpenCommandPlugin.getInstance().getConfig().socketToken));
receiveThread = new ReceiveThread(socket);
} catch (IOException e) { } catch (IOException e) {
connect = false; connect = false;
mLogger.warn("Connect to server failed: " + ip + ":" + port); mLogger.warn("[OpenCommand]Connect to server failed: " + ip + ":" + port);
mLogger.warn("[OpenCommand] Reconnect to server"); mLogger.warn("[OpenCommand] Retry connecting to the server after 15 seconds");
try {
Thread.sleep(15000);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
connectServer(); connectServer();
throw new RuntimeException(e);
} }
} }
} }

View File

@ -1,9 +1,7 @@
package com.github.jie65535.opencommand.socket; package com.github.jie65535.opencommand.socket;
import com.github.jie65535.opencommand.OpenCommandPlugin; import com.github.jie65535.opencommand.OpenCommandPlugin;
import com.github.jie65535.opencommand.socket.packet.BasePacket; import com.github.jie65535.opencommand.socket.packet.*;
import com.github.jie65535.opencommand.socket.packet.HttpPacket;
import com.github.jie65535.opencommand.socket.packet.Packet;
import com.github.jie65535.opencommand.socket.packet.player.PlayerList; import com.github.jie65535.opencommand.socket.packet.player.PlayerList;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -87,7 +85,7 @@ public class SocketServer {
var clientID = client.getKey(); var clientID = client.getKey();
var clientTime = client.getValue(); var clientTime = client.getValue();
if (clientTime > TIMEOUT) { if (clientTime > TIMEOUT) {
mLogger.info("Client {} timeout, disconnect.", clientID); mLogger.info("[OpenCommand] Client {} timeout, disconnect.", clientID);
clientList.remove(clientID); clientList.remove(clientID);
clientTimeout.remove(clientID); clientTimeout.remove(clientID);
SocketData.playerList.remove(clientID); SocketData.playerList.remove(clientID);
@ -105,6 +103,7 @@ public class SocketServer {
private OutputStream os; private OutputStream os;
private final String address; private final String address;
private final String token; private final String token;
private boolean auth = false;
private final HashMap<String, SocketDataWait<?>> socketDataWaitList = new HashMap<>(); private final HashMap<String, SocketDataWait<?>> socketDataWaitList = new HashMap<>();
@ -147,7 +146,24 @@ public class SocketServer {
try { try {
String data = SocketUtils.readString(is); String data = SocketUtils.readString(is);
Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class);
if (packet.token.equals(token)) { if (packet.type == PacketEnum.AuthPacket) {
AuthPacket authPacket = Grasscutter.getGsonFactory().fromJson(data, AuthPacket.class);
if (authPacket.token.equals(token)) {
auth = true;
mLogger.info("[OpenCommand] Client {} auth success", address);
clientList.put(address, this);
clientTimeout.put(address, 0);
} else {
mLogger.warn("[OpenCommand] Client {} auth failed", address);
socket.close();
return;
}
}
if (!auth) {
mLogger.warn("[OpenCommand] Client {} auth failed", address);
socket.close();
return;
}
switch (packet.type) { switch (packet.type) {
// 缓存玩家列表 // 缓存玩家列表
case PlayerList -> { case PlayerList -> {
@ -159,7 +175,7 @@ public class SocketServer {
HttpPacket httpPacket = Grasscutter.getGsonFactory().fromJson(packet.data, HttpPacket.class); HttpPacket httpPacket = Grasscutter.getGsonFactory().fromJson(packet.data, HttpPacket.class);
var socketWait = socketDataWaitList.get(packet.packetID); var socketWait = socketDataWaitList.get(packet.packetID);
if (socketWait == null) { if (socketWait == null) {
mLogger.error("HttpPacket: " + packet.packetID + " not found"); mLogger.error("[OpenCommand] HttpPacket: " + packet.packetID + " not found");
return; return;
} }
socketWait.setData(httpPacket); socketWait.setData(httpPacket);
@ -170,7 +186,6 @@ public class SocketServer {
clientTimeout.put(address, 0); clientTimeout.put(address, 0);
} }
} }
}
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
mLogger.error("[OpenCommand] Client {} disconnect.", address); mLogger.error("[OpenCommand] Client {} disconnect.", address);
@ -194,16 +209,14 @@ public class SocketServer {
@Override @Override
public void run() { public void run() {
mLogger.info("Start socket server on port " + socketServer.getLocalPort()); mLogger.info("[OpenCommand] Start socket server on port " + socketServer.getLocalPort());
// noinspection InfiniteLoopStatement // noinspection InfiniteLoopStatement
while (true) { while (true) {
try { try {
Socket accept = socketServer.accept(); Socket accept = socketServer.accept();
String address = accept.getInetAddress() + ":" + accept.getPort(); String address = accept.getInetAddress() + ":" + accept.getPort();
mLogger.info("Client connect: " + address); mLogger.info("[OpenCommand] Client connect: " + address);
ClientThread clientThread = new ClientThread(accept); new ClientThread(accept);
clientList.put(address, clientThread);
clientTimeout.put(address, 0);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -0,0 +1,21 @@
package com.github.jie65535.opencommand.socket.packet;
import emu.grasscutter.Grasscutter;
public class AuthPacket extends BasePacket {
public String token;
public AuthPacket(String token) {
this.token = token;
}
@Override
public String getPacket() {
return Grasscutter.getGsonFactory().toJson(this);
}
@Override
public PacketEnum getType() {
return PacketEnum.AuthPacket;
}
}

View File

@ -5,5 +5,6 @@ public enum PacketEnum {
PlayerList, PlayerList,
Player, Player,
HttpPacket, HttpPacket,
AuthPacket,
HeartBeat HeartBeat
} }