mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-22 03:45:10 +01:00
Separate the dispatch and game servers (pt. 1)
gacha is still broken, handbook still needs to be done
This commit is contained in:
@@ -1,10 +1,7 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.ACCOUNT;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.Account;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
@@ -16,21 +13,29 @@ import emu.grasscutter.server.game.GameSession.SessionState;
|
||||
import emu.grasscutter.server.packet.send.PacketGetPlayerTokenRsp;
|
||||
import emu.grasscutter.utils.ByteHelper;
|
||||
import emu.grasscutter.utils.Crypto;
|
||||
import emu.grasscutter.utils.DispatchUtils;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.security.Signature;
|
||||
import javax.crypto.Cipher;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.ACCOUNT;
|
||||
|
||||
@Opcodes(PacketOpcodes.GetPlayerTokenReq)
|
||||
public class HandlerGetPlayerTokenReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
GetPlayerTokenReq req = GetPlayerTokenReq.parseFrom(payload);
|
||||
var req = GetPlayerTokenReq.parseFrom(payload);
|
||||
|
||||
// Authenticate
|
||||
Account account = DatabaseHelper.getAccountById(req.getAccountUid());
|
||||
if (account == null || !account.getToken().equals(req.getAccountToken())) {
|
||||
// Fetch the account from the ID and token.
|
||||
var accountId = req.getAccountUid();
|
||||
var account = DispatchUtils.authenticate(
|
||||
accountId, req.getAccountToken());
|
||||
|
||||
// Check the account.
|
||||
if (account == null) {
|
||||
session.close();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -42,9 +47,10 @@ public class HandlerGetPlayerTokenReq extends PacketHandler {
|
||||
// secondly !!!
|
||||
// TODO - optimize
|
||||
boolean kicked = false;
|
||||
Player exists = Grasscutter.getGameServer().getPlayerByAccountId(account.getId());
|
||||
var exists = Grasscutter.getGameServer()
|
||||
.getPlayerByAccountId(accountId);
|
||||
if (exists != null) {
|
||||
GameSession existsSession = exists.getSession();
|
||||
var existsSession = exists.getSession();
|
||||
if (existsSession != session) { // No self-kicking
|
||||
exists.onLogout(); // must save immediately , or the below will load old data
|
||||
existsSession.close();
|
||||
@@ -67,14 +73,14 @@ public class HandlerGetPlayerTokenReq extends PacketHandler {
|
||||
}
|
||||
|
||||
// Call creation event.
|
||||
PlayerCreationEvent event = new PlayerCreationEvent(session, Player.class);
|
||||
var event = new PlayerCreationEvent(session, Player.class);
|
||||
event.call();
|
||||
|
||||
// Get player.
|
||||
Player player = DatabaseHelper.getPlayerByAccount(account, event.getPlayerClass());
|
||||
var player = DatabaseHelper.getPlayerByAccount(account, event.getPlayerClass());
|
||||
|
||||
if (player == null) {
|
||||
int nextPlayerUid =
|
||||
var nextPlayerUid =
|
||||
DatabaseHelper.getNextPlayerId(session.getAccount().getReservedPlayerUid());
|
||||
|
||||
// Create player instance from event.
|
||||
@@ -107,19 +113,19 @@ public class HandlerGetPlayerTokenReq extends PacketHandler {
|
||||
// Only >= 2.7.50 has this
|
||||
if (req.getKeyId() > 0) {
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||
var cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||
cipher.init(Cipher.DECRYPT_MODE, Crypto.CUR_SIGNING_KEY);
|
||||
|
||||
var client_seed_encrypted = Utils.base64Decode(req.getClientRandKey());
|
||||
var client_seed = ByteBuffer.wrap(cipher.doFinal(client_seed_encrypted)).getLong();
|
||||
|
||||
byte[] seed_bytes =
|
||||
var seed_bytes =
|
||||
ByteBuffer.wrap(new byte[8]).putLong(Crypto.ENCRYPT_SEED ^ client_seed).array();
|
||||
|
||||
cipher.init(Cipher.ENCRYPT_MODE, Crypto.EncryptionKeys.get(req.getKeyId()));
|
||||
var seed_encrypted = cipher.doFinal(seed_bytes);
|
||||
|
||||
Signature privateSignature = Signature.getInstance("SHA256withRSA");
|
||||
var privateSignature = Signature.getInstance("SHA256withRSA");
|
||||
privateSignature.initSign(Crypto.CUR_SIGNING_KEY);
|
||||
privateSignature.update(seed_bytes);
|
||||
|
||||
@@ -128,14 +134,13 @@ public class HandlerGetPlayerTokenReq extends PacketHandler {
|
||||
session,
|
||||
Utils.base64Encode(seed_encrypted),
|
||||
Utils.base64Encode(privateSignature.sign())));
|
||||
} catch (Exception ignore) {
|
||||
} catch (Exception ignored) {
|
||||
// Only UA Patch users will have exception
|
||||
byte[] clientBytes = Utils.base64Decode(req.getClientRandKey());
|
||||
byte[] seed = ByteHelper.longToBytes(Crypto.ENCRYPT_SEED);
|
||||
var clientBytes = Utils.base64Decode(req.getClientRandKey());
|
||||
var seed = ByteHelper.longToBytes(Crypto.ENCRYPT_SEED);
|
||||
Crypto.xor(clientBytes, seed);
|
||||
|
||||
String base64str = Utils.base64Encode(clientBytes);
|
||||
|
||||
var base64str = Utils.base64Encode(clientBytes);
|
||||
session.send(new PacketGetPlayerTokenRsp(session, base64str, "bm90aGluZyBoZXJl"));
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.*;
|
||||
|
||||
import com.google.protobuf.ByteString;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.Grasscutter.ServerRunMode;
|
||||
@@ -13,8 +11,12 @@ import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.http.dispatch.RegionHandler;
|
||||
import emu.grasscutter.utils.Crypto;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_INFO;
|
||||
import static emu.grasscutter.config.Configuration.lr;
|
||||
|
||||
public class PacketPlayerLoginRsp extends BasePacket {
|
||||
|
||||
private static QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp regionCache;
|
||||
@@ -26,7 +28,7 @@ public class PacketPlayerLoginRsp extends BasePacket {
|
||||
|
||||
RegionInfo info;
|
||||
|
||||
if (SERVER.runMode == ServerRunMode.GAME_ONLY) {
|
||||
if (Grasscutter.getRunMode() == ServerRunMode.GAME_ONLY) {
|
||||
if (regionCache == null) {
|
||||
try {
|
||||
// todo: we might want to push custom config to client
|
||||
|
||||
Reference in New Issue
Block a user